diff --git a/assets/Scene/GameScene.fire b/assets/Scene/GameScene.fire index 7ae5117..8fb2254 100644 --- a/assets/Scene/GameScene.fire +++ b/assets/Scene/GameScene.fire @@ -6096,8 +6096,8 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "最高难度系数", - "_N$string": "最高难度系数", + "_string": "平均难度系数", + "_N$string": "平均难度系数", "_fontSize": 32, "_lineHeight": 32, "_enableWrapText": true, diff --git a/assets/Script/GameData.ts b/assets/Script/GameData.ts index ca34339..c3b59a2 100644 --- a/assets/Script/GameData.ts +++ b/assets/Script/GameData.ts @@ -92,7 +92,7 @@ export default class GameData extends cc.Component { gameId:'100001', userId:"", guide:true, //是否有引导 - url:"http://dev.api.sparkus.cn", + url:"https://dev.api.sparkus.cn", custom: 0, //从这开始 diff --git a/assets/Script/GameManager.ts b/assets/Script/GameManager.ts index bd90b31..199aea4 100644 --- a/assets/Script/GameManager.ts +++ b/assets/Script/GameManager.ts @@ -358,7 +358,8 @@ export default class GameManager extends cc.Component { .to(time,{x:num}) .call(() =>{ if(type == 1 || type == 5){ - this.Player.getComponent("Player").jumpPause = true; + if(type == 1) this.Player.getComponent("Player").jumpPause = true; + this.tipShow(tip,type,false); } diff --git a/assets/Script/Load.ts b/assets/Script/Load.ts index bc57de6..82df248 100644 --- a/assets/Script/Load.ts +++ b/assets/Script/Load.ts @@ -9,6 +9,7 @@ import GameData from "./GameData"; import AudioManager from "./tool/AudioManager"; import { GameTool } from "./tool/GameTool"; import { StorageMessage } from "./tool/Storage"; +import { WeChat } from "./tool/share"; const {ccclass, property} = cc._decorator; @@ -25,6 +26,7 @@ export default class NewClass extends cc.Component { start () { GameTool.Authentication(); + WeChat.setShare(location.href); } click(){ @@ -37,6 +39,8 @@ export default class NewClass extends cc.Component { } } + + openRank(){ AudioManager._instance.playMusicGame(); cc.director.loadScene("RankScene"); diff --git a/assets/Script/Player.ts b/assets/Script/Player.ts index 9977ffa..56283a4 100644 --- a/assets/Script/Player.ts +++ b/assets/Script/Player.ts @@ -362,7 +362,6 @@ export default class NewClass extends cc.Component { } xinAction(){ - // console.log("生命:",GameData._instance.GM_INFO.life); if(GameData._instance.GM_INFO.life >= 0){ let xin = this.node.getChildByName("xin"); xin.y = 120; diff --git a/assets/Script/crypto/HttpUtil.ts b/assets/Script/crypto/HttpUtil.ts index eb5b633..45e2c41 100644 --- a/assets/Script/crypto/HttpUtil.ts +++ b/assets/Script/crypto/HttpUtil.ts @@ -9,13 +9,18 @@ const {ccclass, property} = cc._decorator; @ccclass export default class HttpUtil extends cc.Component { + static async getShareInfo(shareUrl: string): Promise { + console.log("设置分享链接:",shareUrl); + const time = Math.floor((new Date().getTime()) / 1000) + const url = HttpUtil.apiSign(`/api/share/cfg?gameId=${config.gameId}&time=${time}&url=${shareUrl}`,{}) + return this.httpPost(url,null,null); + } //排行榜type2为获取,type1为上传 static async rankData(type,callback,data): Promise { - data.gameId = GameData._instance.GM_INFO.gameId; data.userId = GameData._instance.GM_INFO.userId; const time = Math.floor((new Date().getTime()) / 1000) - const url = apiSign(`/api/get/rank/data?gameId=${config.gameId}&dataType=${type}&time=${time}`, data) + const url = HttpUtil.apiSign(`/api/get/rank/data?gameId=${config.gameId}&dataType=${type}&time=${time}`, data) this.httpPost(url,data,callback); } @@ -31,14 +36,17 @@ export default class HttpUtil extends cc.Component { data.gameId = GameData._instance.GM_INFO.gameId; data.userId = GameData._instance.GM_INFO.userId; const time = Math.floor((new Date().getTime()) / 1000) - const url = apiSign(`/api/get/user/data?gameId=${config.gameId}&time=${time}`, data) + const url = HttpUtil.apiSign(`/api/get/user/data?gameId=${config.gameId}&time=${time}`, data) this.httpPost(url,data,callback); } static httpPost(url,data,callBack){ - data.gameId = GameData._instance.GM_INFO.gameId; - data.userId = GameData._instance.GM_INFO.userId; - var urlData = "http://api.sparkus.cn" + url; + if(data){ + data.gameId = GameData._instance.GM_INFO.gameId; + data.userId = GameData._instance.GM_INFO.userId; + } + + var urlData = "https://api.sparkus.cn" + url; // console.log("params:",JSON.stringify(data)); let xhr = new XMLHttpRequest(); xhr.open('POST', urlData); @@ -47,24 +55,25 @@ export default class HttpUtil extends cc.Component { if (xhr.readyState == 4 && xhr.status == 200) { var data = xhr.responseText; if(!data){ - // console.log("初始化失败"); + console.log("初始化失败"); return; } + console.log(data); var json = JSON.parse(data); - // console.log('http success:' + json); - callBack(json); + console.log('http success:' + json); + if(callBack)callBack(json); } else{ // var json = JSON.parse(data); // console.log('http fail:' + url); - callBack(json); + if(callBack)callBack(json); } }; xhr.send(JSON.stringify(data)); } static httpGet(url,callBack){ - var urlData = "http://api.sparkus.cn" + url; + var urlData = "https://api.sparkus.cn" + url; console.log(urlData); let xhr = new XMLHttpRequest(); xhr.open('GET', urlData); @@ -76,17 +85,44 @@ export default class HttpUtil extends cc.Component { if(data){ var json = JSON.parse(data); console.info('http success:' + json); - callBack(json); + if(callBack)callBack(json); } - else callBack(data); + else{ + if(callBack)callBack(json); + } + } else{ console.info('http fail:' + url); - callBack(null); + if(callBack)callBack(null);; } }; xhr.send(); } + + /** + * + * @param url {string} 接口地址 + * @param params {object} 需要加密的参数对象 + */ + static apiSign(url: string, params = {}) { + + let convertUrl = url.trim() + if (convertUrl.indexOf('?') === -1) { + convertUrl += '?' + } + + // 传入参数转换拼接字符串 + let postStr = getQueryString(params) + + const signedStr = genSignStr(convertUrl, postStr) + const encryptStr = `sign=${signedStr}` + + let encryptSignStr = fxCry.encryptByDES(encryptStr, config.secretKey) + encryptSignStr = encodeURIComponent(encryptSignStr) + + return `${urlencode(convertUrl)}&_p=${encryptSignStr}` + } } function responseHandler(response: { data: any }) { @@ -230,27 +266,5 @@ function urlencode(url: string): string { return `${baseUrl}?${params.toString()}`; } -/** - * - * @param url {string} 接口地址 - * @param params {object} 需要加密的参数对象 - */ -function apiSign(url: string, params = {}) { - let convertUrl = url.trim() - if (convertUrl.indexOf('?') === -1) { - convertUrl += '?' - } - - // 传入参数转换拼接字符串 - let postStr = getQueryString(params) - - const signedStr = genSignStr(convertUrl, postStr) - const encryptStr = `sign=${signedStr}` - - let encryptSignStr = fxCry.encryptByDES(encryptStr, config.secretKey) - encryptSignStr = encodeURIComponent(encryptSignStr) - - return `${urlencode(convertUrl)}&_p=${encryptSignStr}` -} diff --git a/assets/Script/tool/GameTool.ts b/assets/Script/tool/GameTool.ts index b592ddc..de32726 100644 --- a/assets/Script/tool/GameTool.ts +++ b/assets/Script/tool/GameTool.ts @@ -19,7 +19,7 @@ var GameTool = { let name = "user_" + GameData._instance.GM_INFO.gameId; var data = JSON.parse(localStorage.getItem(name)); if(data == "undifend" || data==null || data == ""){ - let url = "http://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback="+location.href; + let url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback="+location.href; window.location.href = url; } else{ diff --git a/assets/Script/tool/share.ts b/assets/Script/tool/share.ts new file mode 100644 index 0000000..af498c9 --- /dev/null +++ b/assets/Script/tool/share.ts @@ -0,0 +1,107 @@ + +import HttpUtil from '../crypto/HttpUtil'; +import GameData from '../GameData'; + + + + +var shareConfig = { + gameId: "100001", + shareLine: "zDLsruVI", + EK:"hui231%1" + }; + +// 定义微信配置数据的接口 +interface IWeChatConfig { + appId: string; + timestamp: number; + nonceStr: string; + signature: string; + jsApiList: []; +} + +// 微信操作类 +export class WeChat { + static setShare(url) { + var urlTemp = this.removeQueryParams(url); + shareConfig.shareLine = urlTemp; + WeChat.getSignature(url); + } + + static getResult(res){ + if(res){ + var data = res.data; + wx.config({ + debug: false, + appId: data.appId, + timestamp: data.timestamp, + nonceStr: data.nonceStr, + signature: data.signature, + jsApiList: ['onMenuShareTimeline','updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareAppMessage'] + }); + + wx.checkJsApi({ + jsApiList: ['updateAppMessageShareData'], // 需要检测的JS接口列表,所有JS接口列表见附录2, + success: function(res) { + console.log("检查api",res); + // 以键值对的形式返回,可用的api值true,不可用为false + // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} + } + + }); + + setTimeout(() => { + WeChat.changeShare(); + }, 100); + setTimeout(() => { + WeChat.changeShare(); + }, 200); + } + + } + + static changeShare(){ + wx.ready(() => { + wx.updateAppMessageShareData({ + title: '手眼协调练习', // 分享标题 + desc: '脑雾导致你的手眼协调变慢和估测不准吗?', // 分享描述 + link: shareConfig.shareLine, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 + imgUrl: 'https://static.sparkus.cn/public/flyup.jpg', // 分享图标 + success: function () { + // 设置成功 + console.log("分享好友成功回调"); + } + }); + wx.updateTimelineShareData({ + title: '手眼协调练习', // 分享标题 + link: shareConfig.shareLine, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 + imgUrl: 'https://static.sparkus.cn/public/flyup.jpg', // 分享图标 + success: function () { + // 设置成功 + console.log("分享朋友圈成功回调"); + } + }) + }); + } + + static getSignature(url: string): Promise { + return new Promise((resolve) => { + WeChat.getShareInfo((encodeURIComponent(url)),WeChat.getResult); + }); + } + static async getShareInfo(shareUrl: string, callback:Function): Promise { + const time = Math.floor((new Date().getTime()) / 1000) + const url = HttpUtil.apiSign(`/api/share/cfg?gameId=${GameData._instance.GM_INFO.gameId}&time=${time}&url=${shareUrl}`,{}) + return HttpUtil.httpGet(url,callback) + } + + + static containsNanana(str) { + return /test/i.test(str); + } + + static removeQueryParams(url) { + return url.replace(/\?.*$/, ''); + } + +} diff --git a/assets/Script/tool/share.ts.meta b/assets/Script/tool/share.ts.meta new file mode 100644 index 0000000..32eba88 --- /dev/null +++ b/assets/Script/tool/share.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "850e9d92-5c95-43da-b719-e418ab0dcf5b", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/build-templates/web-mobile/index.html b/build-templates/web-mobile/index.html index 748da0e..b3f7f2e 100644 --- a/build-templates/web-mobile/index.html +++ b/build-templates/web-mobile/index.html @@ -43,6 +43,8 @@ + + +Browserstack-logo-white + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/字体精简工具/node_modules/psl/data/rules.json b/packages/字体精简工具/node_modules/psl/data/rules.json new file mode 100644 index 0000000..e19abdc --- /dev/null +++ b/packages/字体精简工具/node_modules/psl/data/rules.json @@ -0,0 +1,8834 @@ +[ +"ac", +"com.ac", +"edu.ac", +"gov.ac", +"net.ac", +"mil.ac", +"org.ac", +"ad", +"nom.ad", +"ae", +"co.ae", +"net.ae", +"org.ae", +"sch.ae", +"ac.ae", +"gov.ae", +"mil.ae", +"aero", +"accident-investigation.aero", +"accident-prevention.aero", +"aerobatic.aero", +"aeroclub.aero", +"aerodrome.aero", +"agents.aero", +"aircraft.aero", +"airline.aero", +"airport.aero", +"air-surveillance.aero", +"airtraffic.aero", +"air-traffic-control.aero", +"ambulance.aero", +"amusement.aero", +"association.aero", +"author.aero", +"ballooning.aero", +"broker.aero", +"caa.aero", +"cargo.aero", +"catering.aero", +"certification.aero", +"championship.aero", +"charter.aero", +"civilaviation.aero", +"club.aero", +"conference.aero", +"consultant.aero", +"consulting.aero", +"control.aero", +"council.aero", +"crew.aero", +"design.aero", +"dgca.aero", +"educator.aero", +"emergency.aero", +"engine.aero", +"engineer.aero", +"entertainment.aero", +"equipment.aero", +"exchange.aero", +"express.aero", +"federation.aero", +"flight.aero", +"freight.aero", +"fuel.aero", +"gliding.aero", +"government.aero", +"groundhandling.aero", +"group.aero", +"hanggliding.aero", +"homebuilt.aero", +"insurance.aero", +"journal.aero", +"journalist.aero", +"leasing.aero", +"logistics.aero", +"magazine.aero", +"maintenance.aero", +"media.aero", +"microlight.aero", +"modelling.aero", +"navigation.aero", +"parachuting.aero", +"paragliding.aero", +"passenger-association.aero", +"pilot.aero", +"press.aero", +"production.aero", +"recreation.aero", +"repbody.aero", +"res.aero", +"research.aero", +"rotorcraft.aero", +"safety.aero", +"scientist.aero", +"services.aero", +"show.aero", +"skydiving.aero", +"software.aero", +"student.aero", +"trader.aero", +"trading.aero", +"trainer.aero", +"union.aero", +"workinggroup.aero", +"works.aero", +"af", +"gov.af", +"com.af", +"org.af", +"net.af", +"edu.af", +"ag", +"com.ag", +"org.ag", +"net.ag", +"co.ag", +"nom.ag", +"ai", +"off.ai", +"com.ai", +"net.ai", +"org.ai", +"al", +"com.al", +"edu.al", +"gov.al", +"mil.al", +"net.al", +"org.al", +"am", +"co.am", +"com.am", +"commune.am", +"net.am", +"org.am", +"ao", +"ed.ao", +"gv.ao", +"og.ao", +"co.ao", +"pb.ao", +"it.ao", +"aq", +"ar", +"com.ar", +"edu.ar", +"gob.ar", +"gov.ar", +"int.ar", +"mil.ar", +"musica.ar", +"net.ar", +"org.ar", +"tur.ar", +"arpa", +"e164.arpa", +"in-addr.arpa", +"ip6.arpa", +"iris.arpa", +"uri.arpa", +"urn.arpa", +"as", +"gov.as", +"asia", +"at", +"ac.at", +"co.at", +"gv.at", +"or.at", +"au", +"com.au", +"net.au", +"org.au", +"edu.au", +"gov.au", +"asn.au", +"id.au", +"info.au", +"conf.au", +"oz.au", +"act.au", +"nsw.au", +"nt.au", +"qld.au", +"sa.au", +"tas.au", +"vic.au", +"wa.au", +"act.edu.au", +"catholic.edu.au", +"nsw.edu.au", +"nt.edu.au", +"qld.edu.au", +"sa.edu.au", +"tas.edu.au", +"vic.edu.au", +"wa.edu.au", +"qld.gov.au", +"sa.gov.au", +"tas.gov.au", +"vic.gov.au", +"wa.gov.au", +"education.tas.edu.au", +"schools.nsw.edu.au", +"aw", +"com.aw", +"ax", +"az", +"com.az", +"net.az", +"int.az", +"gov.az", +"org.az", +"edu.az", +"info.az", +"pp.az", +"mil.az", +"name.az", +"pro.az", +"biz.az", +"ba", +"com.ba", +"edu.ba", +"gov.ba", +"mil.ba", +"net.ba", +"org.ba", +"bb", +"biz.bb", +"co.bb", +"com.bb", +"edu.bb", +"gov.bb", +"info.bb", +"net.bb", +"org.bb", +"store.bb", +"tv.bb", +"*.bd", +"be", +"ac.be", +"bf", +"gov.bf", +"bg", +"a.bg", +"b.bg", +"c.bg", +"d.bg", +"e.bg", +"f.bg", +"g.bg", +"h.bg", +"i.bg", +"j.bg", +"k.bg", +"l.bg", +"m.bg", +"n.bg", +"o.bg", +"p.bg", +"q.bg", +"r.bg", +"s.bg", +"t.bg", +"u.bg", +"v.bg", +"w.bg", +"x.bg", +"y.bg", +"z.bg", +"0.bg", +"1.bg", +"2.bg", +"3.bg", +"4.bg", +"5.bg", +"6.bg", +"7.bg", +"8.bg", +"9.bg", +"bh", +"com.bh", +"edu.bh", +"net.bh", +"org.bh", +"gov.bh", +"bi", +"co.bi", +"com.bi", +"edu.bi", +"or.bi", +"org.bi", +"biz", +"bj", +"asso.bj", +"barreau.bj", +"gouv.bj", +"bm", +"com.bm", +"edu.bm", +"gov.bm", +"net.bm", +"org.bm", +"bn", +"com.bn", +"edu.bn", +"gov.bn", +"net.bn", +"org.bn", +"bo", +"com.bo", +"edu.bo", +"gob.bo", +"int.bo", +"org.bo", +"net.bo", +"mil.bo", +"tv.bo", +"web.bo", +"academia.bo", +"agro.bo", +"arte.bo", +"blog.bo", +"bolivia.bo", +"ciencia.bo", +"cooperativa.bo", +"democracia.bo", +"deporte.bo", +"ecologia.bo", +"economia.bo", +"empresa.bo", +"indigena.bo", +"industria.bo", +"info.bo", +"medicina.bo", +"movimiento.bo", +"musica.bo", +"natural.bo", +"nombre.bo", +"noticias.bo", +"patria.bo", +"politica.bo", +"profesional.bo", +"plurinacional.bo", +"pueblo.bo", +"revista.bo", +"salud.bo", +"tecnologia.bo", +"tksat.bo", +"transporte.bo", +"wiki.bo", +"br", +"9guacu.br", +"abc.br", +"adm.br", +"adv.br", +"agr.br", +"aju.br", +"am.br", +"anani.br", +"aparecida.br", +"arq.br", +"art.br", +"ato.br", +"b.br", +"barueri.br", +"belem.br", +"bhz.br", +"bio.br", +"blog.br", +"bmd.br", +"boavista.br", +"bsb.br", +"campinagrande.br", +"campinas.br", +"caxias.br", +"cim.br", +"cng.br", +"cnt.br", +"com.br", +"contagem.br", +"coop.br", +"cri.br", +"cuiaba.br", +"curitiba.br", +"def.br", +"ecn.br", +"eco.br", +"edu.br", +"emp.br", +"eng.br", +"esp.br", +"etc.br", +"eti.br", +"far.br", +"feira.br", +"flog.br", +"floripa.br", +"fm.br", +"fnd.br", +"fortal.br", +"fot.br", +"foz.br", +"fst.br", +"g12.br", +"ggf.br", +"goiania.br", +"gov.br", +"ac.gov.br", +"al.gov.br", +"am.gov.br", +"ap.gov.br", +"ba.gov.br", +"ce.gov.br", +"df.gov.br", +"es.gov.br", +"go.gov.br", +"ma.gov.br", +"mg.gov.br", +"ms.gov.br", +"mt.gov.br", +"pa.gov.br", +"pb.gov.br", +"pe.gov.br", +"pi.gov.br", +"pr.gov.br", +"rj.gov.br", +"rn.gov.br", +"ro.gov.br", +"rr.gov.br", +"rs.gov.br", +"sc.gov.br", +"se.gov.br", +"sp.gov.br", +"to.gov.br", +"gru.br", +"imb.br", +"ind.br", +"inf.br", +"jab.br", +"jampa.br", +"jdf.br", +"joinville.br", +"jor.br", +"jus.br", +"leg.br", +"lel.br", +"londrina.br", +"macapa.br", +"maceio.br", +"manaus.br", +"maringa.br", +"mat.br", +"med.br", +"mil.br", +"morena.br", +"mp.br", +"mus.br", +"natal.br", +"net.br", +"niteroi.br", +"*.nom.br", +"not.br", +"ntr.br", +"odo.br", +"ong.br", +"org.br", +"osasco.br", +"palmas.br", +"poa.br", +"ppg.br", +"pro.br", +"psc.br", +"psi.br", +"pvh.br", +"qsl.br", +"radio.br", +"rec.br", +"recife.br", +"ribeirao.br", +"rio.br", +"riobranco.br", +"riopreto.br", +"salvador.br", +"sampa.br", +"santamaria.br", +"santoandre.br", +"saobernardo.br", +"saogonca.br", +"sjc.br", +"slg.br", +"slz.br", +"sorocaba.br", +"srv.br", +"taxi.br", +"tc.br", +"teo.br", +"the.br", +"tmp.br", +"trd.br", +"tur.br", +"tv.br", +"udi.br", +"vet.br", +"vix.br", +"vlog.br", +"wiki.br", +"zlg.br", +"bs", +"com.bs", +"net.bs", +"org.bs", +"edu.bs", +"gov.bs", +"bt", +"com.bt", +"edu.bt", +"gov.bt", +"net.bt", +"org.bt", +"bv", +"bw", +"co.bw", +"org.bw", +"by", +"gov.by", +"mil.by", +"com.by", +"of.by", +"bz", +"com.bz", +"net.bz", +"org.bz", +"edu.bz", +"gov.bz", +"ca", +"ab.ca", +"bc.ca", +"mb.ca", +"nb.ca", +"nf.ca", +"nl.ca", +"ns.ca", +"nt.ca", +"nu.ca", +"on.ca", +"pe.ca", +"qc.ca", +"sk.ca", +"yk.ca", +"gc.ca", +"cat", +"cc", +"cd", +"gov.cd", +"cf", +"cg", +"ch", +"ci", +"org.ci", +"or.ci", +"com.ci", +"co.ci", +"edu.ci", +"ed.ci", +"ac.ci", +"net.ci", +"go.ci", +"asso.ci", +"aéroport.ci", +"int.ci", +"presse.ci", +"md.ci", +"gouv.ci", +"*.ck", +"!www.ck", +"cl", +"aprendemas.cl", +"co.cl", +"gob.cl", +"gov.cl", +"mil.cl", +"cm", +"co.cm", +"com.cm", +"gov.cm", +"net.cm", +"cn", +"ac.cn", +"com.cn", +"edu.cn", +"gov.cn", +"net.cn", +"org.cn", +"mil.cn", +"公司.cn", +"网络.cn", +"網絡.cn", +"ah.cn", +"bj.cn", +"cq.cn", +"fj.cn", +"gd.cn", +"gs.cn", +"gz.cn", +"gx.cn", +"ha.cn", +"hb.cn", +"he.cn", +"hi.cn", +"hl.cn", +"hn.cn", +"jl.cn", +"js.cn", +"jx.cn", +"ln.cn", +"nm.cn", +"nx.cn", +"qh.cn", +"sc.cn", +"sd.cn", +"sh.cn", +"sn.cn", +"sx.cn", +"tj.cn", +"xj.cn", +"xz.cn", +"yn.cn", +"zj.cn", +"hk.cn", +"mo.cn", +"tw.cn", +"co", +"arts.co", +"com.co", +"edu.co", +"firm.co", +"gov.co", +"info.co", +"int.co", +"mil.co", +"net.co", +"nom.co", +"org.co", +"rec.co", +"web.co", +"com", +"coop", +"cr", +"ac.cr", +"co.cr", +"ed.cr", +"fi.cr", +"go.cr", +"or.cr", +"sa.cr", +"cu", +"com.cu", +"edu.cu", +"org.cu", +"net.cu", +"gov.cu", +"inf.cu", +"cv", +"cw", +"com.cw", +"edu.cw", +"net.cw", +"org.cw", +"cx", +"gov.cx", +"cy", +"ac.cy", +"biz.cy", +"com.cy", +"ekloges.cy", +"gov.cy", +"ltd.cy", +"name.cy", +"net.cy", +"org.cy", +"parliament.cy", +"press.cy", +"pro.cy", +"tm.cy", +"cz", +"de", +"dj", +"dk", +"dm", +"com.dm", +"net.dm", +"org.dm", +"edu.dm", +"gov.dm", +"do", +"art.do", +"com.do", +"edu.do", +"gob.do", +"gov.do", +"mil.do", +"net.do", +"org.do", +"sld.do", +"web.do", +"dz", +"com.dz", +"org.dz", +"net.dz", +"gov.dz", +"edu.dz", +"asso.dz", +"pol.dz", +"art.dz", +"ec", +"com.ec", +"info.ec", +"net.ec", +"fin.ec", +"k12.ec", +"med.ec", +"pro.ec", +"org.ec", +"edu.ec", +"gov.ec", +"gob.ec", +"mil.ec", +"edu", +"ee", +"edu.ee", +"gov.ee", +"riik.ee", +"lib.ee", +"med.ee", +"com.ee", +"pri.ee", +"aip.ee", +"org.ee", +"fie.ee", +"eg", +"com.eg", +"edu.eg", +"eun.eg", +"gov.eg", +"mil.eg", +"name.eg", +"net.eg", +"org.eg", +"sci.eg", +"*.er", +"es", +"com.es", +"nom.es", +"org.es", +"gob.es", +"edu.es", +"et", +"com.et", +"gov.et", +"org.et", +"edu.et", +"biz.et", +"name.et", +"info.et", +"net.et", +"eu", +"fi", +"aland.fi", +"fj", +"ac.fj", +"biz.fj", +"com.fj", +"gov.fj", +"info.fj", +"mil.fj", +"name.fj", +"net.fj", +"org.fj", +"pro.fj", +"*.fk", +"fm", +"fo", +"fr", +"asso.fr", +"com.fr", +"gouv.fr", +"nom.fr", +"prd.fr", +"tm.fr", +"aeroport.fr", +"avocat.fr", +"avoues.fr", +"cci.fr", +"chambagri.fr", +"chirurgiens-dentistes.fr", +"experts-comptables.fr", +"geometre-expert.fr", +"greta.fr", +"huissier-justice.fr", +"medecin.fr", +"notaires.fr", +"pharmacien.fr", +"port.fr", +"veterinaire.fr", +"ga", +"gb", +"gd", +"ge", +"com.ge", +"edu.ge", +"gov.ge", +"org.ge", +"mil.ge", +"net.ge", +"pvt.ge", +"gf", +"gg", +"co.gg", +"net.gg", +"org.gg", +"gh", +"com.gh", +"edu.gh", +"gov.gh", +"org.gh", +"mil.gh", +"gi", +"com.gi", +"ltd.gi", +"gov.gi", +"mod.gi", +"edu.gi", +"org.gi", +"gl", +"co.gl", +"com.gl", +"edu.gl", +"net.gl", +"org.gl", +"gm", +"gn", +"ac.gn", +"com.gn", +"edu.gn", +"gov.gn", +"org.gn", +"net.gn", +"gov", +"gp", +"com.gp", +"net.gp", +"mobi.gp", +"edu.gp", +"org.gp", +"asso.gp", +"gq", +"gr", +"com.gr", +"edu.gr", +"net.gr", +"org.gr", +"gov.gr", +"gs", +"gt", +"com.gt", +"edu.gt", +"gob.gt", +"ind.gt", +"mil.gt", +"net.gt", +"org.gt", +"gu", +"com.gu", +"edu.gu", +"gov.gu", +"guam.gu", +"info.gu", +"net.gu", +"org.gu", +"web.gu", +"gw", +"gy", +"co.gy", +"com.gy", +"edu.gy", +"gov.gy", +"net.gy", +"org.gy", +"hk", +"com.hk", +"edu.hk", +"gov.hk", +"idv.hk", +"net.hk", +"org.hk", +"公司.hk", +"教育.hk", +"敎育.hk", +"政府.hk", +"個人.hk", +"个人.hk", +"箇人.hk", +"網络.hk", +"网络.hk", +"组織.hk", +"網絡.hk", +"网絡.hk", +"组织.hk", +"組織.hk", +"組织.hk", +"hm", +"hn", +"com.hn", +"edu.hn", +"org.hn", +"net.hn", +"mil.hn", +"gob.hn", +"hr", +"iz.hr", +"from.hr", +"name.hr", +"com.hr", +"ht", +"com.ht", +"shop.ht", +"firm.ht", +"info.ht", +"adult.ht", +"net.ht", +"pro.ht", +"org.ht", +"med.ht", +"art.ht", +"coop.ht", +"pol.ht", +"asso.ht", +"edu.ht", +"rel.ht", +"gouv.ht", +"perso.ht", +"hu", +"co.hu", +"info.hu", +"org.hu", +"priv.hu", +"sport.hu", +"tm.hu", +"2000.hu", +"agrar.hu", +"bolt.hu", +"casino.hu", +"city.hu", +"erotica.hu", +"erotika.hu", +"film.hu", +"forum.hu", +"games.hu", +"hotel.hu", +"ingatlan.hu", +"jogasz.hu", +"konyvelo.hu", +"lakas.hu", +"media.hu", +"news.hu", +"reklam.hu", +"sex.hu", +"shop.hu", +"suli.hu", +"szex.hu", +"tozsde.hu", +"utazas.hu", +"video.hu", +"id", +"ac.id", +"biz.id", +"co.id", +"desa.id", +"go.id", +"mil.id", +"my.id", +"net.id", +"or.id", +"ponpes.id", +"sch.id", +"web.id", +"ie", +"gov.ie", +"il", +"ac.il", +"co.il", +"gov.il", +"idf.il", +"k12.il", +"muni.il", +"net.il", +"org.il", +"im", +"ac.im", +"co.im", +"com.im", +"ltd.co.im", +"net.im", +"org.im", +"plc.co.im", +"tt.im", +"tv.im", +"in", +"co.in", +"firm.in", +"net.in", +"org.in", +"gen.in", +"ind.in", +"nic.in", +"ac.in", +"edu.in", +"res.in", +"gov.in", +"mil.in", +"info", +"int", +"eu.int", +"io", +"com.io", +"iq", +"gov.iq", +"edu.iq", +"mil.iq", +"com.iq", +"org.iq", +"net.iq", +"ir", +"ac.ir", +"co.ir", +"gov.ir", +"id.ir", +"net.ir", +"org.ir", +"sch.ir", +"ایران.ir", +"ايران.ir", +"is", +"net.is", +"com.is", +"edu.is", +"gov.is", +"org.is", +"int.is", +"it", +"gov.it", +"edu.it", +"abr.it", +"abruzzo.it", +"aosta-valley.it", +"aostavalley.it", +"bas.it", +"basilicata.it", +"cal.it", +"calabria.it", +"cam.it", +"campania.it", +"emilia-romagna.it", +"emiliaromagna.it", +"emr.it", +"friuli-v-giulia.it", +"friuli-ve-giulia.it", +"friuli-vegiulia.it", +"friuli-venezia-giulia.it", +"friuli-veneziagiulia.it", +"friuli-vgiulia.it", +"friuliv-giulia.it", +"friulive-giulia.it", +"friulivegiulia.it", +"friulivenezia-giulia.it", +"friuliveneziagiulia.it", +"friulivgiulia.it", +"fvg.it", +"laz.it", +"lazio.it", +"lig.it", +"liguria.it", +"lom.it", +"lombardia.it", +"lombardy.it", +"lucania.it", +"mar.it", +"marche.it", +"mol.it", +"molise.it", +"piedmont.it", +"piemonte.it", +"pmn.it", +"pug.it", +"puglia.it", +"sar.it", +"sardegna.it", +"sardinia.it", +"sic.it", +"sicilia.it", +"sicily.it", +"taa.it", +"tos.it", +"toscana.it", +"trentin-sud-tirol.it", +"trentin-süd-tirol.it", +"trentin-sudtirol.it", +"trentin-südtirol.it", +"trentin-sued-tirol.it", +"trentin-suedtirol.it", +"trentino-a-adige.it", +"trentino-aadige.it", +"trentino-alto-adige.it", +"trentino-altoadige.it", +"trentino-s-tirol.it", +"trentino-stirol.it", +"trentino-sud-tirol.it", +"trentino-süd-tirol.it", +"trentino-sudtirol.it", +"trentino-südtirol.it", +"trentino-sued-tirol.it", +"trentino-suedtirol.it", +"trentino.it", +"trentinoa-adige.it", +"trentinoaadige.it", +"trentinoalto-adige.it", +"trentinoaltoadige.it", +"trentinos-tirol.it", +"trentinostirol.it", +"trentinosud-tirol.it", +"trentinosüd-tirol.it", +"trentinosudtirol.it", +"trentinosüdtirol.it", +"trentinosued-tirol.it", +"trentinosuedtirol.it", +"trentinsud-tirol.it", +"trentinsüd-tirol.it", +"trentinsudtirol.it", +"trentinsüdtirol.it", +"trentinsued-tirol.it", +"trentinsuedtirol.it", +"tuscany.it", +"umb.it", +"umbria.it", +"val-d-aosta.it", +"val-daosta.it", +"vald-aosta.it", +"valdaosta.it", +"valle-aosta.it", +"valle-d-aosta.it", +"valle-daosta.it", +"valleaosta.it", +"valled-aosta.it", +"valledaosta.it", +"vallee-aoste.it", +"vallée-aoste.it", +"vallee-d-aoste.it", +"vallée-d-aoste.it", +"valleeaoste.it", +"valléeaoste.it", +"valleedaoste.it", +"valléedaoste.it", +"vao.it", +"vda.it", +"ven.it", +"veneto.it", +"ag.it", +"agrigento.it", +"al.it", +"alessandria.it", +"alto-adige.it", +"altoadige.it", +"an.it", +"ancona.it", +"andria-barletta-trani.it", +"andria-trani-barletta.it", +"andriabarlettatrani.it", +"andriatranibarletta.it", +"ao.it", +"aosta.it", +"aoste.it", +"ap.it", +"aq.it", +"aquila.it", +"ar.it", +"arezzo.it", +"ascoli-piceno.it", +"ascolipiceno.it", +"asti.it", +"at.it", +"av.it", +"avellino.it", +"ba.it", +"balsan-sudtirol.it", +"balsan-südtirol.it", +"balsan-suedtirol.it", +"balsan.it", +"bari.it", +"barletta-trani-andria.it", +"barlettatraniandria.it", +"belluno.it", +"benevento.it", +"bergamo.it", +"bg.it", +"bi.it", +"biella.it", +"bl.it", +"bn.it", +"bo.it", +"bologna.it", +"bolzano-altoadige.it", +"bolzano.it", +"bozen-sudtirol.it", +"bozen-südtirol.it", +"bozen-suedtirol.it", +"bozen.it", +"br.it", +"brescia.it", +"brindisi.it", +"bs.it", +"bt.it", +"bulsan-sudtirol.it", +"bulsan-südtirol.it", +"bulsan-suedtirol.it", +"bulsan.it", +"bz.it", +"ca.it", +"cagliari.it", +"caltanissetta.it", +"campidano-medio.it", +"campidanomedio.it", +"campobasso.it", +"carbonia-iglesias.it", +"carboniaiglesias.it", +"carrara-massa.it", +"carraramassa.it", +"caserta.it", +"catania.it", +"catanzaro.it", +"cb.it", +"ce.it", +"cesena-forli.it", +"cesena-forlì.it", +"cesenaforli.it", +"cesenaforlì.it", +"ch.it", +"chieti.it", +"ci.it", +"cl.it", +"cn.it", +"co.it", +"como.it", +"cosenza.it", +"cr.it", +"cremona.it", +"crotone.it", +"cs.it", +"ct.it", +"cuneo.it", +"cz.it", +"dell-ogliastra.it", +"dellogliastra.it", +"en.it", +"enna.it", +"fc.it", +"fe.it", +"fermo.it", +"ferrara.it", +"fg.it", +"fi.it", +"firenze.it", +"florence.it", +"fm.it", +"foggia.it", +"forli-cesena.it", +"forlì-cesena.it", +"forlicesena.it", +"forlìcesena.it", +"fr.it", +"frosinone.it", +"ge.it", +"genoa.it", +"genova.it", +"go.it", +"gorizia.it", +"gr.it", +"grosseto.it", +"iglesias-carbonia.it", +"iglesiascarbonia.it", +"im.it", +"imperia.it", +"is.it", +"isernia.it", +"kr.it", +"la-spezia.it", +"laquila.it", +"laspezia.it", +"latina.it", +"lc.it", +"le.it", +"lecce.it", +"lecco.it", +"li.it", +"livorno.it", +"lo.it", +"lodi.it", +"lt.it", +"lu.it", +"lucca.it", +"macerata.it", +"mantova.it", +"massa-carrara.it", +"massacarrara.it", +"matera.it", +"mb.it", +"mc.it", +"me.it", +"medio-campidano.it", +"mediocampidano.it", +"messina.it", +"mi.it", +"milan.it", +"milano.it", +"mn.it", +"mo.it", +"modena.it", +"monza-brianza.it", +"monza-e-della-brianza.it", +"monza.it", +"monzabrianza.it", +"monzaebrianza.it", +"monzaedellabrianza.it", +"ms.it", +"mt.it", +"na.it", +"naples.it", +"napoli.it", +"no.it", +"novara.it", +"nu.it", +"nuoro.it", +"og.it", +"ogliastra.it", +"olbia-tempio.it", +"olbiatempio.it", +"or.it", +"oristano.it", +"ot.it", +"pa.it", +"padova.it", +"padua.it", +"palermo.it", +"parma.it", +"pavia.it", +"pc.it", +"pd.it", +"pe.it", +"perugia.it", +"pesaro-urbino.it", +"pesarourbino.it", +"pescara.it", +"pg.it", +"pi.it", +"piacenza.it", +"pisa.it", +"pistoia.it", +"pn.it", +"po.it", +"pordenone.it", +"potenza.it", +"pr.it", +"prato.it", +"pt.it", +"pu.it", +"pv.it", +"pz.it", +"ra.it", +"ragusa.it", +"ravenna.it", +"rc.it", +"re.it", +"reggio-calabria.it", +"reggio-emilia.it", +"reggiocalabria.it", +"reggioemilia.it", +"rg.it", +"ri.it", +"rieti.it", +"rimini.it", +"rm.it", +"rn.it", +"ro.it", +"roma.it", +"rome.it", +"rovigo.it", +"sa.it", +"salerno.it", +"sassari.it", +"savona.it", +"si.it", +"siena.it", +"siracusa.it", +"so.it", +"sondrio.it", +"sp.it", +"sr.it", +"ss.it", +"suedtirol.it", +"südtirol.it", +"sv.it", +"ta.it", +"taranto.it", +"te.it", +"tempio-olbia.it", +"tempioolbia.it", +"teramo.it", +"terni.it", +"tn.it", +"to.it", +"torino.it", +"tp.it", +"tr.it", +"trani-andria-barletta.it", +"trani-barletta-andria.it", +"traniandriabarletta.it", +"tranibarlettaandria.it", +"trapani.it", +"trento.it", +"treviso.it", +"trieste.it", +"ts.it", +"turin.it", +"tv.it", +"ud.it", +"udine.it", +"urbino-pesaro.it", +"urbinopesaro.it", +"va.it", +"varese.it", +"vb.it", +"vc.it", +"ve.it", +"venezia.it", +"venice.it", +"verbania.it", +"vercelli.it", +"verona.it", +"vi.it", +"vibo-valentia.it", +"vibovalentia.it", +"vicenza.it", +"viterbo.it", +"vr.it", +"vs.it", +"vt.it", +"vv.it", +"je", +"co.je", +"net.je", +"org.je", +"*.jm", +"jo", +"com.jo", +"org.jo", +"net.jo", +"edu.jo", +"sch.jo", +"gov.jo", +"mil.jo", +"name.jo", +"jobs", +"jp", +"ac.jp", +"ad.jp", +"co.jp", +"ed.jp", +"go.jp", +"gr.jp", +"lg.jp", +"ne.jp", +"or.jp", +"aichi.jp", +"akita.jp", +"aomori.jp", +"chiba.jp", +"ehime.jp", +"fukui.jp", +"fukuoka.jp", +"fukushima.jp", +"gifu.jp", +"gunma.jp", +"hiroshima.jp", +"hokkaido.jp", +"hyogo.jp", +"ibaraki.jp", +"ishikawa.jp", +"iwate.jp", +"kagawa.jp", +"kagoshima.jp", +"kanagawa.jp", +"kochi.jp", +"kumamoto.jp", +"kyoto.jp", +"mie.jp", +"miyagi.jp", +"miyazaki.jp", +"nagano.jp", +"nagasaki.jp", +"nara.jp", +"niigata.jp", +"oita.jp", +"okayama.jp", +"okinawa.jp", +"osaka.jp", +"saga.jp", +"saitama.jp", +"shiga.jp", +"shimane.jp", +"shizuoka.jp", +"tochigi.jp", +"tokushima.jp", +"tokyo.jp", +"tottori.jp", +"toyama.jp", +"wakayama.jp", +"yamagata.jp", +"yamaguchi.jp", +"yamanashi.jp", +"栃木.jp", +"愛知.jp", +"愛媛.jp", +"兵庫.jp", +"熊本.jp", +"茨城.jp", +"北海道.jp", +"千葉.jp", +"和歌山.jp", +"長崎.jp", +"長野.jp", +"新潟.jp", +"青森.jp", +"静岡.jp", +"東京.jp", +"石川.jp", +"埼玉.jp", +"三重.jp", +"京都.jp", +"佐賀.jp", +"大分.jp", +"大阪.jp", +"奈良.jp", +"宮城.jp", +"宮崎.jp", +"富山.jp", +"山口.jp", +"山形.jp", +"山梨.jp", +"岩手.jp", +"岐阜.jp", +"岡山.jp", +"島根.jp", +"広島.jp", +"徳島.jp", +"沖縄.jp", +"滋賀.jp", +"神奈川.jp", +"福井.jp", +"福岡.jp", +"福島.jp", +"秋田.jp", +"群馬.jp", +"香川.jp", +"高知.jp", +"鳥取.jp", +"鹿児島.jp", +"*.kawasaki.jp", +"*.kitakyushu.jp", +"*.kobe.jp", +"*.nagoya.jp", +"*.sapporo.jp", +"*.sendai.jp", +"*.yokohama.jp", +"!city.kawasaki.jp", +"!city.kitakyushu.jp", +"!city.kobe.jp", +"!city.nagoya.jp", +"!city.sapporo.jp", +"!city.sendai.jp", +"!city.yokohama.jp", +"aisai.aichi.jp", +"ama.aichi.jp", +"anjo.aichi.jp", +"asuke.aichi.jp", +"chiryu.aichi.jp", +"chita.aichi.jp", +"fuso.aichi.jp", +"gamagori.aichi.jp", +"handa.aichi.jp", +"hazu.aichi.jp", +"hekinan.aichi.jp", +"higashiura.aichi.jp", +"ichinomiya.aichi.jp", +"inazawa.aichi.jp", +"inuyama.aichi.jp", +"isshiki.aichi.jp", +"iwakura.aichi.jp", +"kanie.aichi.jp", +"kariya.aichi.jp", +"kasugai.aichi.jp", +"kira.aichi.jp", +"kiyosu.aichi.jp", +"komaki.aichi.jp", +"konan.aichi.jp", +"kota.aichi.jp", +"mihama.aichi.jp", +"miyoshi.aichi.jp", +"nishio.aichi.jp", +"nisshin.aichi.jp", +"obu.aichi.jp", +"oguchi.aichi.jp", +"oharu.aichi.jp", +"okazaki.aichi.jp", +"owariasahi.aichi.jp", +"seto.aichi.jp", +"shikatsu.aichi.jp", +"shinshiro.aichi.jp", +"shitara.aichi.jp", +"tahara.aichi.jp", +"takahama.aichi.jp", +"tobishima.aichi.jp", +"toei.aichi.jp", +"togo.aichi.jp", +"tokai.aichi.jp", +"tokoname.aichi.jp", +"toyoake.aichi.jp", +"toyohashi.aichi.jp", +"toyokawa.aichi.jp", +"toyone.aichi.jp", +"toyota.aichi.jp", +"tsushima.aichi.jp", +"yatomi.aichi.jp", +"akita.akita.jp", +"daisen.akita.jp", +"fujisato.akita.jp", +"gojome.akita.jp", +"hachirogata.akita.jp", +"happou.akita.jp", +"higashinaruse.akita.jp", +"honjo.akita.jp", +"honjyo.akita.jp", +"ikawa.akita.jp", +"kamikoani.akita.jp", +"kamioka.akita.jp", +"katagami.akita.jp", +"kazuno.akita.jp", +"kitaakita.akita.jp", +"kosaka.akita.jp", +"kyowa.akita.jp", +"misato.akita.jp", +"mitane.akita.jp", +"moriyoshi.akita.jp", +"nikaho.akita.jp", +"noshiro.akita.jp", +"odate.akita.jp", +"oga.akita.jp", +"ogata.akita.jp", +"semboku.akita.jp", +"yokote.akita.jp", +"yurihonjo.akita.jp", +"aomori.aomori.jp", +"gonohe.aomori.jp", +"hachinohe.aomori.jp", +"hashikami.aomori.jp", +"hiranai.aomori.jp", +"hirosaki.aomori.jp", +"itayanagi.aomori.jp", +"kuroishi.aomori.jp", +"misawa.aomori.jp", +"mutsu.aomori.jp", +"nakadomari.aomori.jp", +"noheji.aomori.jp", +"oirase.aomori.jp", +"owani.aomori.jp", +"rokunohe.aomori.jp", +"sannohe.aomori.jp", +"shichinohe.aomori.jp", +"shingo.aomori.jp", +"takko.aomori.jp", +"towada.aomori.jp", +"tsugaru.aomori.jp", +"tsuruta.aomori.jp", +"abiko.chiba.jp", +"asahi.chiba.jp", +"chonan.chiba.jp", +"chosei.chiba.jp", +"choshi.chiba.jp", +"chuo.chiba.jp", +"funabashi.chiba.jp", +"futtsu.chiba.jp", +"hanamigawa.chiba.jp", +"ichihara.chiba.jp", +"ichikawa.chiba.jp", +"ichinomiya.chiba.jp", +"inzai.chiba.jp", +"isumi.chiba.jp", +"kamagaya.chiba.jp", +"kamogawa.chiba.jp", +"kashiwa.chiba.jp", +"katori.chiba.jp", +"katsuura.chiba.jp", +"kimitsu.chiba.jp", +"kisarazu.chiba.jp", +"kozaki.chiba.jp", +"kujukuri.chiba.jp", +"kyonan.chiba.jp", +"matsudo.chiba.jp", +"midori.chiba.jp", +"mihama.chiba.jp", +"minamiboso.chiba.jp", +"mobara.chiba.jp", +"mutsuzawa.chiba.jp", +"nagara.chiba.jp", +"nagareyama.chiba.jp", +"narashino.chiba.jp", +"narita.chiba.jp", +"noda.chiba.jp", +"oamishirasato.chiba.jp", +"omigawa.chiba.jp", +"onjuku.chiba.jp", +"otaki.chiba.jp", +"sakae.chiba.jp", +"sakura.chiba.jp", +"shimofusa.chiba.jp", +"shirako.chiba.jp", +"shiroi.chiba.jp", +"shisui.chiba.jp", +"sodegaura.chiba.jp", +"sosa.chiba.jp", +"tako.chiba.jp", +"tateyama.chiba.jp", +"togane.chiba.jp", +"tohnosho.chiba.jp", +"tomisato.chiba.jp", +"urayasu.chiba.jp", +"yachimata.chiba.jp", +"yachiyo.chiba.jp", +"yokaichiba.chiba.jp", +"yokoshibahikari.chiba.jp", +"yotsukaido.chiba.jp", +"ainan.ehime.jp", +"honai.ehime.jp", +"ikata.ehime.jp", +"imabari.ehime.jp", +"iyo.ehime.jp", +"kamijima.ehime.jp", +"kihoku.ehime.jp", +"kumakogen.ehime.jp", +"masaki.ehime.jp", +"matsuno.ehime.jp", +"matsuyama.ehime.jp", +"namikata.ehime.jp", +"niihama.ehime.jp", +"ozu.ehime.jp", +"saijo.ehime.jp", +"seiyo.ehime.jp", +"shikokuchuo.ehime.jp", +"tobe.ehime.jp", +"toon.ehime.jp", +"uchiko.ehime.jp", +"uwajima.ehime.jp", +"yawatahama.ehime.jp", +"echizen.fukui.jp", +"eiheiji.fukui.jp", +"fukui.fukui.jp", +"ikeda.fukui.jp", +"katsuyama.fukui.jp", +"mihama.fukui.jp", +"minamiechizen.fukui.jp", +"obama.fukui.jp", +"ohi.fukui.jp", +"ono.fukui.jp", +"sabae.fukui.jp", +"sakai.fukui.jp", +"takahama.fukui.jp", +"tsuruga.fukui.jp", +"wakasa.fukui.jp", +"ashiya.fukuoka.jp", +"buzen.fukuoka.jp", +"chikugo.fukuoka.jp", +"chikuho.fukuoka.jp", +"chikujo.fukuoka.jp", +"chikushino.fukuoka.jp", +"chikuzen.fukuoka.jp", +"chuo.fukuoka.jp", +"dazaifu.fukuoka.jp", +"fukuchi.fukuoka.jp", +"hakata.fukuoka.jp", +"higashi.fukuoka.jp", +"hirokawa.fukuoka.jp", +"hisayama.fukuoka.jp", +"iizuka.fukuoka.jp", +"inatsuki.fukuoka.jp", +"kaho.fukuoka.jp", +"kasuga.fukuoka.jp", +"kasuya.fukuoka.jp", +"kawara.fukuoka.jp", +"keisen.fukuoka.jp", +"koga.fukuoka.jp", +"kurate.fukuoka.jp", +"kurogi.fukuoka.jp", +"kurume.fukuoka.jp", +"minami.fukuoka.jp", +"miyako.fukuoka.jp", +"miyama.fukuoka.jp", +"miyawaka.fukuoka.jp", +"mizumaki.fukuoka.jp", +"munakata.fukuoka.jp", +"nakagawa.fukuoka.jp", +"nakama.fukuoka.jp", +"nishi.fukuoka.jp", +"nogata.fukuoka.jp", +"ogori.fukuoka.jp", +"okagaki.fukuoka.jp", +"okawa.fukuoka.jp", +"oki.fukuoka.jp", +"omuta.fukuoka.jp", +"onga.fukuoka.jp", +"onojo.fukuoka.jp", +"oto.fukuoka.jp", +"saigawa.fukuoka.jp", +"sasaguri.fukuoka.jp", +"shingu.fukuoka.jp", +"shinyoshitomi.fukuoka.jp", +"shonai.fukuoka.jp", +"soeda.fukuoka.jp", +"sue.fukuoka.jp", +"tachiarai.fukuoka.jp", +"tagawa.fukuoka.jp", +"takata.fukuoka.jp", +"toho.fukuoka.jp", +"toyotsu.fukuoka.jp", +"tsuiki.fukuoka.jp", +"ukiha.fukuoka.jp", +"umi.fukuoka.jp", +"usui.fukuoka.jp", +"yamada.fukuoka.jp", +"yame.fukuoka.jp", +"yanagawa.fukuoka.jp", +"yukuhashi.fukuoka.jp", +"aizubange.fukushima.jp", +"aizumisato.fukushima.jp", +"aizuwakamatsu.fukushima.jp", +"asakawa.fukushima.jp", +"bandai.fukushima.jp", +"date.fukushima.jp", +"fukushima.fukushima.jp", +"furudono.fukushima.jp", +"futaba.fukushima.jp", +"hanawa.fukushima.jp", +"higashi.fukushima.jp", +"hirata.fukushima.jp", +"hirono.fukushima.jp", +"iitate.fukushima.jp", +"inawashiro.fukushima.jp", +"ishikawa.fukushima.jp", +"iwaki.fukushima.jp", +"izumizaki.fukushima.jp", +"kagamiishi.fukushima.jp", +"kaneyama.fukushima.jp", +"kawamata.fukushima.jp", +"kitakata.fukushima.jp", +"kitashiobara.fukushima.jp", +"koori.fukushima.jp", +"koriyama.fukushima.jp", +"kunimi.fukushima.jp", +"miharu.fukushima.jp", +"mishima.fukushima.jp", +"namie.fukushima.jp", +"nango.fukushima.jp", +"nishiaizu.fukushima.jp", +"nishigo.fukushima.jp", +"okuma.fukushima.jp", +"omotego.fukushima.jp", +"ono.fukushima.jp", +"otama.fukushima.jp", +"samegawa.fukushima.jp", +"shimogo.fukushima.jp", +"shirakawa.fukushima.jp", +"showa.fukushima.jp", +"soma.fukushima.jp", +"sukagawa.fukushima.jp", +"taishin.fukushima.jp", +"tamakawa.fukushima.jp", +"tanagura.fukushima.jp", +"tenei.fukushima.jp", +"yabuki.fukushima.jp", +"yamato.fukushima.jp", +"yamatsuri.fukushima.jp", +"yanaizu.fukushima.jp", +"yugawa.fukushima.jp", +"anpachi.gifu.jp", +"ena.gifu.jp", +"gifu.gifu.jp", +"ginan.gifu.jp", +"godo.gifu.jp", +"gujo.gifu.jp", +"hashima.gifu.jp", +"hichiso.gifu.jp", +"hida.gifu.jp", +"higashishirakawa.gifu.jp", +"ibigawa.gifu.jp", +"ikeda.gifu.jp", +"kakamigahara.gifu.jp", +"kani.gifu.jp", +"kasahara.gifu.jp", +"kasamatsu.gifu.jp", +"kawaue.gifu.jp", +"kitagata.gifu.jp", +"mino.gifu.jp", +"minokamo.gifu.jp", +"mitake.gifu.jp", +"mizunami.gifu.jp", +"motosu.gifu.jp", +"nakatsugawa.gifu.jp", +"ogaki.gifu.jp", +"sakahogi.gifu.jp", +"seki.gifu.jp", +"sekigahara.gifu.jp", +"shirakawa.gifu.jp", +"tajimi.gifu.jp", +"takayama.gifu.jp", +"tarui.gifu.jp", +"toki.gifu.jp", +"tomika.gifu.jp", +"wanouchi.gifu.jp", +"yamagata.gifu.jp", +"yaotsu.gifu.jp", +"yoro.gifu.jp", +"annaka.gunma.jp", +"chiyoda.gunma.jp", +"fujioka.gunma.jp", +"higashiagatsuma.gunma.jp", +"isesaki.gunma.jp", +"itakura.gunma.jp", +"kanna.gunma.jp", +"kanra.gunma.jp", +"katashina.gunma.jp", +"kawaba.gunma.jp", +"kiryu.gunma.jp", +"kusatsu.gunma.jp", +"maebashi.gunma.jp", +"meiwa.gunma.jp", +"midori.gunma.jp", +"minakami.gunma.jp", +"naganohara.gunma.jp", +"nakanojo.gunma.jp", +"nanmoku.gunma.jp", +"numata.gunma.jp", +"oizumi.gunma.jp", +"ora.gunma.jp", +"ota.gunma.jp", +"shibukawa.gunma.jp", +"shimonita.gunma.jp", +"shinto.gunma.jp", +"showa.gunma.jp", +"takasaki.gunma.jp", +"takayama.gunma.jp", +"tamamura.gunma.jp", +"tatebayashi.gunma.jp", +"tomioka.gunma.jp", +"tsukiyono.gunma.jp", +"tsumagoi.gunma.jp", +"ueno.gunma.jp", +"yoshioka.gunma.jp", +"asaminami.hiroshima.jp", +"daiwa.hiroshima.jp", +"etajima.hiroshima.jp", +"fuchu.hiroshima.jp", +"fukuyama.hiroshima.jp", +"hatsukaichi.hiroshima.jp", +"higashihiroshima.hiroshima.jp", +"hongo.hiroshima.jp", +"jinsekikogen.hiroshima.jp", +"kaita.hiroshima.jp", +"kui.hiroshima.jp", +"kumano.hiroshima.jp", +"kure.hiroshima.jp", +"mihara.hiroshima.jp", +"miyoshi.hiroshima.jp", +"naka.hiroshima.jp", +"onomichi.hiroshima.jp", +"osakikamijima.hiroshima.jp", +"otake.hiroshima.jp", +"saka.hiroshima.jp", +"sera.hiroshima.jp", +"seranishi.hiroshima.jp", +"shinichi.hiroshima.jp", +"shobara.hiroshima.jp", +"takehara.hiroshima.jp", +"abashiri.hokkaido.jp", +"abira.hokkaido.jp", +"aibetsu.hokkaido.jp", +"akabira.hokkaido.jp", +"akkeshi.hokkaido.jp", +"asahikawa.hokkaido.jp", +"ashibetsu.hokkaido.jp", +"ashoro.hokkaido.jp", +"assabu.hokkaido.jp", +"atsuma.hokkaido.jp", +"bibai.hokkaido.jp", +"biei.hokkaido.jp", +"bifuka.hokkaido.jp", +"bihoro.hokkaido.jp", +"biratori.hokkaido.jp", +"chippubetsu.hokkaido.jp", +"chitose.hokkaido.jp", +"date.hokkaido.jp", +"ebetsu.hokkaido.jp", +"embetsu.hokkaido.jp", +"eniwa.hokkaido.jp", +"erimo.hokkaido.jp", +"esan.hokkaido.jp", +"esashi.hokkaido.jp", +"fukagawa.hokkaido.jp", +"fukushima.hokkaido.jp", +"furano.hokkaido.jp", +"furubira.hokkaido.jp", +"haboro.hokkaido.jp", +"hakodate.hokkaido.jp", +"hamatonbetsu.hokkaido.jp", +"hidaka.hokkaido.jp", +"higashikagura.hokkaido.jp", +"higashikawa.hokkaido.jp", +"hiroo.hokkaido.jp", +"hokuryu.hokkaido.jp", +"hokuto.hokkaido.jp", +"honbetsu.hokkaido.jp", +"horokanai.hokkaido.jp", +"horonobe.hokkaido.jp", +"ikeda.hokkaido.jp", +"imakane.hokkaido.jp", +"ishikari.hokkaido.jp", +"iwamizawa.hokkaido.jp", +"iwanai.hokkaido.jp", +"kamifurano.hokkaido.jp", +"kamikawa.hokkaido.jp", +"kamishihoro.hokkaido.jp", +"kamisunagawa.hokkaido.jp", +"kamoenai.hokkaido.jp", +"kayabe.hokkaido.jp", +"kembuchi.hokkaido.jp", +"kikonai.hokkaido.jp", +"kimobetsu.hokkaido.jp", +"kitahiroshima.hokkaido.jp", +"kitami.hokkaido.jp", +"kiyosato.hokkaido.jp", +"koshimizu.hokkaido.jp", +"kunneppu.hokkaido.jp", +"kuriyama.hokkaido.jp", +"kuromatsunai.hokkaido.jp", +"kushiro.hokkaido.jp", +"kutchan.hokkaido.jp", +"kyowa.hokkaido.jp", +"mashike.hokkaido.jp", +"matsumae.hokkaido.jp", +"mikasa.hokkaido.jp", +"minamifurano.hokkaido.jp", +"mombetsu.hokkaido.jp", +"moseushi.hokkaido.jp", +"mukawa.hokkaido.jp", +"muroran.hokkaido.jp", +"naie.hokkaido.jp", +"nakagawa.hokkaido.jp", +"nakasatsunai.hokkaido.jp", +"nakatombetsu.hokkaido.jp", +"nanae.hokkaido.jp", +"nanporo.hokkaido.jp", +"nayoro.hokkaido.jp", +"nemuro.hokkaido.jp", +"niikappu.hokkaido.jp", +"niki.hokkaido.jp", +"nishiokoppe.hokkaido.jp", +"noboribetsu.hokkaido.jp", +"numata.hokkaido.jp", +"obihiro.hokkaido.jp", +"obira.hokkaido.jp", +"oketo.hokkaido.jp", +"okoppe.hokkaido.jp", +"otaru.hokkaido.jp", +"otobe.hokkaido.jp", +"otofuke.hokkaido.jp", +"otoineppu.hokkaido.jp", +"oumu.hokkaido.jp", +"ozora.hokkaido.jp", +"pippu.hokkaido.jp", +"rankoshi.hokkaido.jp", +"rebun.hokkaido.jp", +"rikubetsu.hokkaido.jp", +"rishiri.hokkaido.jp", +"rishirifuji.hokkaido.jp", +"saroma.hokkaido.jp", +"sarufutsu.hokkaido.jp", +"shakotan.hokkaido.jp", +"shari.hokkaido.jp", +"shibecha.hokkaido.jp", +"shibetsu.hokkaido.jp", +"shikabe.hokkaido.jp", +"shikaoi.hokkaido.jp", +"shimamaki.hokkaido.jp", +"shimizu.hokkaido.jp", +"shimokawa.hokkaido.jp", +"shinshinotsu.hokkaido.jp", +"shintoku.hokkaido.jp", +"shiranuka.hokkaido.jp", +"shiraoi.hokkaido.jp", +"shiriuchi.hokkaido.jp", +"sobetsu.hokkaido.jp", +"sunagawa.hokkaido.jp", +"taiki.hokkaido.jp", +"takasu.hokkaido.jp", +"takikawa.hokkaido.jp", +"takinoue.hokkaido.jp", +"teshikaga.hokkaido.jp", +"tobetsu.hokkaido.jp", +"tohma.hokkaido.jp", +"tomakomai.hokkaido.jp", +"tomari.hokkaido.jp", +"toya.hokkaido.jp", +"toyako.hokkaido.jp", +"toyotomi.hokkaido.jp", +"toyoura.hokkaido.jp", +"tsubetsu.hokkaido.jp", +"tsukigata.hokkaido.jp", +"urakawa.hokkaido.jp", +"urausu.hokkaido.jp", +"uryu.hokkaido.jp", +"utashinai.hokkaido.jp", +"wakkanai.hokkaido.jp", +"wassamu.hokkaido.jp", +"yakumo.hokkaido.jp", +"yoichi.hokkaido.jp", +"aioi.hyogo.jp", +"akashi.hyogo.jp", +"ako.hyogo.jp", +"amagasaki.hyogo.jp", +"aogaki.hyogo.jp", +"asago.hyogo.jp", +"ashiya.hyogo.jp", +"awaji.hyogo.jp", +"fukusaki.hyogo.jp", +"goshiki.hyogo.jp", +"harima.hyogo.jp", +"himeji.hyogo.jp", +"ichikawa.hyogo.jp", +"inagawa.hyogo.jp", +"itami.hyogo.jp", +"kakogawa.hyogo.jp", +"kamigori.hyogo.jp", +"kamikawa.hyogo.jp", +"kasai.hyogo.jp", +"kasuga.hyogo.jp", +"kawanishi.hyogo.jp", +"miki.hyogo.jp", +"minamiawaji.hyogo.jp", +"nishinomiya.hyogo.jp", +"nishiwaki.hyogo.jp", +"ono.hyogo.jp", +"sanda.hyogo.jp", +"sannan.hyogo.jp", +"sasayama.hyogo.jp", +"sayo.hyogo.jp", +"shingu.hyogo.jp", +"shinonsen.hyogo.jp", +"shiso.hyogo.jp", +"sumoto.hyogo.jp", +"taishi.hyogo.jp", +"taka.hyogo.jp", +"takarazuka.hyogo.jp", +"takasago.hyogo.jp", +"takino.hyogo.jp", +"tamba.hyogo.jp", +"tatsuno.hyogo.jp", +"toyooka.hyogo.jp", +"yabu.hyogo.jp", +"yashiro.hyogo.jp", +"yoka.hyogo.jp", +"yokawa.hyogo.jp", +"ami.ibaraki.jp", +"asahi.ibaraki.jp", +"bando.ibaraki.jp", +"chikusei.ibaraki.jp", +"daigo.ibaraki.jp", +"fujishiro.ibaraki.jp", +"hitachi.ibaraki.jp", +"hitachinaka.ibaraki.jp", +"hitachiomiya.ibaraki.jp", +"hitachiota.ibaraki.jp", +"ibaraki.ibaraki.jp", +"ina.ibaraki.jp", +"inashiki.ibaraki.jp", +"itako.ibaraki.jp", +"iwama.ibaraki.jp", +"joso.ibaraki.jp", +"kamisu.ibaraki.jp", +"kasama.ibaraki.jp", +"kashima.ibaraki.jp", +"kasumigaura.ibaraki.jp", +"koga.ibaraki.jp", +"miho.ibaraki.jp", +"mito.ibaraki.jp", +"moriya.ibaraki.jp", +"naka.ibaraki.jp", +"namegata.ibaraki.jp", +"oarai.ibaraki.jp", +"ogawa.ibaraki.jp", +"omitama.ibaraki.jp", +"ryugasaki.ibaraki.jp", +"sakai.ibaraki.jp", +"sakuragawa.ibaraki.jp", +"shimodate.ibaraki.jp", +"shimotsuma.ibaraki.jp", +"shirosato.ibaraki.jp", +"sowa.ibaraki.jp", +"suifu.ibaraki.jp", +"takahagi.ibaraki.jp", +"tamatsukuri.ibaraki.jp", +"tokai.ibaraki.jp", +"tomobe.ibaraki.jp", +"tone.ibaraki.jp", +"toride.ibaraki.jp", +"tsuchiura.ibaraki.jp", +"tsukuba.ibaraki.jp", +"uchihara.ibaraki.jp", +"ushiku.ibaraki.jp", +"yachiyo.ibaraki.jp", +"yamagata.ibaraki.jp", +"yawara.ibaraki.jp", +"yuki.ibaraki.jp", +"anamizu.ishikawa.jp", +"hakui.ishikawa.jp", +"hakusan.ishikawa.jp", +"kaga.ishikawa.jp", +"kahoku.ishikawa.jp", +"kanazawa.ishikawa.jp", +"kawakita.ishikawa.jp", +"komatsu.ishikawa.jp", +"nakanoto.ishikawa.jp", +"nanao.ishikawa.jp", +"nomi.ishikawa.jp", +"nonoichi.ishikawa.jp", +"noto.ishikawa.jp", +"shika.ishikawa.jp", +"suzu.ishikawa.jp", +"tsubata.ishikawa.jp", +"tsurugi.ishikawa.jp", +"uchinada.ishikawa.jp", +"wajima.ishikawa.jp", +"fudai.iwate.jp", +"fujisawa.iwate.jp", +"hanamaki.iwate.jp", +"hiraizumi.iwate.jp", +"hirono.iwate.jp", +"ichinohe.iwate.jp", +"ichinoseki.iwate.jp", +"iwaizumi.iwate.jp", +"iwate.iwate.jp", +"joboji.iwate.jp", +"kamaishi.iwate.jp", +"kanegasaki.iwate.jp", +"karumai.iwate.jp", +"kawai.iwate.jp", +"kitakami.iwate.jp", +"kuji.iwate.jp", +"kunohe.iwate.jp", +"kuzumaki.iwate.jp", +"miyako.iwate.jp", +"mizusawa.iwate.jp", +"morioka.iwate.jp", +"ninohe.iwate.jp", +"noda.iwate.jp", +"ofunato.iwate.jp", +"oshu.iwate.jp", +"otsuchi.iwate.jp", +"rikuzentakata.iwate.jp", +"shiwa.iwate.jp", +"shizukuishi.iwate.jp", +"sumita.iwate.jp", +"tanohata.iwate.jp", +"tono.iwate.jp", +"yahaba.iwate.jp", +"yamada.iwate.jp", +"ayagawa.kagawa.jp", +"higashikagawa.kagawa.jp", +"kanonji.kagawa.jp", +"kotohira.kagawa.jp", +"manno.kagawa.jp", +"marugame.kagawa.jp", +"mitoyo.kagawa.jp", +"naoshima.kagawa.jp", +"sanuki.kagawa.jp", +"tadotsu.kagawa.jp", +"takamatsu.kagawa.jp", +"tonosho.kagawa.jp", +"uchinomi.kagawa.jp", +"utazu.kagawa.jp", +"zentsuji.kagawa.jp", +"akune.kagoshima.jp", +"amami.kagoshima.jp", +"hioki.kagoshima.jp", +"isa.kagoshima.jp", +"isen.kagoshima.jp", +"izumi.kagoshima.jp", +"kagoshima.kagoshima.jp", +"kanoya.kagoshima.jp", +"kawanabe.kagoshima.jp", +"kinko.kagoshima.jp", +"kouyama.kagoshima.jp", +"makurazaki.kagoshima.jp", +"matsumoto.kagoshima.jp", +"minamitane.kagoshima.jp", +"nakatane.kagoshima.jp", +"nishinoomote.kagoshima.jp", +"satsumasendai.kagoshima.jp", +"soo.kagoshima.jp", +"tarumizu.kagoshima.jp", +"yusui.kagoshima.jp", +"aikawa.kanagawa.jp", +"atsugi.kanagawa.jp", +"ayase.kanagawa.jp", +"chigasaki.kanagawa.jp", +"ebina.kanagawa.jp", +"fujisawa.kanagawa.jp", +"hadano.kanagawa.jp", +"hakone.kanagawa.jp", +"hiratsuka.kanagawa.jp", +"isehara.kanagawa.jp", +"kaisei.kanagawa.jp", +"kamakura.kanagawa.jp", +"kiyokawa.kanagawa.jp", +"matsuda.kanagawa.jp", +"minamiashigara.kanagawa.jp", +"miura.kanagawa.jp", +"nakai.kanagawa.jp", +"ninomiya.kanagawa.jp", +"odawara.kanagawa.jp", +"oi.kanagawa.jp", +"oiso.kanagawa.jp", +"sagamihara.kanagawa.jp", +"samukawa.kanagawa.jp", +"tsukui.kanagawa.jp", +"yamakita.kanagawa.jp", +"yamato.kanagawa.jp", +"yokosuka.kanagawa.jp", +"yugawara.kanagawa.jp", +"zama.kanagawa.jp", +"zushi.kanagawa.jp", +"aki.kochi.jp", +"geisei.kochi.jp", +"hidaka.kochi.jp", +"higashitsuno.kochi.jp", +"ino.kochi.jp", +"kagami.kochi.jp", +"kami.kochi.jp", +"kitagawa.kochi.jp", +"kochi.kochi.jp", +"mihara.kochi.jp", +"motoyama.kochi.jp", +"muroto.kochi.jp", +"nahari.kochi.jp", +"nakamura.kochi.jp", +"nankoku.kochi.jp", +"nishitosa.kochi.jp", +"niyodogawa.kochi.jp", +"ochi.kochi.jp", +"okawa.kochi.jp", +"otoyo.kochi.jp", +"otsuki.kochi.jp", +"sakawa.kochi.jp", +"sukumo.kochi.jp", +"susaki.kochi.jp", +"tosa.kochi.jp", +"tosashimizu.kochi.jp", +"toyo.kochi.jp", +"tsuno.kochi.jp", +"umaji.kochi.jp", +"yasuda.kochi.jp", +"yusuhara.kochi.jp", +"amakusa.kumamoto.jp", +"arao.kumamoto.jp", +"aso.kumamoto.jp", +"choyo.kumamoto.jp", +"gyokuto.kumamoto.jp", +"kamiamakusa.kumamoto.jp", +"kikuchi.kumamoto.jp", +"kumamoto.kumamoto.jp", +"mashiki.kumamoto.jp", +"mifune.kumamoto.jp", +"minamata.kumamoto.jp", +"minamioguni.kumamoto.jp", +"nagasu.kumamoto.jp", +"nishihara.kumamoto.jp", +"oguni.kumamoto.jp", +"ozu.kumamoto.jp", +"sumoto.kumamoto.jp", +"takamori.kumamoto.jp", +"uki.kumamoto.jp", +"uto.kumamoto.jp", +"yamaga.kumamoto.jp", +"yamato.kumamoto.jp", +"yatsushiro.kumamoto.jp", +"ayabe.kyoto.jp", +"fukuchiyama.kyoto.jp", +"higashiyama.kyoto.jp", +"ide.kyoto.jp", +"ine.kyoto.jp", +"joyo.kyoto.jp", +"kameoka.kyoto.jp", +"kamo.kyoto.jp", +"kita.kyoto.jp", +"kizu.kyoto.jp", +"kumiyama.kyoto.jp", +"kyotamba.kyoto.jp", +"kyotanabe.kyoto.jp", +"kyotango.kyoto.jp", +"maizuru.kyoto.jp", +"minami.kyoto.jp", +"minamiyamashiro.kyoto.jp", +"miyazu.kyoto.jp", +"muko.kyoto.jp", +"nagaokakyo.kyoto.jp", +"nakagyo.kyoto.jp", +"nantan.kyoto.jp", +"oyamazaki.kyoto.jp", +"sakyo.kyoto.jp", +"seika.kyoto.jp", +"tanabe.kyoto.jp", +"uji.kyoto.jp", +"ujitawara.kyoto.jp", +"wazuka.kyoto.jp", +"yamashina.kyoto.jp", +"yawata.kyoto.jp", +"asahi.mie.jp", +"inabe.mie.jp", +"ise.mie.jp", +"kameyama.mie.jp", +"kawagoe.mie.jp", +"kiho.mie.jp", +"kisosaki.mie.jp", +"kiwa.mie.jp", +"komono.mie.jp", +"kumano.mie.jp", +"kuwana.mie.jp", +"matsusaka.mie.jp", +"meiwa.mie.jp", +"mihama.mie.jp", +"minamiise.mie.jp", +"misugi.mie.jp", +"miyama.mie.jp", +"nabari.mie.jp", +"shima.mie.jp", +"suzuka.mie.jp", +"tado.mie.jp", +"taiki.mie.jp", +"taki.mie.jp", +"tamaki.mie.jp", +"toba.mie.jp", +"tsu.mie.jp", +"udono.mie.jp", +"ureshino.mie.jp", +"watarai.mie.jp", +"yokkaichi.mie.jp", +"furukawa.miyagi.jp", +"higashimatsushima.miyagi.jp", +"ishinomaki.miyagi.jp", +"iwanuma.miyagi.jp", +"kakuda.miyagi.jp", +"kami.miyagi.jp", +"kawasaki.miyagi.jp", +"marumori.miyagi.jp", +"matsushima.miyagi.jp", +"minamisanriku.miyagi.jp", +"misato.miyagi.jp", +"murata.miyagi.jp", +"natori.miyagi.jp", +"ogawara.miyagi.jp", +"ohira.miyagi.jp", +"onagawa.miyagi.jp", +"osaki.miyagi.jp", +"rifu.miyagi.jp", +"semine.miyagi.jp", +"shibata.miyagi.jp", +"shichikashuku.miyagi.jp", +"shikama.miyagi.jp", +"shiogama.miyagi.jp", +"shiroishi.miyagi.jp", +"tagajo.miyagi.jp", +"taiwa.miyagi.jp", +"tome.miyagi.jp", +"tomiya.miyagi.jp", +"wakuya.miyagi.jp", +"watari.miyagi.jp", +"yamamoto.miyagi.jp", +"zao.miyagi.jp", +"aya.miyazaki.jp", +"ebino.miyazaki.jp", +"gokase.miyazaki.jp", +"hyuga.miyazaki.jp", +"kadogawa.miyazaki.jp", +"kawaminami.miyazaki.jp", +"kijo.miyazaki.jp", +"kitagawa.miyazaki.jp", +"kitakata.miyazaki.jp", +"kitaura.miyazaki.jp", +"kobayashi.miyazaki.jp", +"kunitomi.miyazaki.jp", +"kushima.miyazaki.jp", +"mimata.miyazaki.jp", +"miyakonojo.miyazaki.jp", +"miyazaki.miyazaki.jp", +"morotsuka.miyazaki.jp", +"nichinan.miyazaki.jp", +"nishimera.miyazaki.jp", +"nobeoka.miyazaki.jp", +"saito.miyazaki.jp", +"shiiba.miyazaki.jp", +"shintomi.miyazaki.jp", +"takaharu.miyazaki.jp", +"takanabe.miyazaki.jp", +"takazaki.miyazaki.jp", +"tsuno.miyazaki.jp", +"achi.nagano.jp", +"agematsu.nagano.jp", +"anan.nagano.jp", +"aoki.nagano.jp", +"asahi.nagano.jp", +"azumino.nagano.jp", +"chikuhoku.nagano.jp", +"chikuma.nagano.jp", +"chino.nagano.jp", +"fujimi.nagano.jp", +"hakuba.nagano.jp", +"hara.nagano.jp", +"hiraya.nagano.jp", +"iida.nagano.jp", +"iijima.nagano.jp", +"iiyama.nagano.jp", +"iizuna.nagano.jp", +"ikeda.nagano.jp", +"ikusaka.nagano.jp", +"ina.nagano.jp", +"karuizawa.nagano.jp", +"kawakami.nagano.jp", +"kiso.nagano.jp", +"kisofukushima.nagano.jp", +"kitaaiki.nagano.jp", +"komagane.nagano.jp", +"komoro.nagano.jp", +"matsukawa.nagano.jp", +"matsumoto.nagano.jp", +"miasa.nagano.jp", +"minamiaiki.nagano.jp", +"minamimaki.nagano.jp", +"minamiminowa.nagano.jp", +"minowa.nagano.jp", +"miyada.nagano.jp", +"miyota.nagano.jp", +"mochizuki.nagano.jp", +"nagano.nagano.jp", +"nagawa.nagano.jp", +"nagiso.nagano.jp", +"nakagawa.nagano.jp", +"nakano.nagano.jp", +"nozawaonsen.nagano.jp", +"obuse.nagano.jp", +"ogawa.nagano.jp", +"okaya.nagano.jp", +"omachi.nagano.jp", +"omi.nagano.jp", +"ookuwa.nagano.jp", +"ooshika.nagano.jp", +"otaki.nagano.jp", +"otari.nagano.jp", +"sakae.nagano.jp", +"sakaki.nagano.jp", +"saku.nagano.jp", +"sakuho.nagano.jp", +"shimosuwa.nagano.jp", +"shinanomachi.nagano.jp", +"shiojiri.nagano.jp", +"suwa.nagano.jp", +"suzaka.nagano.jp", +"takagi.nagano.jp", +"takamori.nagano.jp", +"takayama.nagano.jp", +"tateshina.nagano.jp", +"tatsuno.nagano.jp", +"togakushi.nagano.jp", +"togura.nagano.jp", +"tomi.nagano.jp", +"ueda.nagano.jp", +"wada.nagano.jp", +"yamagata.nagano.jp", +"yamanouchi.nagano.jp", +"yasaka.nagano.jp", +"yasuoka.nagano.jp", +"chijiwa.nagasaki.jp", +"futsu.nagasaki.jp", +"goto.nagasaki.jp", +"hasami.nagasaki.jp", +"hirado.nagasaki.jp", +"iki.nagasaki.jp", +"isahaya.nagasaki.jp", +"kawatana.nagasaki.jp", +"kuchinotsu.nagasaki.jp", +"matsuura.nagasaki.jp", +"nagasaki.nagasaki.jp", +"obama.nagasaki.jp", +"omura.nagasaki.jp", +"oseto.nagasaki.jp", +"saikai.nagasaki.jp", +"sasebo.nagasaki.jp", +"seihi.nagasaki.jp", +"shimabara.nagasaki.jp", +"shinkamigoto.nagasaki.jp", +"togitsu.nagasaki.jp", +"tsushima.nagasaki.jp", +"unzen.nagasaki.jp", +"ando.nara.jp", +"gose.nara.jp", +"heguri.nara.jp", +"higashiyoshino.nara.jp", +"ikaruga.nara.jp", +"ikoma.nara.jp", +"kamikitayama.nara.jp", +"kanmaki.nara.jp", +"kashiba.nara.jp", +"kashihara.nara.jp", +"katsuragi.nara.jp", +"kawai.nara.jp", +"kawakami.nara.jp", +"kawanishi.nara.jp", +"koryo.nara.jp", +"kurotaki.nara.jp", +"mitsue.nara.jp", +"miyake.nara.jp", +"nara.nara.jp", +"nosegawa.nara.jp", +"oji.nara.jp", +"ouda.nara.jp", +"oyodo.nara.jp", +"sakurai.nara.jp", +"sango.nara.jp", +"shimoichi.nara.jp", +"shimokitayama.nara.jp", +"shinjo.nara.jp", +"soni.nara.jp", +"takatori.nara.jp", +"tawaramoto.nara.jp", +"tenkawa.nara.jp", +"tenri.nara.jp", +"uda.nara.jp", +"yamatokoriyama.nara.jp", +"yamatotakada.nara.jp", +"yamazoe.nara.jp", +"yoshino.nara.jp", +"aga.niigata.jp", +"agano.niigata.jp", +"gosen.niigata.jp", +"itoigawa.niigata.jp", +"izumozaki.niigata.jp", +"joetsu.niigata.jp", +"kamo.niigata.jp", +"kariwa.niigata.jp", +"kashiwazaki.niigata.jp", +"minamiuonuma.niigata.jp", +"mitsuke.niigata.jp", +"muika.niigata.jp", +"murakami.niigata.jp", +"myoko.niigata.jp", +"nagaoka.niigata.jp", +"niigata.niigata.jp", +"ojiya.niigata.jp", +"omi.niigata.jp", +"sado.niigata.jp", +"sanjo.niigata.jp", +"seiro.niigata.jp", +"seirou.niigata.jp", +"sekikawa.niigata.jp", +"shibata.niigata.jp", +"tagami.niigata.jp", +"tainai.niigata.jp", +"tochio.niigata.jp", +"tokamachi.niigata.jp", +"tsubame.niigata.jp", +"tsunan.niigata.jp", +"uonuma.niigata.jp", +"yahiko.niigata.jp", +"yoita.niigata.jp", +"yuzawa.niigata.jp", +"beppu.oita.jp", +"bungoono.oita.jp", +"bungotakada.oita.jp", +"hasama.oita.jp", +"hiji.oita.jp", +"himeshima.oita.jp", +"hita.oita.jp", +"kamitsue.oita.jp", +"kokonoe.oita.jp", +"kuju.oita.jp", +"kunisaki.oita.jp", +"kusu.oita.jp", +"oita.oita.jp", +"saiki.oita.jp", +"taketa.oita.jp", +"tsukumi.oita.jp", +"usa.oita.jp", +"usuki.oita.jp", +"yufu.oita.jp", +"akaiwa.okayama.jp", +"asakuchi.okayama.jp", +"bizen.okayama.jp", +"hayashima.okayama.jp", +"ibara.okayama.jp", +"kagamino.okayama.jp", +"kasaoka.okayama.jp", +"kibichuo.okayama.jp", +"kumenan.okayama.jp", +"kurashiki.okayama.jp", +"maniwa.okayama.jp", +"misaki.okayama.jp", +"nagi.okayama.jp", +"niimi.okayama.jp", +"nishiawakura.okayama.jp", +"okayama.okayama.jp", +"satosho.okayama.jp", +"setouchi.okayama.jp", +"shinjo.okayama.jp", +"shoo.okayama.jp", +"soja.okayama.jp", +"takahashi.okayama.jp", +"tamano.okayama.jp", +"tsuyama.okayama.jp", +"wake.okayama.jp", +"yakage.okayama.jp", +"aguni.okinawa.jp", +"ginowan.okinawa.jp", +"ginoza.okinawa.jp", +"gushikami.okinawa.jp", +"haebaru.okinawa.jp", +"higashi.okinawa.jp", +"hirara.okinawa.jp", +"iheya.okinawa.jp", +"ishigaki.okinawa.jp", +"ishikawa.okinawa.jp", +"itoman.okinawa.jp", +"izena.okinawa.jp", +"kadena.okinawa.jp", +"kin.okinawa.jp", +"kitadaito.okinawa.jp", +"kitanakagusuku.okinawa.jp", +"kumejima.okinawa.jp", +"kunigami.okinawa.jp", +"minamidaito.okinawa.jp", +"motobu.okinawa.jp", +"nago.okinawa.jp", +"naha.okinawa.jp", +"nakagusuku.okinawa.jp", +"nakijin.okinawa.jp", +"nanjo.okinawa.jp", +"nishihara.okinawa.jp", +"ogimi.okinawa.jp", +"okinawa.okinawa.jp", +"onna.okinawa.jp", +"shimoji.okinawa.jp", +"taketomi.okinawa.jp", +"tarama.okinawa.jp", +"tokashiki.okinawa.jp", +"tomigusuku.okinawa.jp", +"tonaki.okinawa.jp", +"urasoe.okinawa.jp", +"uruma.okinawa.jp", +"yaese.okinawa.jp", +"yomitan.okinawa.jp", +"yonabaru.okinawa.jp", +"yonaguni.okinawa.jp", +"zamami.okinawa.jp", +"abeno.osaka.jp", +"chihayaakasaka.osaka.jp", +"chuo.osaka.jp", +"daito.osaka.jp", +"fujiidera.osaka.jp", +"habikino.osaka.jp", +"hannan.osaka.jp", +"higashiosaka.osaka.jp", +"higashisumiyoshi.osaka.jp", +"higashiyodogawa.osaka.jp", +"hirakata.osaka.jp", +"ibaraki.osaka.jp", +"ikeda.osaka.jp", +"izumi.osaka.jp", +"izumiotsu.osaka.jp", +"izumisano.osaka.jp", +"kadoma.osaka.jp", +"kaizuka.osaka.jp", +"kanan.osaka.jp", +"kashiwara.osaka.jp", +"katano.osaka.jp", +"kawachinagano.osaka.jp", +"kishiwada.osaka.jp", +"kita.osaka.jp", +"kumatori.osaka.jp", +"matsubara.osaka.jp", +"minato.osaka.jp", +"minoh.osaka.jp", +"misaki.osaka.jp", +"moriguchi.osaka.jp", +"neyagawa.osaka.jp", +"nishi.osaka.jp", +"nose.osaka.jp", +"osakasayama.osaka.jp", +"sakai.osaka.jp", +"sayama.osaka.jp", +"sennan.osaka.jp", +"settsu.osaka.jp", +"shijonawate.osaka.jp", +"shimamoto.osaka.jp", +"suita.osaka.jp", +"tadaoka.osaka.jp", +"taishi.osaka.jp", +"tajiri.osaka.jp", +"takaishi.osaka.jp", +"takatsuki.osaka.jp", +"tondabayashi.osaka.jp", +"toyonaka.osaka.jp", +"toyono.osaka.jp", +"yao.osaka.jp", +"ariake.saga.jp", +"arita.saga.jp", +"fukudomi.saga.jp", +"genkai.saga.jp", +"hamatama.saga.jp", +"hizen.saga.jp", +"imari.saga.jp", +"kamimine.saga.jp", +"kanzaki.saga.jp", +"karatsu.saga.jp", +"kashima.saga.jp", +"kitagata.saga.jp", +"kitahata.saga.jp", +"kiyama.saga.jp", +"kouhoku.saga.jp", +"kyuragi.saga.jp", +"nishiarita.saga.jp", +"ogi.saga.jp", +"omachi.saga.jp", +"ouchi.saga.jp", +"saga.saga.jp", +"shiroishi.saga.jp", +"taku.saga.jp", +"tara.saga.jp", +"tosu.saga.jp", +"yoshinogari.saga.jp", +"arakawa.saitama.jp", +"asaka.saitama.jp", +"chichibu.saitama.jp", +"fujimi.saitama.jp", +"fujimino.saitama.jp", +"fukaya.saitama.jp", +"hanno.saitama.jp", +"hanyu.saitama.jp", +"hasuda.saitama.jp", +"hatogaya.saitama.jp", +"hatoyama.saitama.jp", +"hidaka.saitama.jp", +"higashichichibu.saitama.jp", +"higashimatsuyama.saitama.jp", +"honjo.saitama.jp", +"ina.saitama.jp", +"iruma.saitama.jp", +"iwatsuki.saitama.jp", +"kamiizumi.saitama.jp", +"kamikawa.saitama.jp", +"kamisato.saitama.jp", +"kasukabe.saitama.jp", +"kawagoe.saitama.jp", +"kawaguchi.saitama.jp", +"kawajima.saitama.jp", +"kazo.saitama.jp", +"kitamoto.saitama.jp", +"koshigaya.saitama.jp", +"kounosu.saitama.jp", +"kuki.saitama.jp", +"kumagaya.saitama.jp", +"matsubushi.saitama.jp", +"minano.saitama.jp", +"misato.saitama.jp", +"miyashiro.saitama.jp", +"miyoshi.saitama.jp", +"moroyama.saitama.jp", +"nagatoro.saitama.jp", +"namegawa.saitama.jp", +"niiza.saitama.jp", +"ogano.saitama.jp", +"ogawa.saitama.jp", +"ogose.saitama.jp", +"okegawa.saitama.jp", +"omiya.saitama.jp", +"otaki.saitama.jp", +"ranzan.saitama.jp", +"ryokami.saitama.jp", +"saitama.saitama.jp", +"sakado.saitama.jp", +"satte.saitama.jp", +"sayama.saitama.jp", +"shiki.saitama.jp", +"shiraoka.saitama.jp", +"soka.saitama.jp", +"sugito.saitama.jp", +"toda.saitama.jp", +"tokigawa.saitama.jp", +"tokorozawa.saitama.jp", +"tsurugashima.saitama.jp", +"urawa.saitama.jp", +"warabi.saitama.jp", +"yashio.saitama.jp", +"yokoze.saitama.jp", +"yono.saitama.jp", +"yorii.saitama.jp", +"yoshida.saitama.jp", +"yoshikawa.saitama.jp", +"yoshimi.saitama.jp", +"aisho.shiga.jp", +"gamo.shiga.jp", +"higashiomi.shiga.jp", +"hikone.shiga.jp", +"koka.shiga.jp", +"konan.shiga.jp", +"kosei.shiga.jp", +"koto.shiga.jp", +"kusatsu.shiga.jp", +"maibara.shiga.jp", +"moriyama.shiga.jp", +"nagahama.shiga.jp", +"nishiazai.shiga.jp", +"notogawa.shiga.jp", +"omihachiman.shiga.jp", +"otsu.shiga.jp", +"ritto.shiga.jp", +"ryuoh.shiga.jp", +"takashima.shiga.jp", +"takatsuki.shiga.jp", +"torahime.shiga.jp", +"toyosato.shiga.jp", +"yasu.shiga.jp", +"akagi.shimane.jp", +"ama.shimane.jp", +"gotsu.shimane.jp", +"hamada.shimane.jp", +"higashiizumo.shimane.jp", +"hikawa.shimane.jp", +"hikimi.shimane.jp", +"izumo.shimane.jp", +"kakinoki.shimane.jp", +"masuda.shimane.jp", +"matsue.shimane.jp", +"misato.shimane.jp", +"nishinoshima.shimane.jp", +"ohda.shimane.jp", +"okinoshima.shimane.jp", +"okuizumo.shimane.jp", +"shimane.shimane.jp", +"tamayu.shimane.jp", +"tsuwano.shimane.jp", +"unnan.shimane.jp", +"yakumo.shimane.jp", +"yasugi.shimane.jp", +"yatsuka.shimane.jp", +"arai.shizuoka.jp", +"atami.shizuoka.jp", +"fuji.shizuoka.jp", +"fujieda.shizuoka.jp", +"fujikawa.shizuoka.jp", +"fujinomiya.shizuoka.jp", +"fukuroi.shizuoka.jp", +"gotemba.shizuoka.jp", +"haibara.shizuoka.jp", +"hamamatsu.shizuoka.jp", +"higashiizu.shizuoka.jp", +"ito.shizuoka.jp", +"iwata.shizuoka.jp", +"izu.shizuoka.jp", +"izunokuni.shizuoka.jp", +"kakegawa.shizuoka.jp", +"kannami.shizuoka.jp", +"kawanehon.shizuoka.jp", +"kawazu.shizuoka.jp", +"kikugawa.shizuoka.jp", +"kosai.shizuoka.jp", +"makinohara.shizuoka.jp", +"matsuzaki.shizuoka.jp", +"minamiizu.shizuoka.jp", +"mishima.shizuoka.jp", +"morimachi.shizuoka.jp", +"nishiizu.shizuoka.jp", +"numazu.shizuoka.jp", +"omaezaki.shizuoka.jp", +"shimada.shizuoka.jp", +"shimizu.shizuoka.jp", +"shimoda.shizuoka.jp", +"shizuoka.shizuoka.jp", +"susono.shizuoka.jp", +"yaizu.shizuoka.jp", +"yoshida.shizuoka.jp", +"ashikaga.tochigi.jp", +"bato.tochigi.jp", +"haga.tochigi.jp", +"ichikai.tochigi.jp", +"iwafune.tochigi.jp", +"kaminokawa.tochigi.jp", +"kanuma.tochigi.jp", +"karasuyama.tochigi.jp", +"kuroiso.tochigi.jp", +"mashiko.tochigi.jp", +"mibu.tochigi.jp", +"moka.tochigi.jp", +"motegi.tochigi.jp", +"nasu.tochigi.jp", +"nasushiobara.tochigi.jp", +"nikko.tochigi.jp", +"nishikata.tochigi.jp", +"nogi.tochigi.jp", +"ohira.tochigi.jp", +"ohtawara.tochigi.jp", +"oyama.tochigi.jp", +"sakura.tochigi.jp", +"sano.tochigi.jp", +"shimotsuke.tochigi.jp", +"shioya.tochigi.jp", +"takanezawa.tochigi.jp", +"tochigi.tochigi.jp", +"tsuga.tochigi.jp", +"ujiie.tochigi.jp", +"utsunomiya.tochigi.jp", +"yaita.tochigi.jp", +"aizumi.tokushima.jp", +"anan.tokushima.jp", +"ichiba.tokushima.jp", +"itano.tokushima.jp", +"kainan.tokushima.jp", +"komatsushima.tokushima.jp", +"matsushige.tokushima.jp", +"mima.tokushima.jp", +"minami.tokushima.jp", +"miyoshi.tokushima.jp", +"mugi.tokushima.jp", +"nakagawa.tokushima.jp", +"naruto.tokushima.jp", +"sanagochi.tokushima.jp", +"shishikui.tokushima.jp", +"tokushima.tokushima.jp", +"wajiki.tokushima.jp", +"adachi.tokyo.jp", +"akiruno.tokyo.jp", +"akishima.tokyo.jp", +"aogashima.tokyo.jp", +"arakawa.tokyo.jp", +"bunkyo.tokyo.jp", +"chiyoda.tokyo.jp", +"chofu.tokyo.jp", +"chuo.tokyo.jp", +"edogawa.tokyo.jp", +"fuchu.tokyo.jp", +"fussa.tokyo.jp", +"hachijo.tokyo.jp", +"hachioji.tokyo.jp", +"hamura.tokyo.jp", +"higashikurume.tokyo.jp", +"higashimurayama.tokyo.jp", +"higashiyamato.tokyo.jp", +"hino.tokyo.jp", +"hinode.tokyo.jp", +"hinohara.tokyo.jp", +"inagi.tokyo.jp", +"itabashi.tokyo.jp", +"katsushika.tokyo.jp", +"kita.tokyo.jp", +"kiyose.tokyo.jp", +"kodaira.tokyo.jp", +"koganei.tokyo.jp", +"kokubunji.tokyo.jp", +"komae.tokyo.jp", +"koto.tokyo.jp", +"kouzushima.tokyo.jp", +"kunitachi.tokyo.jp", +"machida.tokyo.jp", +"meguro.tokyo.jp", +"minato.tokyo.jp", +"mitaka.tokyo.jp", +"mizuho.tokyo.jp", +"musashimurayama.tokyo.jp", +"musashino.tokyo.jp", +"nakano.tokyo.jp", +"nerima.tokyo.jp", +"ogasawara.tokyo.jp", +"okutama.tokyo.jp", +"ome.tokyo.jp", +"oshima.tokyo.jp", +"ota.tokyo.jp", +"setagaya.tokyo.jp", +"shibuya.tokyo.jp", +"shinagawa.tokyo.jp", +"shinjuku.tokyo.jp", +"suginami.tokyo.jp", +"sumida.tokyo.jp", +"tachikawa.tokyo.jp", +"taito.tokyo.jp", +"tama.tokyo.jp", +"toshima.tokyo.jp", +"chizu.tottori.jp", +"hino.tottori.jp", +"kawahara.tottori.jp", +"koge.tottori.jp", +"kotoura.tottori.jp", +"misasa.tottori.jp", +"nanbu.tottori.jp", +"nichinan.tottori.jp", +"sakaiminato.tottori.jp", +"tottori.tottori.jp", +"wakasa.tottori.jp", +"yazu.tottori.jp", +"yonago.tottori.jp", +"asahi.toyama.jp", +"fuchu.toyama.jp", +"fukumitsu.toyama.jp", +"funahashi.toyama.jp", +"himi.toyama.jp", +"imizu.toyama.jp", +"inami.toyama.jp", +"johana.toyama.jp", +"kamiichi.toyama.jp", +"kurobe.toyama.jp", +"nakaniikawa.toyama.jp", +"namerikawa.toyama.jp", +"nanto.toyama.jp", +"nyuzen.toyama.jp", +"oyabe.toyama.jp", +"taira.toyama.jp", +"takaoka.toyama.jp", +"tateyama.toyama.jp", +"toga.toyama.jp", +"tonami.toyama.jp", +"toyama.toyama.jp", +"unazuki.toyama.jp", +"uozu.toyama.jp", +"yamada.toyama.jp", +"arida.wakayama.jp", +"aridagawa.wakayama.jp", +"gobo.wakayama.jp", +"hashimoto.wakayama.jp", +"hidaka.wakayama.jp", +"hirogawa.wakayama.jp", +"inami.wakayama.jp", +"iwade.wakayama.jp", +"kainan.wakayama.jp", +"kamitonda.wakayama.jp", +"katsuragi.wakayama.jp", +"kimino.wakayama.jp", +"kinokawa.wakayama.jp", +"kitayama.wakayama.jp", +"koya.wakayama.jp", +"koza.wakayama.jp", +"kozagawa.wakayama.jp", +"kudoyama.wakayama.jp", +"kushimoto.wakayama.jp", +"mihama.wakayama.jp", +"misato.wakayama.jp", +"nachikatsuura.wakayama.jp", +"shingu.wakayama.jp", +"shirahama.wakayama.jp", +"taiji.wakayama.jp", +"tanabe.wakayama.jp", +"wakayama.wakayama.jp", +"yuasa.wakayama.jp", +"yura.wakayama.jp", +"asahi.yamagata.jp", +"funagata.yamagata.jp", +"higashine.yamagata.jp", +"iide.yamagata.jp", +"kahoku.yamagata.jp", +"kaminoyama.yamagata.jp", +"kaneyama.yamagata.jp", +"kawanishi.yamagata.jp", +"mamurogawa.yamagata.jp", +"mikawa.yamagata.jp", +"murayama.yamagata.jp", +"nagai.yamagata.jp", +"nakayama.yamagata.jp", +"nanyo.yamagata.jp", +"nishikawa.yamagata.jp", +"obanazawa.yamagata.jp", +"oe.yamagata.jp", +"oguni.yamagata.jp", +"ohkura.yamagata.jp", +"oishida.yamagata.jp", +"sagae.yamagata.jp", +"sakata.yamagata.jp", +"sakegawa.yamagata.jp", +"shinjo.yamagata.jp", +"shirataka.yamagata.jp", +"shonai.yamagata.jp", +"takahata.yamagata.jp", +"tendo.yamagata.jp", +"tozawa.yamagata.jp", +"tsuruoka.yamagata.jp", +"yamagata.yamagata.jp", +"yamanobe.yamagata.jp", +"yonezawa.yamagata.jp", +"yuza.yamagata.jp", +"abu.yamaguchi.jp", +"hagi.yamaguchi.jp", +"hikari.yamaguchi.jp", +"hofu.yamaguchi.jp", +"iwakuni.yamaguchi.jp", +"kudamatsu.yamaguchi.jp", +"mitou.yamaguchi.jp", +"nagato.yamaguchi.jp", +"oshima.yamaguchi.jp", +"shimonoseki.yamaguchi.jp", +"shunan.yamaguchi.jp", +"tabuse.yamaguchi.jp", +"tokuyama.yamaguchi.jp", +"toyota.yamaguchi.jp", +"ube.yamaguchi.jp", +"yuu.yamaguchi.jp", +"chuo.yamanashi.jp", +"doshi.yamanashi.jp", +"fuefuki.yamanashi.jp", +"fujikawa.yamanashi.jp", +"fujikawaguchiko.yamanashi.jp", +"fujiyoshida.yamanashi.jp", +"hayakawa.yamanashi.jp", +"hokuto.yamanashi.jp", +"ichikawamisato.yamanashi.jp", +"kai.yamanashi.jp", +"kofu.yamanashi.jp", +"koshu.yamanashi.jp", +"kosuge.yamanashi.jp", +"minami-alps.yamanashi.jp", +"minobu.yamanashi.jp", +"nakamichi.yamanashi.jp", +"nanbu.yamanashi.jp", +"narusawa.yamanashi.jp", +"nirasaki.yamanashi.jp", +"nishikatsura.yamanashi.jp", +"oshino.yamanashi.jp", +"otsuki.yamanashi.jp", +"showa.yamanashi.jp", +"tabayama.yamanashi.jp", +"tsuru.yamanashi.jp", +"uenohara.yamanashi.jp", +"yamanakako.yamanashi.jp", +"yamanashi.yamanashi.jp", +"ke", +"ac.ke", +"co.ke", +"go.ke", +"info.ke", +"me.ke", +"mobi.ke", +"ne.ke", +"or.ke", +"sc.ke", +"kg", +"org.kg", +"net.kg", +"com.kg", +"edu.kg", +"gov.kg", +"mil.kg", +"*.kh", +"ki", +"edu.ki", +"biz.ki", +"net.ki", +"org.ki", +"gov.ki", +"info.ki", +"com.ki", +"km", +"org.km", +"nom.km", +"gov.km", +"prd.km", +"tm.km", +"edu.km", +"mil.km", +"ass.km", +"com.km", +"coop.km", +"asso.km", +"presse.km", +"medecin.km", +"notaires.km", +"pharmaciens.km", +"veterinaire.km", +"gouv.km", +"kn", +"net.kn", +"org.kn", +"edu.kn", +"gov.kn", +"kp", +"com.kp", +"edu.kp", +"gov.kp", +"org.kp", +"rep.kp", +"tra.kp", +"kr", +"ac.kr", +"co.kr", +"es.kr", +"go.kr", +"hs.kr", +"kg.kr", +"mil.kr", +"ms.kr", +"ne.kr", +"or.kr", +"pe.kr", +"re.kr", +"sc.kr", +"busan.kr", +"chungbuk.kr", +"chungnam.kr", +"daegu.kr", +"daejeon.kr", +"gangwon.kr", +"gwangju.kr", +"gyeongbuk.kr", +"gyeonggi.kr", +"gyeongnam.kr", +"incheon.kr", +"jeju.kr", +"jeonbuk.kr", +"jeonnam.kr", +"seoul.kr", +"ulsan.kr", +"kw", +"com.kw", +"edu.kw", +"emb.kw", +"gov.kw", +"ind.kw", +"net.kw", +"org.kw", +"ky", +"edu.ky", +"gov.ky", +"com.ky", +"org.ky", +"net.ky", +"kz", +"org.kz", +"edu.kz", +"net.kz", +"gov.kz", +"mil.kz", +"com.kz", +"la", +"int.la", +"net.la", +"info.la", +"edu.la", +"gov.la", +"per.la", +"com.la", +"org.la", +"lb", +"com.lb", +"edu.lb", +"gov.lb", +"net.lb", +"org.lb", +"lc", +"com.lc", +"net.lc", +"co.lc", +"org.lc", +"edu.lc", +"gov.lc", +"li", +"lk", +"gov.lk", +"sch.lk", +"net.lk", +"int.lk", +"com.lk", +"org.lk", +"edu.lk", +"ngo.lk", +"soc.lk", +"web.lk", +"ltd.lk", +"assn.lk", +"grp.lk", +"hotel.lk", +"ac.lk", +"lr", +"com.lr", +"edu.lr", +"gov.lr", +"org.lr", +"net.lr", +"ls", +"ac.ls", +"biz.ls", +"co.ls", +"edu.ls", +"gov.ls", +"info.ls", +"net.ls", +"org.ls", +"sc.ls", +"lt", +"gov.lt", +"lu", +"lv", +"com.lv", +"edu.lv", +"gov.lv", +"org.lv", +"mil.lv", +"id.lv", +"net.lv", +"asn.lv", +"conf.lv", +"ly", +"com.ly", +"net.ly", +"gov.ly", +"plc.ly", +"edu.ly", +"sch.ly", +"med.ly", +"org.ly", +"id.ly", +"ma", +"co.ma", +"net.ma", +"gov.ma", +"org.ma", +"ac.ma", +"press.ma", +"mc", +"tm.mc", +"asso.mc", +"md", +"me", +"co.me", +"net.me", +"org.me", +"edu.me", +"ac.me", +"gov.me", +"its.me", +"priv.me", +"mg", +"org.mg", +"nom.mg", +"gov.mg", +"prd.mg", +"tm.mg", +"edu.mg", +"mil.mg", +"com.mg", +"co.mg", +"mh", +"mil", +"mk", +"com.mk", +"org.mk", +"net.mk", +"edu.mk", +"gov.mk", +"inf.mk", +"name.mk", +"ml", +"com.ml", +"edu.ml", +"gouv.ml", +"gov.ml", +"net.ml", +"org.ml", +"presse.ml", +"*.mm", +"mn", +"gov.mn", +"edu.mn", +"org.mn", +"mo", +"com.mo", +"net.mo", +"org.mo", +"edu.mo", +"gov.mo", +"mobi", +"mp", +"mq", +"mr", +"gov.mr", +"ms", +"com.ms", +"edu.ms", +"gov.ms", +"net.ms", +"org.ms", +"mt", +"com.mt", +"edu.mt", +"net.mt", +"org.mt", +"mu", +"com.mu", +"net.mu", +"org.mu", +"gov.mu", +"ac.mu", +"co.mu", +"or.mu", +"museum", +"academy.museum", +"agriculture.museum", +"air.museum", +"airguard.museum", +"alabama.museum", +"alaska.museum", +"amber.museum", +"ambulance.museum", +"american.museum", +"americana.museum", +"americanantiques.museum", +"americanart.museum", +"amsterdam.museum", +"and.museum", +"annefrank.museum", +"anthro.museum", +"anthropology.museum", +"antiques.museum", +"aquarium.museum", +"arboretum.museum", +"archaeological.museum", +"archaeology.museum", +"architecture.museum", +"art.museum", +"artanddesign.museum", +"artcenter.museum", +"artdeco.museum", +"arteducation.museum", +"artgallery.museum", +"arts.museum", +"artsandcrafts.museum", +"asmatart.museum", +"assassination.museum", +"assisi.museum", +"association.museum", +"astronomy.museum", +"atlanta.museum", +"austin.museum", +"australia.museum", +"automotive.museum", +"aviation.museum", +"axis.museum", +"badajoz.museum", +"baghdad.museum", +"bahn.museum", +"bale.museum", +"baltimore.museum", +"barcelona.museum", +"baseball.museum", +"basel.museum", +"baths.museum", +"bauern.museum", +"beauxarts.museum", +"beeldengeluid.museum", +"bellevue.museum", +"bergbau.museum", +"berkeley.museum", +"berlin.museum", +"bern.museum", +"bible.museum", +"bilbao.museum", +"bill.museum", +"birdart.museum", +"birthplace.museum", +"bonn.museum", +"boston.museum", +"botanical.museum", +"botanicalgarden.museum", +"botanicgarden.museum", +"botany.museum", +"brandywinevalley.museum", +"brasil.museum", +"bristol.museum", +"british.museum", +"britishcolumbia.museum", +"broadcast.museum", +"brunel.museum", +"brussel.museum", +"brussels.museum", +"bruxelles.museum", +"building.museum", +"burghof.museum", +"bus.museum", +"bushey.museum", +"cadaques.museum", +"california.museum", +"cambridge.museum", +"can.museum", +"canada.museum", +"capebreton.museum", +"carrier.museum", +"cartoonart.museum", +"casadelamoneda.museum", +"castle.museum", +"castres.museum", +"celtic.museum", +"center.museum", +"chattanooga.museum", +"cheltenham.museum", +"chesapeakebay.museum", +"chicago.museum", +"children.museum", +"childrens.museum", +"childrensgarden.museum", +"chiropractic.museum", +"chocolate.museum", +"christiansburg.museum", +"cincinnati.museum", +"cinema.museum", +"circus.museum", +"civilisation.museum", +"civilization.museum", +"civilwar.museum", +"clinton.museum", +"clock.museum", +"coal.museum", +"coastaldefence.museum", +"cody.museum", +"coldwar.museum", +"collection.museum", +"colonialwilliamsburg.museum", +"coloradoplateau.museum", +"columbia.museum", +"columbus.museum", +"communication.museum", +"communications.museum", +"community.museum", +"computer.museum", +"computerhistory.museum", +"comunicações.museum", +"contemporary.museum", +"contemporaryart.museum", +"convent.museum", +"copenhagen.museum", +"corporation.museum", +"correios-e-telecomunicações.museum", +"corvette.museum", +"costume.museum", +"countryestate.museum", +"county.museum", +"crafts.museum", +"cranbrook.museum", +"creation.museum", +"cultural.museum", +"culturalcenter.museum", +"culture.museum", +"cyber.museum", +"cymru.museum", +"dali.museum", +"dallas.museum", +"database.museum", +"ddr.museum", +"decorativearts.museum", +"delaware.museum", +"delmenhorst.museum", +"denmark.museum", +"depot.museum", +"design.museum", +"detroit.museum", +"dinosaur.museum", +"discovery.museum", +"dolls.museum", +"donostia.museum", +"durham.museum", +"eastafrica.museum", +"eastcoast.museum", +"education.museum", +"educational.museum", +"egyptian.museum", +"eisenbahn.museum", +"elburg.museum", +"elvendrell.museum", +"embroidery.museum", +"encyclopedic.museum", +"england.museum", +"entomology.museum", +"environment.museum", +"environmentalconservation.museum", +"epilepsy.museum", +"essex.museum", +"estate.museum", +"ethnology.museum", +"exeter.museum", +"exhibition.museum", +"family.museum", +"farm.museum", +"farmequipment.museum", +"farmers.museum", +"farmstead.museum", +"field.museum", +"figueres.museum", +"filatelia.museum", +"film.museum", +"fineart.museum", +"finearts.museum", +"finland.museum", +"flanders.museum", +"florida.museum", +"force.museum", +"fortmissoula.museum", +"fortworth.museum", +"foundation.museum", +"francaise.museum", +"frankfurt.museum", +"franziskaner.museum", +"freemasonry.museum", +"freiburg.museum", +"fribourg.museum", +"frog.museum", +"fundacio.museum", +"furniture.museum", +"gallery.museum", +"garden.museum", +"gateway.museum", +"geelvinck.museum", +"gemological.museum", +"geology.museum", +"georgia.museum", +"giessen.museum", +"glas.museum", +"glass.museum", +"gorge.museum", +"grandrapids.museum", +"graz.museum", +"guernsey.museum", +"halloffame.museum", +"hamburg.museum", +"handson.museum", +"harvestcelebration.museum", +"hawaii.museum", +"health.museum", +"heimatunduhren.museum", +"hellas.museum", +"helsinki.museum", +"hembygdsforbund.museum", +"heritage.museum", +"histoire.museum", +"historical.museum", +"historicalsociety.museum", +"historichouses.museum", +"historisch.museum", +"historisches.museum", +"history.museum", +"historyofscience.museum", +"horology.museum", +"house.museum", +"humanities.museum", +"illustration.museum", +"imageandsound.museum", +"indian.museum", +"indiana.museum", +"indianapolis.museum", +"indianmarket.museum", +"intelligence.museum", +"interactive.museum", +"iraq.museum", +"iron.museum", +"isleofman.museum", +"jamison.museum", +"jefferson.museum", +"jerusalem.museum", +"jewelry.museum", +"jewish.museum", +"jewishart.museum", +"jfk.museum", +"journalism.museum", +"judaica.museum", +"judygarland.museum", +"juedisches.museum", +"juif.museum", +"karate.museum", +"karikatur.museum", +"kids.museum", +"koebenhavn.museum", +"koeln.museum", +"kunst.museum", +"kunstsammlung.museum", +"kunstunddesign.museum", +"labor.museum", +"labour.museum", +"lajolla.museum", +"lancashire.museum", +"landes.museum", +"lans.museum", +"läns.museum", +"larsson.museum", +"lewismiller.museum", +"lincoln.museum", +"linz.museum", +"living.museum", +"livinghistory.museum", +"localhistory.museum", +"london.museum", +"losangeles.museum", +"louvre.museum", +"loyalist.museum", +"lucerne.museum", +"luxembourg.museum", +"luzern.museum", +"mad.museum", +"madrid.museum", +"mallorca.museum", +"manchester.museum", +"mansion.museum", +"mansions.museum", +"manx.museum", +"marburg.museum", +"maritime.museum", +"maritimo.museum", +"maryland.museum", +"marylhurst.museum", +"media.museum", +"medical.museum", +"medizinhistorisches.museum", +"meeres.museum", +"memorial.museum", +"mesaverde.museum", +"michigan.museum", +"midatlantic.museum", +"military.museum", +"mill.museum", +"miners.museum", +"mining.museum", +"minnesota.museum", +"missile.museum", +"missoula.museum", +"modern.museum", +"moma.museum", +"money.museum", +"monmouth.museum", +"monticello.museum", +"montreal.museum", +"moscow.museum", +"motorcycle.museum", +"muenchen.museum", +"muenster.museum", +"mulhouse.museum", +"muncie.museum", +"museet.museum", +"museumcenter.museum", +"museumvereniging.museum", +"music.museum", +"national.museum", +"nationalfirearms.museum", +"nationalheritage.museum", +"nativeamerican.museum", +"naturalhistory.museum", +"naturalhistorymuseum.museum", +"naturalsciences.museum", +"nature.museum", +"naturhistorisches.museum", +"natuurwetenschappen.museum", +"naumburg.museum", +"naval.museum", +"nebraska.museum", +"neues.museum", +"newhampshire.museum", +"newjersey.museum", +"newmexico.museum", +"newport.museum", +"newspaper.museum", +"newyork.museum", +"niepce.museum", +"norfolk.museum", +"north.museum", +"nrw.museum", +"nyc.museum", +"nyny.museum", +"oceanographic.museum", +"oceanographique.museum", +"omaha.museum", +"online.museum", +"ontario.museum", +"openair.museum", +"oregon.museum", +"oregontrail.museum", +"otago.museum", +"oxford.museum", +"pacific.museum", +"paderborn.museum", +"palace.museum", +"paleo.museum", +"palmsprings.museum", +"panama.museum", +"paris.museum", +"pasadena.museum", +"pharmacy.museum", +"philadelphia.museum", +"philadelphiaarea.museum", +"philately.museum", +"phoenix.museum", +"photography.museum", +"pilots.museum", +"pittsburgh.museum", +"planetarium.museum", +"plantation.museum", +"plants.museum", +"plaza.museum", +"portal.museum", +"portland.museum", +"portlligat.museum", +"posts-and-telecommunications.museum", +"preservation.museum", +"presidio.museum", +"press.museum", +"project.museum", +"public.museum", +"pubol.museum", +"quebec.museum", +"railroad.museum", +"railway.museum", +"research.museum", +"resistance.museum", +"riodejaneiro.museum", +"rochester.museum", +"rockart.museum", +"roma.museum", +"russia.museum", +"saintlouis.museum", +"salem.museum", +"salvadordali.museum", +"salzburg.museum", +"sandiego.museum", +"sanfrancisco.museum", +"santabarbara.museum", +"santacruz.museum", +"santafe.museum", +"saskatchewan.museum", +"satx.museum", +"savannahga.museum", +"schlesisches.museum", +"schoenbrunn.museum", +"schokoladen.museum", +"school.museum", +"schweiz.museum", +"science.museum", +"scienceandhistory.museum", +"scienceandindustry.museum", +"sciencecenter.museum", +"sciencecenters.museum", +"science-fiction.museum", +"sciencehistory.museum", +"sciences.museum", +"sciencesnaturelles.museum", +"scotland.museum", +"seaport.museum", +"settlement.museum", +"settlers.museum", +"shell.museum", +"sherbrooke.museum", +"sibenik.museum", +"silk.museum", +"ski.museum", +"skole.museum", +"society.museum", +"sologne.museum", +"soundandvision.museum", +"southcarolina.museum", +"southwest.museum", +"space.museum", +"spy.museum", +"square.museum", +"stadt.museum", +"stalbans.museum", +"starnberg.museum", +"state.museum", +"stateofdelaware.museum", +"station.museum", +"steam.museum", +"steiermark.museum", +"stjohn.museum", +"stockholm.museum", +"stpetersburg.museum", +"stuttgart.museum", +"suisse.museum", +"surgeonshall.museum", +"surrey.museum", +"svizzera.museum", +"sweden.museum", +"sydney.museum", +"tank.museum", +"tcm.museum", +"technology.museum", +"telekommunikation.museum", +"television.museum", +"texas.museum", +"textile.museum", +"theater.museum", +"time.museum", +"timekeeping.museum", +"topology.museum", +"torino.museum", +"touch.museum", +"town.museum", +"transport.museum", +"tree.museum", +"trolley.museum", +"trust.museum", +"trustee.museum", +"uhren.museum", +"ulm.museum", +"undersea.museum", +"university.museum", +"usa.museum", +"usantiques.museum", +"usarts.museum", +"uscountryestate.museum", +"usculture.museum", +"usdecorativearts.museum", +"usgarden.museum", +"ushistory.museum", +"ushuaia.museum", +"uslivinghistory.museum", +"utah.museum", +"uvic.museum", +"valley.museum", +"vantaa.museum", +"versailles.museum", +"viking.museum", +"village.museum", +"virginia.museum", +"virtual.museum", +"virtuel.museum", +"vlaanderen.museum", +"volkenkunde.museum", +"wales.museum", +"wallonie.museum", +"war.museum", +"washingtondc.museum", +"watchandclock.museum", +"watch-and-clock.museum", +"western.museum", +"westfalen.museum", +"whaling.museum", +"wildlife.museum", +"williamsburg.museum", +"windmill.museum", +"workshop.museum", +"york.museum", +"yorkshire.museum", +"yosemite.museum", +"youth.museum", +"zoological.museum", +"zoology.museum", +"ירושלים.museum", +"иком.museum", +"mv", +"aero.mv", +"biz.mv", +"com.mv", +"coop.mv", +"edu.mv", +"gov.mv", +"info.mv", +"int.mv", +"mil.mv", +"museum.mv", +"name.mv", +"net.mv", +"org.mv", +"pro.mv", +"mw", +"ac.mw", +"biz.mw", +"co.mw", +"com.mw", +"coop.mw", +"edu.mw", +"gov.mw", +"int.mw", +"museum.mw", +"net.mw", +"org.mw", +"mx", +"com.mx", +"org.mx", +"gob.mx", +"edu.mx", +"net.mx", +"my", +"com.my", +"net.my", +"org.my", +"gov.my", +"edu.my", +"mil.my", +"name.my", +"mz", +"ac.mz", +"adv.mz", +"co.mz", +"edu.mz", +"gov.mz", +"mil.mz", +"net.mz", +"org.mz", +"na", +"info.na", +"pro.na", +"name.na", +"school.na", +"or.na", +"dr.na", +"us.na", +"mx.na", +"ca.na", +"in.na", +"cc.na", +"tv.na", +"ws.na", +"mobi.na", +"co.na", +"com.na", +"org.na", +"name", +"nc", +"asso.nc", +"nom.nc", +"ne", +"net", +"nf", +"com.nf", +"net.nf", +"per.nf", +"rec.nf", +"web.nf", +"arts.nf", +"firm.nf", +"info.nf", +"other.nf", +"store.nf", +"ng", +"com.ng", +"edu.ng", +"gov.ng", +"i.ng", +"mil.ng", +"mobi.ng", +"name.ng", +"net.ng", +"org.ng", +"sch.ng", +"ni", +"ac.ni", +"biz.ni", +"co.ni", +"com.ni", +"edu.ni", +"gob.ni", +"in.ni", +"info.ni", +"int.ni", +"mil.ni", +"net.ni", +"nom.ni", +"org.ni", +"web.ni", +"nl", +"no", +"fhs.no", +"vgs.no", +"fylkesbibl.no", +"folkebibl.no", +"museum.no", +"idrett.no", +"priv.no", +"mil.no", +"stat.no", +"dep.no", +"kommune.no", +"herad.no", +"aa.no", +"ah.no", +"bu.no", +"fm.no", +"hl.no", +"hm.no", +"jan-mayen.no", +"mr.no", +"nl.no", +"nt.no", +"of.no", +"ol.no", +"oslo.no", +"rl.no", +"sf.no", +"st.no", +"svalbard.no", +"tm.no", +"tr.no", +"va.no", +"vf.no", +"gs.aa.no", +"gs.ah.no", +"gs.bu.no", +"gs.fm.no", +"gs.hl.no", +"gs.hm.no", +"gs.jan-mayen.no", +"gs.mr.no", +"gs.nl.no", +"gs.nt.no", +"gs.of.no", +"gs.ol.no", +"gs.oslo.no", +"gs.rl.no", +"gs.sf.no", +"gs.st.no", +"gs.svalbard.no", +"gs.tm.no", +"gs.tr.no", +"gs.va.no", +"gs.vf.no", +"akrehamn.no", +"åkrehamn.no", +"algard.no", +"ålgård.no", +"arna.no", +"brumunddal.no", +"bryne.no", +"bronnoysund.no", +"brønnøysund.no", +"drobak.no", +"drøbak.no", +"egersund.no", +"fetsund.no", +"floro.no", +"florø.no", +"fredrikstad.no", +"hokksund.no", +"honefoss.no", +"hønefoss.no", +"jessheim.no", +"jorpeland.no", +"jørpeland.no", +"kirkenes.no", +"kopervik.no", +"krokstadelva.no", +"langevag.no", +"langevåg.no", +"leirvik.no", +"mjondalen.no", +"mjøndalen.no", +"mo-i-rana.no", +"mosjoen.no", +"mosjøen.no", +"nesoddtangen.no", +"orkanger.no", +"osoyro.no", +"osøyro.no", +"raholt.no", +"råholt.no", +"sandnessjoen.no", +"sandnessjøen.no", +"skedsmokorset.no", +"slattum.no", +"spjelkavik.no", +"stathelle.no", +"stavern.no", +"stjordalshalsen.no", +"stjørdalshalsen.no", +"tananger.no", +"tranby.no", +"vossevangen.no", +"afjord.no", +"åfjord.no", +"agdenes.no", +"al.no", +"ål.no", +"alesund.no", +"ålesund.no", +"alstahaug.no", +"alta.no", +"áltá.no", +"alaheadju.no", +"álaheadju.no", +"alvdal.no", +"amli.no", +"åmli.no", +"amot.no", +"åmot.no", +"andebu.no", +"andoy.no", +"andøy.no", +"andasuolo.no", +"ardal.no", +"årdal.no", +"aremark.no", +"arendal.no", +"ås.no", +"aseral.no", +"åseral.no", +"asker.no", +"askim.no", +"askvoll.no", +"askoy.no", +"askøy.no", +"asnes.no", +"åsnes.no", +"audnedaln.no", +"aukra.no", +"aure.no", +"aurland.no", +"aurskog-holand.no", +"aurskog-høland.no", +"austevoll.no", +"austrheim.no", +"averoy.no", +"averøy.no", +"balestrand.no", +"ballangen.no", +"balat.no", +"bálát.no", +"balsfjord.no", +"bahccavuotna.no", +"báhccavuotna.no", +"bamble.no", +"bardu.no", +"beardu.no", +"beiarn.no", +"bajddar.no", +"bájddar.no", +"baidar.no", +"báidár.no", +"berg.no", +"bergen.no", +"berlevag.no", +"berlevåg.no", +"bearalvahki.no", +"bearalváhki.no", +"bindal.no", +"birkenes.no", +"bjarkoy.no", +"bjarkøy.no", +"bjerkreim.no", +"bjugn.no", +"bodo.no", +"bodø.no", +"badaddja.no", +"bådåddjå.no", +"budejju.no", +"bokn.no", +"bremanger.no", +"bronnoy.no", +"brønnøy.no", +"bygland.no", +"bykle.no", +"barum.no", +"bærum.no", +"bo.telemark.no", +"bø.telemark.no", +"bo.nordland.no", +"bø.nordland.no", +"bievat.no", +"bievát.no", +"bomlo.no", +"bømlo.no", +"batsfjord.no", +"båtsfjord.no", +"bahcavuotna.no", +"báhcavuotna.no", +"dovre.no", +"drammen.no", +"drangedal.no", +"dyroy.no", +"dyrøy.no", +"donna.no", +"dønna.no", +"eid.no", +"eidfjord.no", +"eidsberg.no", +"eidskog.no", +"eidsvoll.no", +"eigersund.no", +"elverum.no", +"enebakk.no", +"engerdal.no", +"etne.no", +"etnedal.no", +"evenes.no", +"evenassi.no", +"evenášši.no", +"evje-og-hornnes.no", +"farsund.no", +"fauske.no", +"fuossko.no", +"fuoisku.no", +"fedje.no", +"fet.no", +"finnoy.no", +"finnøy.no", +"fitjar.no", +"fjaler.no", +"fjell.no", +"flakstad.no", +"flatanger.no", +"flekkefjord.no", +"flesberg.no", +"flora.no", +"fla.no", +"flå.no", +"folldal.no", +"forsand.no", +"fosnes.no", +"frei.no", +"frogn.no", +"froland.no", +"frosta.no", +"frana.no", +"fræna.no", +"froya.no", +"frøya.no", +"fusa.no", +"fyresdal.no", +"forde.no", +"førde.no", +"gamvik.no", +"gangaviika.no", +"gáŋgaviika.no", +"gaular.no", +"gausdal.no", +"gildeskal.no", +"gildeskål.no", +"giske.no", +"gjemnes.no", +"gjerdrum.no", +"gjerstad.no", +"gjesdal.no", +"gjovik.no", +"gjøvik.no", +"gloppen.no", +"gol.no", +"gran.no", +"grane.no", +"granvin.no", +"gratangen.no", +"grimstad.no", +"grong.no", +"kraanghke.no", +"kråanghke.no", +"grue.no", +"gulen.no", +"hadsel.no", +"halden.no", +"halsa.no", +"hamar.no", +"hamaroy.no", +"habmer.no", +"hábmer.no", +"hapmir.no", +"hápmir.no", +"hammerfest.no", +"hammarfeasta.no", +"hámmárfeasta.no", +"haram.no", +"hareid.no", +"harstad.no", +"hasvik.no", +"aknoluokta.no", +"ákŋoluokta.no", +"hattfjelldal.no", +"aarborte.no", +"haugesund.no", +"hemne.no", +"hemnes.no", +"hemsedal.no", +"heroy.more-og-romsdal.no", +"herøy.møre-og-romsdal.no", +"heroy.nordland.no", +"herøy.nordland.no", +"hitra.no", +"hjartdal.no", +"hjelmeland.no", +"hobol.no", +"hobøl.no", +"hof.no", +"hol.no", +"hole.no", +"holmestrand.no", +"holtalen.no", +"holtålen.no", +"hornindal.no", +"horten.no", +"hurdal.no", +"hurum.no", +"hvaler.no", +"hyllestad.no", +"hagebostad.no", +"hægebostad.no", +"hoyanger.no", +"høyanger.no", +"hoylandet.no", +"høylandet.no", +"ha.no", +"hå.no", +"ibestad.no", +"inderoy.no", +"inderøy.no", +"iveland.no", +"jevnaker.no", +"jondal.no", +"jolster.no", +"jølster.no", +"karasjok.no", +"karasjohka.no", +"kárášjohka.no", +"karlsoy.no", +"galsa.no", +"gálsá.no", +"karmoy.no", +"karmøy.no", +"kautokeino.no", +"guovdageaidnu.no", +"klepp.no", +"klabu.no", +"klæbu.no", +"kongsberg.no", +"kongsvinger.no", +"kragero.no", +"kragerø.no", +"kristiansand.no", +"kristiansund.no", +"krodsherad.no", +"krødsherad.no", +"kvalsund.no", +"rahkkeravju.no", +"ráhkkerávju.no", +"kvam.no", +"kvinesdal.no", +"kvinnherad.no", +"kviteseid.no", +"kvitsoy.no", +"kvitsøy.no", +"kvafjord.no", +"kvæfjord.no", +"giehtavuoatna.no", +"kvanangen.no", +"kvænangen.no", +"navuotna.no", +"návuotna.no", +"kafjord.no", +"kåfjord.no", +"gaivuotna.no", +"gáivuotna.no", +"larvik.no", +"lavangen.no", +"lavagis.no", +"loabat.no", +"loabát.no", +"lebesby.no", +"davvesiida.no", +"leikanger.no", +"leirfjord.no", +"leka.no", +"leksvik.no", +"lenvik.no", +"leangaviika.no", +"leaŋgaviika.no", +"lesja.no", +"levanger.no", +"lier.no", +"lierne.no", +"lillehammer.no", +"lillesand.no", +"lindesnes.no", +"lindas.no", +"lindås.no", +"lom.no", +"loppa.no", +"lahppi.no", +"láhppi.no", +"lund.no", +"lunner.no", +"luroy.no", +"lurøy.no", +"luster.no", +"lyngdal.no", +"lyngen.no", +"ivgu.no", +"lardal.no", +"lerdal.no", +"lærdal.no", +"lodingen.no", +"lødingen.no", +"lorenskog.no", +"lørenskog.no", +"loten.no", +"løten.no", +"malvik.no", +"masoy.no", +"måsøy.no", +"muosat.no", +"muosát.no", +"mandal.no", +"marker.no", +"marnardal.no", +"masfjorden.no", +"meland.no", +"meldal.no", +"melhus.no", +"meloy.no", +"meløy.no", +"meraker.no", +"meråker.no", +"moareke.no", +"moåreke.no", +"midsund.no", +"midtre-gauldal.no", +"modalen.no", +"modum.no", +"molde.no", +"moskenes.no", +"moss.no", +"mosvik.no", +"malselv.no", +"målselv.no", +"malatvuopmi.no", +"málatvuopmi.no", +"namdalseid.no", +"aejrie.no", +"namsos.no", +"namsskogan.no", +"naamesjevuemie.no", +"nååmesjevuemie.no", +"laakesvuemie.no", +"nannestad.no", +"narvik.no", +"narviika.no", +"naustdal.no", +"nedre-eiker.no", +"nes.akershus.no", +"nes.buskerud.no", +"nesna.no", +"nesodden.no", +"nesseby.no", +"unjarga.no", +"unjárga.no", +"nesset.no", +"nissedal.no", +"nittedal.no", +"nord-aurdal.no", +"nord-fron.no", +"nord-odal.no", +"norddal.no", +"nordkapp.no", +"davvenjarga.no", +"davvenjárga.no", +"nordre-land.no", +"nordreisa.no", +"raisa.no", +"ráisa.no", +"nore-og-uvdal.no", +"notodden.no", +"naroy.no", +"nærøy.no", +"notteroy.no", +"nøtterøy.no", +"odda.no", +"oksnes.no", +"øksnes.no", +"oppdal.no", +"oppegard.no", +"oppegård.no", +"orkdal.no", +"orland.no", +"ørland.no", +"orskog.no", +"ørskog.no", +"orsta.no", +"ørsta.no", +"os.hedmark.no", +"os.hordaland.no", +"osen.no", +"osteroy.no", +"osterøy.no", +"ostre-toten.no", +"østre-toten.no", +"overhalla.no", +"ovre-eiker.no", +"øvre-eiker.no", +"oyer.no", +"øyer.no", +"oygarden.no", +"øygarden.no", +"oystre-slidre.no", +"øystre-slidre.no", +"porsanger.no", +"porsangu.no", +"porsáŋgu.no", +"porsgrunn.no", +"radoy.no", +"radøy.no", +"rakkestad.no", +"rana.no", +"ruovat.no", +"randaberg.no", +"rauma.no", +"rendalen.no", +"rennebu.no", +"rennesoy.no", +"rennesøy.no", +"rindal.no", +"ringebu.no", +"ringerike.no", +"ringsaker.no", +"rissa.no", +"risor.no", +"risør.no", +"roan.no", +"rollag.no", +"rygge.no", +"ralingen.no", +"rælingen.no", +"rodoy.no", +"rødøy.no", +"romskog.no", +"rømskog.no", +"roros.no", +"røros.no", +"rost.no", +"røst.no", +"royken.no", +"røyken.no", +"royrvik.no", +"røyrvik.no", +"rade.no", +"råde.no", +"salangen.no", +"siellak.no", +"saltdal.no", +"salat.no", +"sálát.no", +"sálat.no", +"samnanger.no", +"sande.more-og-romsdal.no", +"sande.møre-og-romsdal.no", +"sande.vestfold.no", +"sandefjord.no", +"sandnes.no", +"sandoy.no", +"sandøy.no", +"sarpsborg.no", +"sauda.no", +"sauherad.no", +"sel.no", +"selbu.no", +"selje.no", +"seljord.no", +"sigdal.no", +"siljan.no", +"sirdal.no", +"skaun.no", +"skedsmo.no", +"ski.no", +"skien.no", +"skiptvet.no", +"skjervoy.no", +"skjervøy.no", +"skierva.no", +"skiervá.no", +"skjak.no", +"skjåk.no", +"skodje.no", +"skanland.no", +"skånland.no", +"skanit.no", +"skánit.no", +"smola.no", +"smøla.no", +"snillfjord.no", +"snasa.no", +"snåsa.no", +"snoasa.no", +"snaase.no", +"snåase.no", +"sogndal.no", +"sokndal.no", +"sola.no", +"solund.no", +"songdalen.no", +"sortland.no", +"spydeberg.no", +"stange.no", +"stavanger.no", +"steigen.no", +"steinkjer.no", +"stjordal.no", +"stjørdal.no", +"stokke.no", +"stor-elvdal.no", +"stord.no", +"stordal.no", +"storfjord.no", +"omasvuotna.no", +"strand.no", +"stranda.no", +"stryn.no", +"sula.no", +"suldal.no", +"sund.no", +"sunndal.no", +"surnadal.no", +"sveio.no", +"svelvik.no", +"sykkylven.no", +"sogne.no", +"søgne.no", +"somna.no", +"sømna.no", +"sondre-land.no", +"søndre-land.no", +"sor-aurdal.no", +"sør-aurdal.no", +"sor-fron.no", +"sør-fron.no", +"sor-odal.no", +"sør-odal.no", +"sor-varanger.no", +"sør-varanger.no", +"matta-varjjat.no", +"mátta-várjjat.no", +"sorfold.no", +"sørfold.no", +"sorreisa.no", +"sørreisa.no", +"sorum.no", +"sørum.no", +"tana.no", +"deatnu.no", +"time.no", +"tingvoll.no", +"tinn.no", +"tjeldsund.no", +"dielddanuorri.no", +"tjome.no", +"tjøme.no", +"tokke.no", +"tolga.no", +"torsken.no", +"tranoy.no", +"tranøy.no", +"tromso.no", +"tromsø.no", +"tromsa.no", +"romsa.no", +"trondheim.no", +"troandin.no", +"trysil.no", +"trana.no", +"træna.no", +"trogstad.no", +"trøgstad.no", +"tvedestrand.no", +"tydal.no", +"tynset.no", +"tysfjord.no", +"divtasvuodna.no", +"divttasvuotna.no", +"tysnes.no", +"tysvar.no", +"tysvær.no", +"tonsberg.no", +"tønsberg.no", +"ullensaker.no", +"ullensvang.no", +"ulvik.no", +"utsira.no", +"vadso.no", +"vadsø.no", +"cahcesuolo.no", +"čáhcesuolo.no", +"vaksdal.no", +"valle.no", +"vang.no", +"vanylven.no", +"vardo.no", +"vardø.no", +"varggat.no", +"várggát.no", +"vefsn.no", +"vaapste.no", +"vega.no", +"vegarshei.no", +"vegårshei.no", +"vennesla.no", +"verdal.no", +"verran.no", +"vestby.no", +"vestnes.no", +"vestre-slidre.no", +"vestre-toten.no", +"vestvagoy.no", +"vestvågøy.no", +"vevelstad.no", +"vik.no", +"vikna.no", +"vindafjord.no", +"volda.no", +"voss.no", +"varoy.no", +"værøy.no", +"vagan.no", +"vågan.no", +"voagat.no", +"vagsoy.no", +"vågsøy.no", +"vaga.no", +"vågå.no", +"valer.ostfold.no", +"våler.østfold.no", +"valer.hedmark.no", +"våler.hedmark.no", +"*.np", +"nr", +"biz.nr", +"info.nr", +"gov.nr", +"edu.nr", +"org.nr", +"net.nr", +"com.nr", +"nu", +"nz", +"ac.nz", +"co.nz", +"cri.nz", +"geek.nz", +"gen.nz", +"govt.nz", +"health.nz", +"iwi.nz", +"kiwi.nz", +"maori.nz", +"mil.nz", +"māori.nz", +"net.nz", +"org.nz", +"parliament.nz", +"school.nz", +"om", +"co.om", +"com.om", +"edu.om", +"gov.om", +"med.om", +"museum.om", +"net.om", +"org.om", +"pro.om", +"onion", +"org", +"pa", +"ac.pa", +"gob.pa", +"com.pa", +"org.pa", +"sld.pa", +"edu.pa", +"net.pa", +"ing.pa", +"abo.pa", +"med.pa", +"nom.pa", +"pe", +"edu.pe", +"gob.pe", +"nom.pe", +"mil.pe", +"org.pe", +"com.pe", +"net.pe", +"pf", +"com.pf", +"org.pf", +"edu.pf", +"*.pg", +"ph", +"com.ph", +"net.ph", +"org.ph", +"gov.ph", +"edu.ph", +"ngo.ph", +"mil.ph", +"i.ph", +"pk", +"com.pk", +"net.pk", +"edu.pk", +"org.pk", +"fam.pk", +"biz.pk", +"web.pk", +"gov.pk", +"gob.pk", +"gok.pk", +"gon.pk", +"gop.pk", +"gos.pk", +"info.pk", +"pl", +"com.pl", +"net.pl", +"org.pl", +"aid.pl", +"agro.pl", +"atm.pl", +"auto.pl", +"biz.pl", +"edu.pl", +"gmina.pl", +"gsm.pl", +"info.pl", +"mail.pl", +"miasta.pl", +"media.pl", +"mil.pl", +"nieruchomosci.pl", +"nom.pl", +"pc.pl", +"powiat.pl", +"priv.pl", +"realestate.pl", +"rel.pl", +"sex.pl", +"shop.pl", +"sklep.pl", +"sos.pl", +"szkola.pl", +"targi.pl", +"tm.pl", +"tourism.pl", +"travel.pl", +"turystyka.pl", +"gov.pl", +"ap.gov.pl", +"ic.gov.pl", +"is.gov.pl", +"us.gov.pl", +"kmpsp.gov.pl", +"kppsp.gov.pl", +"kwpsp.gov.pl", +"psp.gov.pl", +"wskr.gov.pl", +"kwp.gov.pl", +"mw.gov.pl", +"ug.gov.pl", +"um.gov.pl", +"umig.gov.pl", +"ugim.gov.pl", +"upow.gov.pl", +"uw.gov.pl", +"starostwo.gov.pl", +"pa.gov.pl", +"po.gov.pl", +"psse.gov.pl", +"pup.gov.pl", +"rzgw.gov.pl", +"sa.gov.pl", +"so.gov.pl", +"sr.gov.pl", +"wsa.gov.pl", +"sko.gov.pl", +"uzs.gov.pl", +"wiih.gov.pl", +"winb.gov.pl", +"pinb.gov.pl", +"wios.gov.pl", +"witd.gov.pl", +"wzmiuw.gov.pl", +"piw.gov.pl", +"wiw.gov.pl", +"griw.gov.pl", +"wif.gov.pl", +"oum.gov.pl", +"sdn.gov.pl", +"zp.gov.pl", +"uppo.gov.pl", +"mup.gov.pl", +"wuoz.gov.pl", +"konsulat.gov.pl", +"oirm.gov.pl", +"augustow.pl", +"babia-gora.pl", +"bedzin.pl", +"beskidy.pl", +"bialowieza.pl", +"bialystok.pl", +"bielawa.pl", +"bieszczady.pl", +"boleslawiec.pl", +"bydgoszcz.pl", +"bytom.pl", +"cieszyn.pl", +"czeladz.pl", +"czest.pl", +"dlugoleka.pl", +"elblag.pl", +"elk.pl", +"glogow.pl", +"gniezno.pl", +"gorlice.pl", +"grajewo.pl", +"ilawa.pl", +"jaworzno.pl", +"jelenia-gora.pl", +"jgora.pl", +"kalisz.pl", +"kazimierz-dolny.pl", +"karpacz.pl", +"kartuzy.pl", +"kaszuby.pl", +"katowice.pl", +"kepno.pl", +"ketrzyn.pl", +"klodzko.pl", +"kobierzyce.pl", +"kolobrzeg.pl", +"konin.pl", +"konskowola.pl", +"kutno.pl", +"lapy.pl", +"lebork.pl", +"legnica.pl", +"lezajsk.pl", +"limanowa.pl", +"lomza.pl", +"lowicz.pl", +"lubin.pl", +"lukow.pl", +"malbork.pl", +"malopolska.pl", +"mazowsze.pl", +"mazury.pl", +"mielec.pl", +"mielno.pl", +"mragowo.pl", +"naklo.pl", +"nowaruda.pl", +"nysa.pl", +"olawa.pl", +"olecko.pl", +"olkusz.pl", +"olsztyn.pl", +"opoczno.pl", +"opole.pl", +"ostroda.pl", +"ostroleka.pl", +"ostrowiec.pl", +"ostrowwlkp.pl", +"pila.pl", +"pisz.pl", +"podhale.pl", +"podlasie.pl", +"polkowice.pl", +"pomorze.pl", +"pomorskie.pl", +"prochowice.pl", +"pruszkow.pl", +"przeworsk.pl", +"pulawy.pl", +"radom.pl", +"rawa-maz.pl", +"rybnik.pl", +"rzeszow.pl", +"sanok.pl", +"sejny.pl", +"slask.pl", +"slupsk.pl", +"sosnowiec.pl", +"stalowa-wola.pl", +"skoczow.pl", +"starachowice.pl", +"stargard.pl", +"suwalki.pl", +"swidnica.pl", +"swiebodzin.pl", +"swinoujscie.pl", +"szczecin.pl", +"szczytno.pl", +"tarnobrzeg.pl", +"tgory.pl", +"turek.pl", +"tychy.pl", +"ustka.pl", +"walbrzych.pl", +"warmia.pl", +"warszawa.pl", +"waw.pl", +"wegrow.pl", +"wielun.pl", +"wlocl.pl", +"wloclawek.pl", +"wodzislaw.pl", +"wolomin.pl", +"wroclaw.pl", +"zachpomor.pl", +"zagan.pl", +"zarow.pl", +"zgora.pl", +"zgorzelec.pl", +"pm", +"pn", +"gov.pn", +"co.pn", +"org.pn", +"edu.pn", +"net.pn", +"post", +"pr", +"com.pr", +"net.pr", +"org.pr", +"gov.pr", +"edu.pr", +"isla.pr", +"pro.pr", +"biz.pr", +"info.pr", +"name.pr", +"est.pr", +"prof.pr", +"ac.pr", +"pro", +"aaa.pro", +"aca.pro", +"acct.pro", +"avocat.pro", +"bar.pro", +"cpa.pro", +"eng.pro", +"jur.pro", +"law.pro", +"med.pro", +"recht.pro", +"ps", +"edu.ps", +"gov.ps", +"sec.ps", +"plo.ps", +"com.ps", +"org.ps", +"net.ps", +"pt", +"net.pt", +"gov.pt", +"org.pt", +"edu.pt", +"int.pt", +"publ.pt", +"com.pt", +"nome.pt", +"pw", +"co.pw", +"ne.pw", +"or.pw", +"ed.pw", +"go.pw", +"belau.pw", +"py", +"com.py", +"coop.py", +"edu.py", +"gov.py", +"mil.py", +"net.py", +"org.py", +"qa", +"com.qa", +"edu.qa", +"gov.qa", +"mil.qa", +"name.qa", +"net.qa", +"org.qa", +"sch.qa", +"re", +"asso.re", +"com.re", +"nom.re", +"ro", +"arts.ro", +"com.ro", +"firm.ro", +"info.ro", +"nom.ro", +"nt.ro", +"org.ro", +"rec.ro", +"store.ro", +"tm.ro", +"www.ro", +"rs", +"ac.rs", +"co.rs", +"edu.rs", +"gov.rs", +"in.rs", +"org.rs", +"ru", +"rw", +"ac.rw", +"co.rw", +"coop.rw", +"gov.rw", +"mil.rw", +"net.rw", +"org.rw", +"sa", +"com.sa", +"net.sa", +"org.sa", +"gov.sa", +"med.sa", +"pub.sa", +"edu.sa", +"sch.sa", +"sb", +"com.sb", +"edu.sb", +"gov.sb", +"net.sb", +"org.sb", +"sc", +"com.sc", +"gov.sc", +"net.sc", +"org.sc", +"edu.sc", +"sd", +"com.sd", +"net.sd", +"org.sd", +"edu.sd", +"med.sd", +"tv.sd", +"gov.sd", +"info.sd", +"se", +"a.se", +"ac.se", +"b.se", +"bd.se", +"brand.se", +"c.se", +"d.se", +"e.se", +"f.se", +"fh.se", +"fhsk.se", +"fhv.se", +"g.se", +"h.se", +"i.se", +"k.se", +"komforb.se", +"kommunalforbund.se", +"komvux.se", +"l.se", +"lanbib.se", +"m.se", +"n.se", +"naturbruksgymn.se", +"o.se", +"org.se", +"p.se", +"parti.se", +"pp.se", +"press.se", +"r.se", +"s.se", +"t.se", +"tm.se", +"u.se", +"w.se", +"x.se", +"y.se", +"z.se", +"sg", +"com.sg", +"net.sg", +"org.sg", +"gov.sg", +"edu.sg", +"per.sg", +"sh", +"com.sh", +"net.sh", +"gov.sh", +"org.sh", +"mil.sh", +"si", +"sj", +"sk", +"sl", +"com.sl", +"net.sl", +"edu.sl", +"gov.sl", +"org.sl", +"sm", +"sn", +"art.sn", +"com.sn", +"edu.sn", +"gouv.sn", +"org.sn", +"perso.sn", +"univ.sn", +"so", +"com.so", +"edu.so", +"gov.so", +"me.so", +"net.so", +"org.so", +"sr", +"ss", +"biz.ss", +"com.ss", +"edu.ss", +"gov.ss", +"net.ss", +"org.ss", +"st", +"co.st", +"com.st", +"consulado.st", +"edu.st", +"embaixada.st", +"gov.st", +"mil.st", +"net.st", +"org.st", +"principe.st", +"saotome.st", +"store.st", +"su", +"sv", +"com.sv", +"edu.sv", +"gob.sv", +"org.sv", +"red.sv", +"sx", +"gov.sx", +"sy", +"edu.sy", +"gov.sy", +"net.sy", +"mil.sy", +"com.sy", +"org.sy", +"sz", +"co.sz", +"ac.sz", +"org.sz", +"tc", +"td", +"tel", +"tf", +"tg", +"th", +"ac.th", +"co.th", +"go.th", +"in.th", +"mi.th", +"net.th", +"or.th", +"tj", +"ac.tj", +"biz.tj", +"co.tj", +"com.tj", +"edu.tj", +"go.tj", +"gov.tj", +"int.tj", +"mil.tj", +"name.tj", +"net.tj", +"nic.tj", +"org.tj", +"test.tj", +"web.tj", +"tk", +"tl", +"gov.tl", +"tm", +"com.tm", +"co.tm", +"org.tm", +"net.tm", +"nom.tm", +"gov.tm", +"mil.tm", +"edu.tm", +"tn", +"com.tn", +"ens.tn", +"fin.tn", +"gov.tn", +"ind.tn", +"intl.tn", +"nat.tn", +"net.tn", +"org.tn", +"info.tn", +"perso.tn", +"tourism.tn", +"edunet.tn", +"rnrt.tn", +"rns.tn", +"rnu.tn", +"mincom.tn", +"agrinet.tn", +"defense.tn", +"turen.tn", +"to", +"com.to", +"gov.to", +"net.to", +"org.to", +"edu.to", +"mil.to", +"tr", +"av.tr", +"bbs.tr", +"bel.tr", +"biz.tr", +"com.tr", +"dr.tr", +"edu.tr", +"gen.tr", +"gov.tr", +"info.tr", +"mil.tr", +"k12.tr", +"kep.tr", +"name.tr", +"net.tr", +"org.tr", +"pol.tr", +"tel.tr", +"tsk.tr", +"tv.tr", +"web.tr", +"nc.tr", +"gov.nc.tr", +"tt", +"co.tt", +"com.tt", +"org.tt", +"net.tt", +"biz.tt", +"info.tt", +"pro.tt", +"int.tt", +"coop.tt", +"jobs.tt", +"mobi.tt", +"travel.tt", +"museum.tt", +"aero.tt", +"name.tt", +"gov.tt", +"edu.tt", +"tv", +"tw", +"edu.tw", +"gov.tw", +"mil.tw", +"com.tw", +"net.tw", +"org.tw", +"idv.tw", +"game.tw", +"ebiz.tw", +"club.tw", +"網路.tw", +"組織.tw", +"商業.tw", +"tz", +"ac.tz", +"co.tz", +"go.tz", +"hotel.tz", +"info.tz", +"me.tz", +"mil.tz", +"mobi.tz", +"ne.tz", +"or.tz", +"sc.tz", +"tv.tz", +"ua", +"com.ua", +"edu.ua", +"gov.ua", +"in.ua", +"net.ua", +"org.ua", +"cherkassy.ua", +"cherkasy.ua", +"chernigov.ua", +"chernihiv.ua", +"chernivtsi.ua", +"chernovtsy.ua", +"ck.ua", +"cn.ua", +"cr.ua", +"crimea.ua", +"cv.ua", +"dn.ua", +"dnepropetrovsk.ua", +"dnipropetrovsk.ua", +"dominic.ua", +"donetsk.ua", +"dp.ua", +"if.ua", +"ivano-frankivsk.ua", +"kh.ua", +"kharkiv.ua", +"kharkov.ua", +"kherson.ua", +"khmelnitskiy.ua", +"khmelnytskyi.ua", +"kiev.ua", +"kirovograd.ua", +"km.ua", +"kr.ua", +"krym.ua", +"ks.ua", +"kv.ua", +"kyiv.ua", +"lg.ua", +"lt.ua", +"lugansk.ua", +"lutsk.ua", +"lv.ua", +"lviv.ua", +"mk.ua", +"mykolaiv.ua", +"nikolaev.ua", +"od.ua", +"odesa.ua", +"odessa.ua", +"pl.ua", +"poltava.ua", +"rivne.ua", +"rovno.ua", +"rv.ua", +"sb.ua", +"sebastopol.ua", +"sevastopol.ua", +"sm.ua", +"sumy.ua", +"te.ua", +"ternopil.ua", +"uz.ua", +"uzhgorod.ua", +"vinnica.ua", +"vinnytsia.ua", +"vn.ua", +"volyn.ua", +"yalta.ua", +"zaporizhzhe.ua", +"zaporizhzhia.ua", +"zhitomir.ua", +"zhytomyr.ua", +"zp.ua", +"zt.ua", +"ug", +"co.ug", +"or.ug", +"ac.ug", +"sc.ug", +"go.ug", +"ne.ug", +"com.ug", +"org.ug", +"uk", +"ac.uk", +"co.uk", +"gov.uk", +"ltd.uk", +"me.uk", +"net.uk", +"nhs.uk", +"org.uk", +"plc.uk", +"police.uk", +"*.sch.uk", +"us", +"dni.us", +"fed.us", +"isa.us", +"kids.us", +"nsn.us", +"ak.us", +"al.us", +"ar.us", +"as.us", +"az.us", +"ca.us", +"co.us", +"ct.us", +"dc.us", +"de.us", +"fl.us", +"ga.us", +"gu.us", +"hi.us", +"ia.us", +"id.us", +"il.us", +"in.us", +"ks.us", +"ky.us", +"la.us", +"ma.us", +"md.us", +"me.us", +"mi.us", +"mn.us", +"mo.us", +"ms.us", +"mt.us", +"nc.us", +"nd.us", +"ne.us", +"nh.us", +"nj.us", +"nm.us", +"nv.us", +"ny.us", +"oh.us", +"ok.us", +"or.us", +"pa.us", +"pr.us", +"ri.us", +"sc.us", +"sd.us", +"tn.us", +"tx.us", +"ut.us", +"vi.us", +"vt.us", +"va.us", +"wa.us", +"wi.us", +"wv.us", +"wy.us", +"k12.ak.us", +"k12.al.us", +"k12.ar.us", +"k12.as.us", +"k12.az.us", +"k12.ca.us", +"k12.co.us", +"k12.ct.us", +"k12.dc.us", +"k12.de.us", +"k12.fl.us", +"k12.ga.us", +"k12.gu.us", +"k12.ia.us", +"k12.id.us", +"k12.il.us", +"k12.in.us", +"k12.ks.us", +"k12.ky.us", +"k12.la.us", +"k12.ma.us", +"k12.md.us", +"k12.me.us", +"k12.mi.us", +"k12.mn.us", +"k12.mo.us", +"k12.ms.us", +"k12.mt.us", +"k12.nc.us", +"k12.ne.us", +"k12.nh.us", +"k12.nj.us", +"k12.nm.us", +"k12.nv.us", +"k12.ny.us", +"k12.oh.us", +"k12.ok.us", +"k12.or.us", +"k12.pa.us", +"k12.pr.us", +"k12.ri.us", +"k12.sc.us", +"k12.tn.us", +"k12.tx.us", +"k12.ut.us", +"k12.vi.us", +"k12.vt.us", +"k12.va.us", +"k12.wa.us", +"k12.wi.us", +"k12.wy.us", +"cc.ak.us", +"cc.al.us", +"cc.ar.us", +"cc.as.us", +"cc.az.us", +"cc.ca.us", +"cc.co.us", +"cc.ct.us", +"cc.dc.us", +"cc.de.us", +"cc.fl.us", +"cc.ga.us", +"cc.gu.us", +"cc.hi.us", +"cc.ia.us", +"cc.id.us", +"cc.il.us", +"cc.in.us", +"cc.ks.us", +"cc.ky.us", +"cc.la.us", +"cc.ma.us", +"cc.md.us", +"cc.me.us", +"cc.mi.us", +"cc.mn.us", +"cc.mo.us", +"cc.ms.us", +"cc.mt.us", +"cc.nc.us", +"cc.nd.us", +"cc.ne.us", +"cc.nh.us", +"cc.nj.us", +"cc.nm.us", +"cc.nv.us", +"cc.ny.us", +"cc.oh.us", +"cc.ok.us", +"cc.or.us", +"cc.pa.us", +"cc.pr.us", +"cc.ri.us", +"cc.sc.us", +"cc.sd.us", +"cc.tn.us", +"cc.tx.us", +"cc.ut.us", +"cc.vi.us", +"cc.vt.us", +"cc.va.us", +"cc.wa.us", +"cc.wi.us", +"cc.wv.us", +"cc.wy.us", +"lib.ak.us", +"lib.al.us", +"lib.ar.us", +"lib.as.us", +"lib.az.us", +"lib.ca.us", +"lib.co.us", +"lib.ct.us", +"lib.dc.us", +"lib.fl.us", +"lib.ga.us", +"lib.gu.us", +"lib.hi.us", +"lib.ia.us", +"lib.id.us", +"lib.il.us", +"lib.in.us", +"lib.ks.us", +"lib.ky.us", +"lib.la.us", +"lib.ma.us", +"lib.md.us", +"lib.me.us", +"lib.mi.us", +"lib.mn.us", +"lib.mo.us", +"lib.ms.us", +"lib.mt.us", +"lib.nc.us", +"lib.nd.us", +"lib.ne.us", +"lib.nh.us", +"lib.nj.us", +"lib.nm.us", +"lib.nv.us", +"lib.ny.us", +"lib.oh.us", +"lib.ok.us", +"lib.or.us", +"lib.pa.us", +"lib.pr.us", +"lib.ri.us", +"lib.sc.us", +"lib.sd.us", +"lib.tn.us", +"lib.tx.us", +"lib.ut.us", +"lib.vi.us", +"lib.vt.us", +"lib.va.us", +"lib.wa.us", +"lib.wi.us", +"lib.wy.us", +"pvt.k12.ma.us", +"chtr.k12.ma.us", +"paroch.k12.ma.us", +"ann-arbor.mi.us", +"cog.mi.us", +"dst.mi.us", +"eaton.mi.us", +"gen.mi.us", +"mus.mi.us", +"tec.mi.us", +"washtenaw.mi.us", +"uy", +"com.uy", +"edu.uy", +"gub.uy", +"mil.uy", +"net.uy", +"org.uy", +"uz", +"co.uz", +"com.uz", +"net.uz", +"org.uz", +"va", +"vc", +"com.vc", +"net.vc", +"org.vc", +"gov.vc", +"mil.vc", +"edu.vc", +"ve", +"arts.ve", +"co.ve", +"com.ve", +"e12.ve", +"edu.ve", +"firm.ve", +"gob.ve", +"gov.ve", +"info.ve", +"int.ve", +"mil.ve", +"net.ve", +"org.ve", +"rec.ve", +"store.ve", +"tec.ve", +"web.ve", +"vg", +"vi", +"co.vi", +"com.vi", +"k12.vi", +"net.vi", +"org.vi", +"vn", +"com.vn", +"net.vn", +"org.vn", +"edu.vn", +"gov.vn", +"int.vn", +"ac.vn", +"biz.vn", +"info.vn", +"name.vn", +"pro.vn", +"health.vn", +"vu", +"com.vu", +"edu.vu", +"net.vu", +"org.vu", +"wf", +"ws", +"com.ws", +"net.ws", +"org.ws", +"gov.ws", +"edu.ws", +"yt", +"امارات", +"հայ", +"বাংলা", +"бг", +"бел", +"中国", +"中國", +"الجزائر", +"مصر", +"ею", +"ευ", +"موريتانيا", +"გე", +"ελ", +"香港", +"公司.香港", +"教育.香港", +"政府.香港", +"個人.香港", +"網絡.香港", +"組織.香港", +"ಭಾರತ", +"ଭାରତ", +"ভাৰত", +"भारतम्", +"भारोत", +"ڀارت", +"ഭാരതം", +"भारत", +"بارت", +"بھارت", +"భారత్", +"ભારત", +"ਭਾਰਤ", +"ভারত", +"இந்தியா", +"ایران", +"ايران", +"عراق", +"الاردن", +"한국", +"қаз", +"ලංකා", +"இலங்கை", +"المغرب", +"мкд", +"мон", +"澳門", +"澳门", +"مليسيا", +"عمان", +"پاکستان", +"پاكستان", +"فلسطين", +"срб", +"пр.срб", +"орг.срб", +"обр.срб", +"од.срб", +"упр.срб", +"ак.срб", +"рф", +"قطر", +"السعودية", +"السعودیة", +"السعودیۃ", +"السعوديه", +"سودان", +"新加坡", +"சிங்கப்பூர்", +"سورية", +"سوريا", +"ไทย", +"ศึกษา.ไทย", +"ธุรกิจ.ไทย", +"รัฐบาล.ไทย", +"ทหาร.ไทย", +"เน็ต.ไทย", +"องค์กร.ไทย", +"تونس", +"台灣", +"台湾", +"臺灣", +"укр", +"اليمن", +"xxx", +"*.ye", +"ac.za", +"agric.za", +"alt.za", +"co.za", +"edu.za", +"gov.za", +"grondar.za", +"law.za", +"mil.za", +"net.za", +"ngo.za", +"nic.za", +"nis.za", +"nom.za", +"org.za", +"school.za", +"tm.za", +"web.za", +"zm", +"ac.zm", +"biz.zm", +"co.zm", +"com.zm", +"edu.zm", +"gov.zm", +"info.zm", +"mil.zm", +"net.zm", +"org.zm", +"sch.zm", +"zw", +"ac.zw", +"co.zw", +"gov.zw", +"mil.zw", +"org.zw", +"aaa", +"aarp", +"abarth", +"abb", +"abbott", +"abbvie", +"abc", +"able", +"abogado", +"abudhabi", +"academy", +"accenture", +"accountant", +"accountants", +"aco", +"actor", +"adac", +"ads", +"adult", +"aeg", +"aetna", +"afamilycompany", +"afl", +"africa", +"agakhan", +"agency", +"aig", +"aigo", +"airbus", +"airforce", +"airtel", +"akdn", +"alfaromeo", +"alibaba", +"alipay", +"allfinanz", +"allstate", +"ally", +"alsace", +"alstom", +"amazon", +"americanexpress", +"americanfamily", +"amex", +"amfam", +"amica", +"amsterdam", +"analytics", +"android", +"anquan", +"anz", +"aol", +"apartments", +"app", +"apple", +"aquarelle", +"arab", +"aramco", +"archi", +"army", +"art", +"arte", +"asda", +"associates", +"athleta", +"attorney", +"auction", +"audi", +"audible", +"audio", +"auspost", +"author", +"auto", +"autos", +"avianca", +"aws", +"axa", +"azure", +"baby", +"baidu", +"banamex", +"bananarepublic", +"band", +"bank", +"bar", +"barcelona", +"barclaycard", +"barclays", +"barefoot", +"bargains", +"baseball", +"basketball", +"bauhaus", +"bayern", +"bbc", +"bbt", +"bbva", +"bcg", +"bcn", +"beats", +"beauty", +"beer", +"bentley", +"berlin", +"best", +"bestbuy", +"bet", +"bharti", +"bible", +"bid", +"bike", +"bing", +"bingo", +"bio", +"black", +"blackfriday", +"blockbuster", +"blog", +"bloomberg", +"blue", +"bms", +"bmw", +"bnpparibas", +"boats", +"boehringer", +"bofa", +"bom", +"bond", +"boo", +"book", +"booking", +"bosch", +"bostik", +"boston", +"bot", +"boutique", +"box", +"bradesco", +"bridgestone", +"broadway", +"broker", +"brother", +"brussels", +"budapest", +"bugatti", +"build", +"builders", +"business", +"buy", +"buzz", +"bzh", +"cab", +"cafe", +"cal", +"call", +"calvinklein", +"cam", +"camera", +"camp", +"cancerresearch", +"canon", +"capetown", +"capital", +"capitalone", +"car", +"caravan", +"cards", +"care", +"career", +"careers", +"cars", +"casa", +"case", +"caseih", +"cash", +"casino", +"catering", +"catholic", +"cba", +"cbn", +"cbre", +"cbs", +"ceb", +"center", +"ceo", +"cern", +"cfa", +"cfd", +"chanel", +"channel", +"charity", +"chase", +"chat", +"cheap", +"chintai", +"christmas", +"chrome", +"church", +"cipriani", +"circle", +"cisco", +"citadel", +"citi", +"citic", +"city", +"cityeats", +"claims", +"cleaning", +"click", +"clinic", +"clinique", +"clothing", +"cloud", +"club", +"clubmed", +"coach", +"codes", +"coffee", +"college", +"cologne", +"comcast", +"commbank", +"community", +"company", +"compare", +"computer", +"comsec", +"condos", +"construction", +"consulting", +"contact", +"contractors", +"cooking", +"cookingchannel", +"cool", +"corsica", +"country", +"coupon", +"coupons", +"courses", +"cpa", +"credit", +"creditcard", +"creditunion", +"cricket", +"crown", +"crs", +"cruise", +"cruises", +"csc", +"cuisinella", +"cymru", +"cyou", +"dabur", +"dad", +"dance", +"data", +"date", +"dating", +"datsun", +"day", +"dclk", +"dds", +"deal", +"dealer", +"deals", +"degree", +"delivery", +"dell", +"deloitte", +"delta", +"democrat", +"dental", +"dentist", +"desi", +"design", +"dev", +"dhl", +"diamonds", +"diet", +"digital", +"direct", +"directory", +"discount", +"discover", +"dish", +"diy", +"dnp", +"docs", +"doctor", +"dog", +"domains", +"dot", +"download", +"drive", +"dtv", +"dubai", +"duck", +"dunlop", +"dupont", +"durban", +"dvag", +"dvr", +"earth", +"eat", +"eco", +"edeka", +"education", +"email", +"emerck", +"energy", +"engineer", +"engineering", +"enterprises", +"epson", +"equipment", +"ericsson", +"erni", +"esq", +"estate", +"esurance", +"etisalat", +"eurovision", +"eus", +"events", +"exchange", +"expert", +"exposed", +"express", +"extraspace", +"fage", +"fail", +"fairwinds", +"faith", +"family", +"fan", +"fans", +"farm", +"farmers", +"fashion", +"fast", +"fedex", +"feedback", +"ferrari", +"ferrero", +"fiat", +"fidelity", +"fido", +"film", +"final", +"finance", +"financial", +"fire", +"firestone", +"firmdale", +"fish", +"fishing", +"fit", +"fitness", +"flickr", +"flights", +"flir", +"florist", +"flowers", +"fly", +"foo", +"food", +"foodnetwork", +"football", +"ford", +"forex", +"forsale", +"forum", +"foundation", +"fox", +"free", +"fresenius", +"frl", +"frogans", +"frontdoor", +"frontier", +"ftr", +"fujitsu", +"fujixerox", +"fun", +"fund", +"furniture", +"futbol", +"fyi", +"gal", +"gallery", +"gallo", +"gallup", +"game", +"games", +"gap", +"garden", +"gay", +"gbiz", +"gdn", +"gea", +"gent", +"genting", +"george", +"ggee", +"gift", +"gifts", +"gives", +"giving", +"glade", +"glass", +"gle", +"global", +"globo", +"gmail", +"gmbh", +"gmo", +"gmx", +"godaddy", +"gold", +"goldpoint", +"golf", +"goo", +"goodyear", +"goog", +"google", +"gop", +"got", +"grainger", +"graphics", +"gratis", +"green", +"gripe", +"grocery", +"group", +"guardian", +"gucci", +"guge", +"guide", +"guitars", +"guru", +"hair", +"hamburg", +"hangout", +"haus", +"hbo", +"hdfc", +"hdfcbank", +"health", +"healthcare", +"help", +"helsinki", +"here", +"hermes", +"hgtv", +"hiphop", +"hisamitsu", +"hitachi", +"hiv", +"hkt", +"hockey", +"holdings", +"holiday", +"homedepot", +"homegoods", +"homes", +"homesense", +"honda", +"horse", +"hospital", +"host", +"hosting", +"hot", +"hoteles", +"hotels", +"hotmail", +"house", +"how", +"hsbc", +"hughes", +"hyatt", +"hyundai", +"ibm", +"icbc", +"ice", +"icu", +"ieee", +"ifm", +"ikano", +"imamat", +"imdb", +"immo", +"immobilien", +"inc", +"industries", +"infiniti", +"ing", +"ink", +"institute", +"insurance", +"insure", +"intel", +"international", +"intuit", +"investments", +"ipiranga", +"irish", +"ismaili", +"ist", +"istanbul", +"itau", +"itv", +"iveco", +"jaguar", +"java", +"jcb", +"jcp", +"jeep", +"jetzt", +"jewelry", +"jio", +"jll", +"jmp", +"jnj", +"joburg", +"jot", +"joy", +"jpmorgan", +"jprs", +"juegos", +"juniper", +"kaufen", +"kddi", +"kerryhotels", +"kerrylogistics", +"kerryproperties", +"kfh", +"kia", +"kim", +"kinder", +"kindle", +"kitchen", +"kiwi", +"koeln", +"komatsu", +"kosher", +"kpmg", +"kpn", +"krd", +"kred", +"kuokgroup", +"kyoto", +"lacaixa", +"lamborghini", +"lamer", +"lancaster", +"lancia", +"land", +"landrover", +"lanxess", +"lasalle", +"lat", +"latino", +"latrobe", +"law", +"lawyer", +"lds", +"lease", +"leclerc", +"lefrak", +"legal", +"lego", +"lexus", +"lgbt", +"lidl", +"life", +"lifeinsurance", +"lifestyle", +"lighting", +"like", +"lilly", +"limited", +"limo", +"lincoln", +"linde", +"link", +"lipsy", +"live", +"living", +"lixil", +"llc", +"llp", +"loan", +"loans", +"locker", +"locus", +"loft", +"lol", +"london", +"lotte", +"lotto", +"love", +"lpl", +"lplfinancial", +"ltd", +"ltda", +"lundbeck", +"lupin", +"luxe", +"luxury", +"macys", +"madrid", +"maif", +"maison", +"makeup", +"man", +"management", +"mango", +"map", +"market", +"marketing", +"markets", +"marriott", +"marshalls", +"maserati", +"mattel", +"mba", +"mckinsey", +"med", +"media", +"meet", +"melbourne", +"meme", +"memorial", +"men", +"menu", +"merckmsd", +"metlife", +"miami", +"microsoft", +"mini", +"mint", +"mit", +"mitsubishi", +"mlb", +"mls", +"mma", +"mobile", +"moda", +"moe", +"moi", +"mom", +"monash", +"money", +"monster", +"mormon", +"mortgage", +"moscow", +"moto", +"motorcycles", +"mov", +"movie", +"msd", +"mtn", +"mtr", +"mutual", +"nab", +"nadex", +"nagoya", +"nationwide", +"natura", +"navy", +"nba", +"nec", +"netbank", +"netflix", +"network", +"neustar", +"new", +"newholland", +"news", +"next", +"nextdirect", +"nexus", +"nfl", +"ngo", +"nhk", +"nico", +"nike", +"nikon", +"ninja", +"nissan", +"nissay", +"nokia", +"northwesternmutual", +"norton", +"now", +"nowruz", +"nowtv", +"nra", +"nrw", +"ntt", +"nyc", +"obi", +"observer", +"off", +"office", +"okinawa", +"olayan", +"olayangroup", +"oldnavy", +"ollo", +"omega", +"one", +"ong", +"onl", +"online", +"onyourside", +"ooo", +"open", +"oracle", +"orange", +"organic", +"origins", +"osaka", +"otsuka", +"ott", +"ovh", +"page", +"panasonic", +"paris", +"pars", +"partners", +"parts", +"party", +"passagens", +"pay", +"pccw", +"pet", +"pfizer", +"pharmacy", +"phd", +"philips", +"phone", +"photo", +"photography", +"photos", +"physio", +"pics", +"pictet", +"pictures", +"pid", +"pin", +"ping", +"pink", +"pioneer", +"pizza", +"place", +"play", +"playstation", +"plumbing", +"plus", +"pnc", +"pohl", +"poker", +"politie", +"porn", +"pramerica", +"praxi", +"press", +"prime", +"prod", +"productions", +"prof", +"progressive", +"promo", +"properties", +"property", +"protection", +"pru", +"prudential", +"pub", +"pwc", +"qpon", +"quebec", +"quest", +"qvc", +"racing", +"radio", +"raid", +"read", +"realestate", +"realtor", +"realty", +"recipes", +"red", +"redstone", +"redumbrella", +"rehab", +"reise", +"reisen", +"reit", +"reliance", +"ren", +"rent", +"rentals", +"repair", +"report", +"republican", +"rest", +"restaurant", +"review", +"reviews", +"rexroth", +"rich", +"richardli", +"ricoh", +"rightathome", +"ril", +"rio", +"rip", +"rmit", +"rocher", +"rocks", +"rodeo", +"rogers", +"room", +"rsvp", +"rugby", +"ruhr", +"run", +"rwe", +"ryukyu", +"saarland", +"safe", +"safety", +"sakura", +"sale", +"salon", +"samsclub", +"samsung", +"sandvik", +"sandvikcoromant", +"sanofi", +"sap", +"sarl", +"sas", +"save", +"saxo", +"sbi", +"sbs", +"sca", +"scb", +"schaeffler", +"schmidt", +"scholarships", +"school", +"schule", +"schwarz", +"science", +"scjohnson", +"scor", +"scot", +"search", +"seat", +"secure", +"security", +"seek", +"select", +"sener", +"services", +"ses", +"seven", +"sew", +"sex", +"sexy", +"sfr", +"shangrila", +"sharp", +"shaw", +"shell", +"shia", +"shiksha", +"shoes", +"shop", +"shopping", +"shouji", +"show", +"showtime", +"shriram", +"silk", +"sina", +"singles", +"site", +"ski", +"skin", +"sky", +"skype", +"sling", +"smart", +"smile", +"sncf", +"soccer", +"social", +"softbank", +"software", +"sohu", +"solar", +"solutions", +"song", +"sony", +"soy", +"spa", +"space", +"sport", +"spot", +"spreadbetting", +"srl", +"stada", +"staples", +"star", +"statebank", +"statefarm", +"stc", +"stcgroup", +"stockholm", +"storage", +"store", +"stream", +"studio", +"study", +"style", +"sucks", +"supplies", +"supply", +"support", +"surf", +"surgery", +"suzuki", +"swatch", +"swiftcover", +"swiss", +"sydney", +"symantec", +"systems", +"tab", +"taipei", +"talk", +"taobao", +"target", +"tatamotors", +"tatar", +"tattoo", +"tax", +"taxi", +"tci", +"tdk", +"team", +"tech", +"technology", +"temasek", +"tennis", +"teva", +"thd", +"theater", +"theatre", +"tiaa", +"tickets", +"tienda", +"tiffany", +"tips", +"tires", +"tirol", +"tjmaxx", +"tjx", +"tkmaxx", +"tmall", +"today", +"tokyo", +"tools", +"top", +"toray", +"toshiba", +"total", +"tours", +"town", +"toyota", +"toys", +"trade", +"trading", +"training", +"travel", +"travelchannel", +"travelers", +"travelersinsurance", +"trust", +"trv", +"tube", +"tui", +"tunes", +"tushu", +"tvs", +"ubank", +"ubs", +"unicom", +"university", +"uno", +"uol", +"ups", +"vacations", +"vana", +"vanguard", +"vegas", +"ventures", +"verisign", +"versicherung", +"vet", +"viajes", +"video", +"vig", +"viking", +"villas", +"vin", +"vip", +"virgin", +"visa", +"vision", +"viva", +"vivo", +"vlaanderen", +"vodka", +"volkswagen", +"volvo", +"vote", +"voting", +"voto", +"voyage", +"vuelos", +"wales", +"walmart", +"walter", +"wang", +"wanggou", +"watch", +"watches", +"weather", +"weatherchannel", +"webcam", +"weber", +"website", +"wed", +"wedding", +"weibo", +"weir", +"whoswho", +"wien", +"wiki", +"williamhill", +"win", +"windows", +"wine", +"winners", +"wme", +"wolterskluwer", +"woodside", +"work", +"works", +"world", +"wow", +"wtc", +"wtf", +"xbox", +"xerox", +"xfinity", +"xihuan", +"xin", +"कॉम", +"セール", +"佛山", +"慈善", +"集团", +"在线", +"大众汽车", +"点看", +"คอม", +"八卦", +"موقع", +"公益", +"公司", +"香格里拉", +"网站", +"移动", +"我爱你", +"москва", +"католик", +"онлайн", +"сайт", +"联通", +"קום", +"时尚", +"微博", +"淡马锡", +"ファッション", +"орг", +"नेट", +"ストア", +"アマゾン", +"삼성", +"商标", +"商店", +"商城", +"дети", +"ポイント", +"新闻", +"工行", +"家電", +"كوم", +"中文网", +"中信", +"娱乐", +"谷歌", +"電訊盈科", +"购物", +"クラウド", +"通販", +"网店", +"संगठन", +"餐厅", +"网络", +"ком", +"亚马逊", +"诺基亚", +"食品", +"飞利浦", +"手表", +"手机", +"ارامكو", +"العليان", +"اتصالات", +"بازار", +"ابوظبي", +"كاثوليك", +"همراه", +"닷컴", +"政府", +"شبكة", +"بيتك", +"عرب", +"机构", +"组织机构", +"健康", +"招聘", +"рус", +"珠宝", +"大拿", +"みんな", +"グーグル", +"世界", +"書籍", +"网址", +"닷넷", +"コム", +"天主教", +"游戏", +"vermögensberater", +"vermögensberatung", +"企业", +"信息", +"嘉里大酒店", +"嘉里", +"广东", +"政务", +"xyz", +"yachts", +"yahoo", +"yamaxun", +"yandex", +"yodobashi", +"yoga", +"yokohama", +"you", +"youtube", +"yun", +"zappos", +"zara", +"zero", +"zip", +"zone", +"zuerich", +"cc.ua", +"inf.ua", +"ltd.ua", +"adobeaemcloud.com", +"adobeaemcloud.net", +"*.dev.adobeaemcloud.com", +"beep.pl", +"barsy.ca", +"*.compute.estate", +"*.alces.network", +"altervista.org", +"alwaysdata.net", +"cloudfront.net", +"*.compute.amazonaws.com", +"*.compute-1.amazonaws.com", +"*.compute.amazonaws.com.cn", +"us-east-1.amazonaws.com", +"cn-north-1.eb.amazonaws.com.cn", +"cn-northwest-1.eb.amazonaws.com.cn", +"elasticbeanstalk.com", +"ap-northeast-1.elasticbeanstalk.com", +"ap-northeast-2.elasticbeanstalk.com", +"ap-northeast-3.elasticbeanstalk.com", +"ap-south-1.elasticbeanstalk.com", +"ap-southeast-1.elasticbeanstalk.com", +"ap-southeast-2.elasticbeanstalk.com", +"ca-central-1.elasticbeanstalk.com", +"eu-central-1.elasticbeanstalk.com", +"eu-west-1.elasticbeanstalk.com", +"eu-west-2.elasticbeanstalk.com", +"eu-west-3.elasticbeanstalk.com", +"sa-east-1.elasticbeanstalk.com", +"us-east-1.elasticbeanstalk.com", +"us-east-2.elasticbeanstalk.com", +"us-gov-west-1.elasticbeanstalk.com", +"us-west-1.elasticbeanstalk.com", +"us-west-2.elasticbeanstalk.com", +"*.elb.amazonaws.com", +"*.elb.amazonaws.com.cn", +"s3.amazonaws.com", +"s3-ap-northeast-1.amazonaws.com", +"s3-ap-northeast-2.amazonaws.com", +"s3-ap-south-1.amazonaws.com", +"s3-ap-southeast-1.amazonaws.com", +"s3-ap-southeast-2.amazonaws.com", +"s3-ca-central-1.amazonaws.com", +"s3-eu-central-1.amazonaws.com", +"s3-eu-west-1.amazonaws.com", +"s3-eu-west-2.amazonaws.com", +"s3-eu-west-3.amazonaws.com", +"s3-external-1.amazonaws.com", +"s3-fips-us-gov-west-1.amazonaws.com", +"s3-sa-east-1.amazonaws.com", +"s3-us-gov-west-1.amazonaws.com", +"s3-us-east-2.amazonaws.com", +"s3-us-west-1.amazonaws.com", +"s3-us-west-2.amazonaws.com", +"s3.ap-northeast-2.amazonaws.com", +"s3.ap-south-1.amazonaws.com", +"s3.cn-north-1.amazonaws.com.cn", +"s3.ca-central-1.amazonaws.com", +"s3.eu-central-1.amazonaws.com", +"s3.eu-west-2.amazonaws.com", +"s3.eu-west-3.amazonaws.com", +"s3.us-east-2.amazonaws.com", +"s3.dualstack.ap-northeast-1.amazonaws.com", +"s3.dualstack.ap-northeast-2.amazonaws.com", +"s3.dualstack.ap-south-1.amazonaws.com", +"s3.dualstack.ap-southeast-1.amazonaws.com", +"s3.dualstack.ap-southeast-2.amazonaws.com", +"s3.dualstack.ca-central-1.amazonaws.com", +"s3.dualstack.eu-central-1.amazonaws.com", +"s3.dualstack.eu-west-1.amazonaws.com", +"s3.dualstack.eu-west-2.amazonaws.com", +"s3.dualstack.eu-west-3.amazonaws.com", +"s3.dualstack.sa-east-1.amazonaws.com", +"s3.dualstack.us-east-1.amazonaws.com", +"s3.dualstack.us-east-2.amazonaws.com", +"s3-website-us-east-1.amazonaws.com", +"s3-website-us-west-1.amazonaws.com", +"s3-website-us-west-2.amazonaws.com", +"s3-website-ap-northeast-1.amazonaws.com", +"s3-website-ap-southeast-1.amazonaws.com", +"s3-website-ap-southeast-2.amazonaws.com", +"s3-website-eu-west-1.amazonaws.com", +"s3-website-sa-east-1.amazonaws.com", +"s3-website.ap-northeast-2.amazonaws.com", +"s3-website.ap-south-1.amazonaws.com", +"s3-website.ca-central-1.amazonaws.com", +"s3-website.eu-central-1.amazonaws.com", +"s3-website.eu-west-2.amazonaws.com", +"s3-website.eu-west-3.amazonaws.com", +"s3-website.us-east-2.amazonaws.com", +"amsw.nl", +"t3l3p0rt.net", +"tele.amune.org", +"apigee.io", +"on-aptible.com", +"user.aseinet.ne.jp", +"gv.vc", +"d.gv.vc", +"user.party.eus", +"pimienta.org", +"poivron.org", +"potager.org", +"sweetpepper.org", +"myasustor.com", +"myfritz.net", +"*.awdev.ca", +"*.advisor.ws", +"b-data.io", +"backplaneapp.io", +"balena-devices.com", +"app.banzaicloud.io", +"betainabox.com", +"bnr.la", +"blackbaudcdn.net", +"boomla.net", +"boxfuse.io", +"square7.ch", +"bplaced.com", +"bplaced.de", +"square7.de", +"bplaced.net", +"square7.net", +"browsersafetymark.io", +"uk0.bigv.io", +"dh.bytemark.co.uk", +"vm.bytemark.co.uk", +"mycd.eu", +"carrd.co", +"crd.co", +"uwu.ai", +"ae.org", +"ar.com", +"br.com", +"cn.com", +"com.de", +"com.se", +"de.com", +"eu.com", +"gb.com", +"gb.net", +"hu.com", +"hu.net", +"jp.net", +"jpn.com", +"kr.com", +"mex.com", +"no.com", +"qc.com", +"ru.com", +"sa.com", +"se.net", +"uk.com", +"uk.net", +"us.com", +"uy.com", +"za.bz", +"za.com", +"africa.com", +"gr.com", +"in.net", +"us.org", +"co.com", +"c.la", +"certmgr.org", +"xenapponazure.com", +"discourse.group", +"discourse.team", +"virtueeldomein.nl", +"cleverapps.io", +"*.lcl.dev", +"*.stg.dev", +"c66.me", +"cloud66.ws", +"cloud66.zone", +"jdevcloud.com", +"wpdevcloud.com", +"cloudaccess.host", +"freesite.host", +"cloudaccess.net", +"cloudcontrolled.com", +"cloudcontrolapp.com", +"cloudera.site", +"trycloudflare.com", +"workers.dev", +"wnext.app", +"co.ca", +"*.otap.co", +"co.cz", +"c.cdn77.org", +"cdn77-ssl.net", +"r.cdn77.net", +"rsc.cdn77.org", +"ssl.origin.cdn77-secure.org", +"cloudns.asia", +"cloudns.biz", +"cloudns.club", +"cloudns.cc", +"cloudns.eu", +"cloudns.in", +"cloudns.info", +"cloudns.org", +"cloudns.pro", +"cloudns.pw", +"cloudns.us", +"cloudeity.net", +"cnpy.gdn", +"co.nl", +"co.no", +"webhosting.be", +"hosting-cluster.nl", +"ac.ru", +"edu.ru", +"gov.ru", +"int.ru", +"mil.ru", +"test.ru", +"dyn.cosidns.de", +"dynamisches-dns.de", +"dnsupdater.de", +"internet-dns.de", +"l-o-g-i-n.de", +"dynamic-dns.info", +"feste-ip.net", +"knx-server.net", +"static-access.net", +"realm.cz", +"*.cryptonomic.net", +"cupcake.is", +"*.customer-oci.com", +"*.oci.customer-oci.com", +"*.ocp.customer-oci.com", +"*.ocs.customer-oci.com", +"cyon.link", +"cyon.site", +"daplie.me", +"localhost.daplie.me", +"dattolocal.com", +"dattorelay.com", +"dattoweb.com", +"mydatto.com", +"dattolocal.net", +"mydatto.net", +"biz.dk", +"co.dk", +"firm.dk", +"reg.dk", +"store.dk", +"*.dapps.earth", +"*.bzz.dapps.earth", +"builtwithdark.com", +"edgestack.me", +"debian.net", +"dedyn.io", +"dnshome.de", +"online.th", +"shop.th", +"drayddns.com", +"dreamhosters.com", +"mydrobo.com", +"drud.io", +"drud.us", +"duckdns.org", +"dy.fi", +"tunk.org", +"dyndns-at-home.com", +"dyndns-at-work.com", +"dyndns-blog.com", +"dyndns-free.com", +"dyndns-home.com", +"dyndns-ip.com", +"dyndns-mail.com", +"dyndns-office.com", +"dyndns-pics.com", +"dyndns-remote.com", +"dyndns-server.com", +"dyndns-web.com", +"dyndns-wiki.com", +"dyndns-work.com", +"dyndns.biz", +"dyndns.info", +"dyndns.org", +"dyndns.tv", +"at-band-camp.net", +"ath.cx", +"barrel-of-knowledge.info", +"barrell-of-knowledge.info", +"better-than.tv", +"blogdns.com", +"blogdns.net", +"blogdns.org", +"blogsite.org", +"boldlygoingnowhere.org", +"broke-it.net", +"buyshouses.net", +"cechire.com", +"dnsalias.com", +"dnsalias.net", +"dnsalias.org", +"dnsdojo.com", +"dnsdojo.net", +"dnsdojo.org", +"does-it.net", +"doesntexist.com", +"doesntexist.org", +"dontexist.com", +"dontexist.net", +"dontexist.org", +"doomdns.com", +"doomdns.org", +"dvrdns.org", +"dyn-o-saur.com", +"dynalias.com", +"dynalias.net", +"dynalias.org", +"dynathome.net", +"dyndns.ws", +"endofinternet.net", +"endofinternet.org", +"endoftheinternet.org", +"est-a-la-maison.com", +"est-a-la-masion.com", +"est-le-patron.com", +"est-mon-blogueur.com", +"for-better.biz", +"for-more.biz", +"for-our.info", +"for-some.biz", +"for-the.biz", +"forgot.her.name", +"forgot.his.name", +"from-ak.com", +"from-al.com", +"from-ar.com", +"from-az.net", +"from-ca.com", +"from-co.net", +"from-ct.com", +"from-dc.com", +"from-de.com", +"from-fl.com", +"from-ga.com", +"from-hi.com", +"from-ia.com", +"from-id.com", +"from-il.com", +"from-in.com", +"from-ks.com", +"from-ky.com", +"from-la.net", +"from-ma.com", +"from-md.com", +"from-me.org", +"from-mi.com", +"from-mn.com", +"from-mo.com", +"from-ms.com", +"from-mt.com", +"from-nc.com", +"from-nd.com", +"from-ne.com", +"from-nh.com", +"from-nj.com", +"from-nm.com", +"from-nv.com", +"from-ny.net", +"from-oh.com", +"from-ok.com", +"from-or.com", +"from-pa.com", +"from-pr.com", +"from-ri.com", +"from-sc.com", +"from-sd.com", +"from-tn.com", +"from-tx.com", +"from-ut.com", +"from-va.com", +"from-vt.com", +"from-wa.com", +"from-wi.com", +"from-wv.com", +"from-wy.com", +"ftpaccess.cc", +"fuettertdasnetz.de", +"game-host.org", +"game-server.cc", +"getmyip.com", +"gets-it.net", +"go.dyndns.org", +"gotdns.com", +"gotdns.org", +"groks-the.info", +"groks-this.info", +"ham-radio-op.net", +"here-for-more.info", +"hobby-site.com", +"hobby-site.org", +"home.dyndns.org", +"homedns.org", +"homeftp.net", +"homeftp.org", +"homeip.net", +"homelinux.com", +"homelinux.net", +"homelinux.org", +"homeunix.com", +"homeunix.net", +"homeunix.org", +"iamallama.com", +"in-the-band.net", +"is-a-anarchist.com", +"is-a-blogger.com", +"is-a-bookkeeper.com", +"is-a-bruinsfan.org", +"is-a-bulls-fan.com", +"is-a-candidate.org", +"is-a-caterer.com", +"is-a-celticsfan.org", +"is-a-chef.com", +"is-a-chef.net", +"is-a-chef.org", +"is-a-conservative.com", +"is-a-cpa.com", +"is-a-cubicle-slave.com", +"is-a-democrat.com", +"is-a-designer.com", +"is-a-doctor.com", +"is-a-financialadvisor.com", +"is-a-geek.com", +"is-a-geek.net", +"is-a-geek.org", +"is-a-green.com", +"is-a-guru.com", +"is-a-hard-worker.com", +"is-a-hunter.com", +"is-a-knight.org", +"is-a-landscaper.com", +"is-a-lawyer.com", +"is-a-liberal.com", +"is-a-libertarian.com", +"is-a-linux-user.org", +"is-a-llama.com", +"is-a-musician.com", +"is-a-nascarfan.com", +"is-a-nurse.com", +"is-a-painter.com", +"is-a-patsfan.org", +"is-a-personaltrainer.com", +"is-a-photographer.com", +"is-a-player.com", +"is-a-republican.com", +"is-a-rockstar.com", +"is-a-socialist.com", +"is-a-soxfan.org", +"is-a-student.com", +"is-a-teacher.com", +"is-a-techie.com", +"is-a-therapist.com", +"is-an-accountant.com", +"is-an-actor.com", +"is-an-actress.com", +"is-an-anarchist.com", +"is-an-artist.com", +"is-an-engineer.com", +"is-an-entertainer.com", +"is-by.us", +"is-certified.com", +"is-found.org", +"is-gone.com", +"is-into-anime.com", +"is-into-cars.com", +"is-into-cartoons.com", +"is-into-games.com", +"is-leet.com", +"is-lost.org", +"is-not-certified.com", +"is-saved.org", +"is-slick.com", +"is-uberleet.com", +"is-very-bad.org", +"is-very-evil.org", +"is-very-good.org", +"is-very-nice.org", +"is-very-sweet.org", +"is-with-theband.com", +"isa-geek.com", +"isa-geek.net", +"isa-geek.org", +"isa-hockeynut.com", +"issmarterthanyou.com", +"isteingeek.de", +"istmein.de", +"kicks-ass.net", +"kicks-ass.org", +"knowsitall.info", +"land-4-sale.us", +"lebtimnetz.de", +"leitungsen.de", +"likes-pie.com", +"likescandy.com", +"merseine.nu", +"mine.nu", +"misconfused.org", +"mypets.ws", +"myphotos.cc", +"neat-url.com", +"office-on-the.net", +"on-the-web.tv", +"podzone.net", +"podzone.org", +"readmyblog.org", +"saves-the-whales.com", +"scrapper-site.net", +"scrapping.cc", +"selfip.biz", +"selfip.com", +"selfip.info", +"selfip.net", +"selfip.org", +"sells-for-less.com", +"sells-for-u.com", +"sells-it.net", +"sellsyourhome.org", +"servebbs.com", +"servebbs.net", +"servebbs.org", +"serveftp.net", +"serveftp.org", +"servegame.org", +"shacknet.nu", +"simple-url.com", +"space-to-rent.com", +"stuff-4-sale.org", +"stuff-4-sale.us", +"teaches-yoga.com", +"thruhere.net", +"traeumtgerade.de", +"webhop.biz", +"webhop.info", +"webhop.net", +"webhop.org", +"worse-than.tv", +"writesthisblog.com", +"ddnss.de", +"dyn.ddnss.de", +"dyndns.ddnss.de", +"dyndns1.de", +"dyn-ip24.de", +"home-webserver.de", +"dyn.home-webserver.de", +"myhome-server.de", +"ddnss.org", +"definima.net", +"definima.io", +"bci.dnstrace.pro", +"ddnsfree.com", +"ddnsgeek.com", +"giize.com", +"gleeze.com", +"kozow.com", +"loseyourip.com", +"ooguy.com", +"theworkpc.com", +"casacam.net", +"dynu.net", +"accesscam.org", +"camdvr.org", +"freeddns.org", +"mywire.org", +"webredirect.org", +"myddns.rocks", +"blogsite.xyz", +"dynv6.net", +"e4.cz", +"en-root.fr", +"mytuleap.com", +"onred.one", +"staging.onred.one", +"enonic.io", +"customer.enonic.io", +"eu.org", +"al.eu.org", +"asso.eu.org", +"at.eu.org", +"au.eu.org", +"be.eu.org", +"bg.eu.org", +"ca.eu.org", +"cd.eu.org", +"ch.eu.org", +"cn.eu.org", +"cy.eu.org", +"cz.eu.org", +"de.eu.org", +"dk.eu.org", +"edu.eu.org", +"ee.eu.org", +"es.eu.org", +"fi.eu.org", +"fr.eu.org", +"gr.eu.org", +"hr.eu.org", +"hu.eu.org", +"ie.eu.org", +"il.eu.org", +"in.eu.org", +"int.eu.org", +"is.eu.org", +"it.eu.org", +"jp.eu.org", +"kr.eu.org", +"lt.eu.org", +"lu.eu.org", +"lv.eu.org", +"mc.eu.org", +"me.eu.org", +"mk.eu.org", +"mt.eu.org", +"my.eu.org", +"net.eu.org", +"ng.eu.org", +"nl.eu.org", +"no.eu.org", +"nz.eu.org", +"paris.eu.org", +"pl.eu.org", +"pt.eu.org", +"q-a.eu.org", +"ro.eu.org", +"ru.eu.org", +"se.eu.org", +"si.eu.org", +"sk.eu.org", +"tr.eu.org", +"uk.eu.org", +"us.eu.org", +"eu-1.evennode.com", +"eu-2.evennode.com", +"eu-3.evennode.com", +"eu-4.evennode.com", +"us-1.evennode.com", +"us-2.evennode.com", +"us-3.evennode.com", +"us-4.evennode.com", +"twmail.cc", +"twmail.net", +"twmail.org", +"mymailer.com.tw", +"url.tw", +"apps.fbsbx.com", +"ru.net", +"adygeya.ru", +"bashkiria.ru", +"bir.ru", +"cbg.ru", +"com.ru", +"dagestan.ru", +"grozny.ru", +"kalmykia.ru", +"kustanai.ru", +"marine.ru", +"mordovia.ru", +"msk.ru", +"mytis.ru", +"nalchik.ru", +"nov.ru", +"pyatigorsk.ru", +"spb.ru", +"vladikavkaz.ru", +"vladimir.ru", +"abkhazia.su", +"adygeya.su", +"aktyubinsk.su", +"arkhangelsk.su", +"armenia.su", +"ashgabad.su", +"azerbaijan.su", +"balashov.su", +"bashkiria.su", +"bryansk.su", +"bukhara.su", +"chimkent.su", +"dagestan.su", +"east-kazakhstan.su", +"exnet.su", +"georgia.su", +"grozny.su", +"ivanovo.su", +"jambyl.su", +"kalmykia.su", +"kaluga.su", +"karacol.su", +"karaganda.su", +"karelia.su", +"khakassia.su", +"krasnodar.su", +"kurgan.su", +"kustanai.su", +"lenug.su", +"mangyshlak.su", +"mordovia.su", +"msk.su", +"murmansk.su", +"nalchik.su", +"navoi.su", +"north-kazakhstan.su", +"nov.su", +"obninsk.su", +"penza.su", +"pokrovsk.su", +"sochi.su", +"spb.su", +"tashkent.su", +"termez.su", +"togliatti.su", +"troitsk.su", +"tselinograd.su", +"tula.su", +"tuva.su", +"vladikavkaz.su", +"vladimir.su", +"vologda.su", +"channelsdvr.net", +"u.channelsdvr.net", +"fastly-terrarium.com", +"fastlylb.net", +"map.fastlylb.net", +"freetls.fastly.net", +"map.fastly.net", +"a.prod.fastly.net", +"global.prod.fastly.net", +"a.ssl.fastly.net", +"b.ssl.fastly.net", +"global.ssl.fastly.net", +"fastpanel.direct", +"fastvps-server.com", +"fhapp.xyz", +"fedorainfracloud.org", +"fedorapeople.org", +"cloud.fedoraproject.org", +"app.os.fedoraproject.org", +"app.os.stg.fedoraproject.org", +"mydobiss.com", +"filegear.me", +"filegear-au.me", +"filegear-de.me", +"filegear-gb.me", +"filegear-ie.me", +"filegear-jp.me", +"filegear-sg.me", +"firebaseapp.com", +"flynnhub.com", +"flynnhosting.net", +"0e.vc", +"freebox-os.com", +"freeboxos.com", +"fbx-os.fr", +"fbxos.fr", +"freebox-os.fr", +"freeboxos.fr", +"freedesktop.org", +"*.futurecms.at", +"*.ex.futurecms.at", +"*.in.futurecms.at", +"futurehosting.at", +"futuremailing.at", +"*.ex.ortsinfo.at", +"*.kunden.ortsinfo.at", +"*.statics.cloud", +"service.gov.uk", +"gehirn.ne.jp", +"usercontent.jp", +"gentapps.com", +"lab.ms", +"github.io", +"githubusercontent.com", +"gitlab.io", +"glitch.me", +"lolipop.io", +"cloudapps.digital", +"london.cloudapps.digital", +"homeoffice.gov.uk", +"ro.im", +"shop.ro", +"goip.de", +"run.app", +"a.run.app", +"web.app", +"*.0emm.com", +"appspot.com", +"*.r.appspot.com", +"blogspot.ae", +"blogspot.al", +"blogspot.am", +"blogspot.ba", +"blogspot.be", +"blogspot.bg", +"blogspot.bj", +"blogspot.ca", +"blogspot.cf", +"blogspot.ch", +"blogspot.cl", +"blogspot.co.at", +"blogspot.co.id", +"blogspot.co.il", +"blogspot.co.ke", +"blogspot.co.nz", +"blogspot.co.uk", +"blogspot.co.za", +"blogspot.com", +"blogspot.com.ar", +"blogspot.com.au", +"blogspot.com.br", +"blogspot.com.by", +"blogspot.com.co", +"blogspot.com.cy", +"blogspot.com.ee", +"blogspot.com.eg", +"blogspot.com.es", +"blogspot.com.mt", +"blogspot.com.ng", +"blogspot.com.tr", +"blogspot.com.uy", +"blogspot.cv", +"blogspot.cz", +"blogspot.de", +"blogspot.dk", +"blogspot.fi", +"blogspot.fr", +"blogspot.gr", +"blogspot.hk", +"blogspot.hr", +"blogspot.hu", +"blogspot.ie", +"blogspot.in", +"blogspot.is", +"blogspot.it", +"blogspot.jp", +"blogspot.kr", +"blogspot.li", +"blogspot.lt", +"blogspot.lu", +"blogspot.md", +"blogspot.mk", +"blogspot.mr", +"blogspot.mx", +"blogspot.my", +"blogspot.nl", +"blogspot.no", +"blogspot.pe", +"blogspot.pt", +"blogspot.qa", +"blogspot.re", +"blogspot.ro", +"blogspot.rs", +"blogspot.ru", +"blogspot.se", +"blogspot.sg", +"blogspot.si", +"blogspot.sk", +"blogspot.sn", +"blogspot.td", +"blogspot.tw", +"blogspot.ug", +"blogspot.vn", +"cloudfunctions.net", +"cloud.goog", +"codespot.com", +"googleapis.com", +"googlecode.com", +"pagespeedmobilizer.com", +"publishproxy.com", +"withgoogle.com", +"withyoutube.com", +"awsmppl.com", +"fin.ci", +"free.hr", +"caa.li", +"ua.rs", +"conf.se", +"hs.zone", +"hs.run", +"hashbang.sh", +"hasura.app", +"hasura-app.io", +"hepforge.org", +"herokuapp.com", +"herokussl.com", +"myravendb.com", +"ravendb.community", +"ravendb.me", +"development.run", +"ravendb.run", +"bpl.biz", +"orx.biz", +"ng.city", +"biz.gl", +"ng.ink", +"col.ng", +"firm.ng", +"gen.ng", +"ltd.ng", +"ngo.ng", +"ng.school", +"sch.so", +"häkkinen.fi", +"*.moonscale.io", +"moonscale.net", +"iki.fi", +"dyn-berlin.de", +"in-berlin.de", +"in-brb.de", +"in-butter.de", +"in-dsl.de", +"in-dsl.net", +"in-dsl.org", +"in-vpn.de", +"in-vpn.net", +"in-vpn.org", +"biz.at", +"info.at", +"info.cx", +"ac.leg.br", +"al.leg.br", +"am.leg.br", +"ap.leg.br", +"ba.leg.br", +"ce.leg.br", +"df.leg.br", +"es.leg.br", +"go.leg.br", +"ma.leg.br", +"mg.leg.br", +"ms.leg.br", +"mt.leg.br", +"pa.leg.br", +"pb.leg.br", +"pe.leg.br", +"pi.leg.br", +"pr.leg.br", +"rj.leg.br", +"rn.leg.br", +"ro.leg.br", +"rr.leg.br", +"rs.leg.br", +"sc.leg.br", +"se.leg.br", +"sp.leg.br", +"to.leg.br", +"pixolino.com", +"ipifony.net", +"mein-iserv.de", +"test-iserv.de", +"iserv.dev", +"iobb.net", +"myjino.ru", +"*.hosting.myjino.ru", +"*.landing.myjino.ru", +"*.spectrum.myjino.ru", +"*.vps.myjino.ru", +"*.triton.zone", +"*.cns.joyent.com", +"js.org", +"kaas.gg", +"khplay.nl", +"keymachine.de", +"kinghost.net", +"uni5.net", +"knightpoint.systems", +"oya.to", +"co.krd", +"edu.krd", +"git-repos.de", +"lcube-server.de", +"svn-repos.de", +"leadpages.co", +"lpages.co", +"lpusercontent.com", +"lelux.site", +"co.business", +"co.education", +"co.events", +"co.financial", +"co.network", +"co.place", +"co.technology", +"app.lmpm.com", +"linkitools.space", +"linkyard.cloud", +"linkyard-cloud.ch", +"members.linode.com", +"nodebalancer.linode.com", +"we.bs", +"loginline.app", +"loginline.dev", +"loginline.io", +"loginline.services", +"loginline.site", +"krasnik.pl", +"leczna.pl", +"lubartow.pl", +"lublin.pl", +"poniatowa.pl", +"swidnik.pl", +"uklugs.org", +"glug.org.uk", +"lug.org.uk", +"lugs.org.uk", +"barsy.bg", +"barsy.co.uk", +"barsyonline.co.uk", +"barsycenter.com", +"barsyonline.com", +"barsy.club", +"barsy.de", +"barsy.eu", +"barsy.in", +"barsy.info", +"barsy.io", +"barsy.me", +"barsy.menu", +"barsy.mobi", +"barsy.net", +"barsy.online", +"barsy.org", +"barsy.pro", +"barsy.pub", +"barsy.shop", +"barsy.site", +"barsy.support", +"barsy.uk", +"*.magentosite.cloud", +"mayfirst.info", +"mayfirst.org", +"hb.cldmail.ru", +"miniserver.com", +"memset.net", +"cloud.metacentrum.cz", +"custom.metacentrum.cz", +"flt.cloud.muni.cz", +"usr.cloud.muni.cz", +"meteorapp.com", +"eu.meteorapp.com", +"co.pl", +"azurecontainer.io", +"azurewebsites.net", +"azure-mobile.net", +"cloudapp.net", +"mozilla-iot.org", +"bmoattachments.org", +"net.ru", +"org.ru", +"pp.ru", +"ui.nabu.casa", +"pony.club", +"of.fashion", +"on.fashion", +"of.football", +"in.london", +"of.london", +"for.men", +"and.mom", +"for.mom", +"for.one", +"for.sale", +"of.work", +"to.work", +"nctu.me", +"bitballoon.com", +"netlify.com", +"4u.com", +"ngrok.io", +"nh-serv.co.uk", +"nfshost.com", +"dnsking.ch", +"mypi.co", +"n4t.co", +"001www.com", +"ddnslive.com", +"myiphost.com", +"forumz.info", +"16-b.it", +"32-b.it", +"64-b.it", +"soundcast.me", +"tcp4.me", +"dnsup.net", +"hicam.net", +"now-dns.net", +"ownip.net", +"vpndns.net", +"dynserv.org", +"now-dns.org", +"x443.pw", +"now-dns.top", +"ntdll.top", +"freeddns.us", +"crafting.xyz", +"zapto.xyz", +"nsupdate.info", +"nerdpol.ovh", +"blogsyte.com", +"brasilia.me", +"cable-modem.org", +"ciscofreak.com", +"collegefan.org", +"couchpotatofries.org", +"damnserver.com", +"ddns.me", +"ditchyourip.com", +"dnsfor.me", +"dnsiskinky.com", +"dvrcam.info", +"dynns.com", +"eating-organic.net", +"fantasyleague.cc", +"geekgalaxy.com", +"golffan.us", +"health-carereform.com", +"homesecuritymac.com", +"homesecuritypc.com", +"hopto.me", +"ilovecollege.info", +"loginto.me", +"mlbfan.org", +"mmafan.biz", +"myactivedirectory.com", +"mydissent.net", +"myeffect.net", +"mymediapc.net", +"mypsx.net", +"mysecuritycamera.com", +"mysecuritycamera.net", +"mysecuritycamera.org", +"net-freaks.com", +"nflfan.org", +"nhlfan.net", +"no-ip.ca", +"no-ip.co.uk", +"no-ip.net", +"noip.us", +"onthewifi.com", +"pgafan.net", +"point2this.com", +"pointto.us", +"privatizehealthinsurance.net", +"quicksytes.com", +"read-books.org", +"securitytactics.com", +"serveexchange.com", +"servehumour.com", +"servep2p.com", +"servesarcasm.com", +"stufftoread.com", +"ufcfan.org", +"unusualperson.com", +"workisboring.com", +"3utilities.com", +"bounceme.net", +"ddns.net", +"ddnsking.com", +"gotdns.ch", +"hopto.org", +"myftp.biz", +"myftp.org", +"myvnc.com", +"no-ip.biz", +"no-ip.info", +"no-ip.org", +"noip.me", +"redirectme.net", +"servebeer.com", +"serveblog.net", +"servecounterstrike.com", +"serveftp.com", +"servegame.com", +"servehalflife.com", +"servehttp.com", +"serveirc.com", +"serveminecraft.net", +"servemp3.com", +"servepics.com", +"servequake.com", +"sytes.net", +"webhop.me", +"zapto.org", +"stage.nodeart.io", +"nodum.co", +"nodum.io", +"pcloud.host", +"nyc.mn", +"nom.ae", +"nom.af", +"nom.ai", +"nom.al", +"nym.by", +"nom.bz", +"nym.bz", +"nom.cl", +"nym.ec", +"nom.gd", +"nom.ge", +"nom.gl", +"nym.gr", +"nom.gt", +"nym.gy", +"nym.hk", +"nom.hn", +"nym.ie", +"nom.im", +"nom.ke", +"nym.kz", +"nym.la", +"nym.lc", +"nom.li", +"nym.li", +"nym.lt", +"nym.lu", +"nom.lv", +"nym.me", +"nom.mk", +"nym.mn", +"nym.mx", +"nom.nu", +"nym.nz", +"nym.pe", +"nym.pt", +"nom.pw", +"nom.qa", +"nym.ro", +"nom.rs", +"nom.si", +"nym.sk", +"nom.st", +"nym.su", +"nym.sx", +"nom.tj", +"nym.tw", +"nom.ug", +"nom.uy", +"nom.vc", +"nom.vg", +"static.observableusercontent.com", +"cya.gg", +"cloudycluster.net", +"nid.io", +"opencraft.hosting", +"operaunite.com", +"skygearapp.com", +"outsystemscloud.com", +"ownprovider.com", +"own.pm", +"ox.rs", +"oy.lc", +"pgfog.com", +"pagefrontapp.com", +"art.pl", +"gliwice.pl", +"krakow.pl", +"poznan.pl", +"wroc.pl", +"zakopane.pl", +"pantheonsite.io", +"gotpantheon.com", +"mypep.link", +"perspecta.cloud", +"on-web.fr", +"*.platform.sh", +"*.platformsh.site", +"dyn53.io", +"co.bn", +"xen.prgmr.com", +"priv.at", +"prvcy.page", +"*.dweb.link", +"protonet.io", +"chirurgiens-dentistes-en-france.fr", +"byen.site", +"pubtls.org", +"qualifioapp.com", +"qbuser.com", +"instantcloud.cn", +"ras.ru", +"qa2.com", +"qcx.io", +"*.sys.qcx.io", +"dev-myqnapcloud.com", +"alpha-myqnapcloud.com", +"myqnapcloud.com", +"*.quipelements.com", +"vapor.cloud", +"vaporcloud.io", +"rackmaze.com", +"rackmaze.net", +"*.on-k3s.io", +"*.on-rancher.cloud", +"*.on-rio.io", +"readthedocs.io", +"rhcloud.com", +"app.render.com", +"onrender.com", +"repl.co", +"repl.run", +"resindevice.io", +"devices.resinstaging.io", +"hzc.io", +"wellbeingzone.eu", +"ptplus.fit", +"wellbeingzone.co.uk", +"git-pages.rit.edu", +"sandcats.io", +"logoip.de", +"logoip.com", +"schokokeks.net", +"gov.scot", +"scrysec.com", +"firewall-gateway.com", +"firewall-gateway.de", +"my-gateway.de", +"my-router.de", +"spdns.de", +"spdns.eu", +"firewall-gateway.net", +"my-firewall.org", +"myfirewall.org", +"spdns.org", +"senseering.net", +"biz.ua", +"co.ua", +"pp.ua", +"shiftedit.io", +"myshopblocks.com", +"shopitsite.com", +"mo-siemens.io", +"1kapp.com", +"appchizi.com", +"applinzi.com", +"sinaapp.com", +"vipsinaapp.com", +"siteleaf.net", +"bounty-full.com", +"alpha.bounty-full.com", +"beta.bounty-full.com", +"stackhero-network.com", +"static.land", +"dev.static.land", +"sites.static.land", +"apps.lair.io", +"*.stolos.io", +"spacekit.io", +"customer.speedpartner.de", +"api.stdlib.com", +"storj.farm", +"utwente.io", +"soc.srcf.net", +"user.srcf.net", +"temp-dns.com", +"applicationcloud.io", +"scapp.io", +"*.s5y.io", +"*.sensiosite.cloud", +"syncloud.it", +"diskstation.me", +"dscloud.biz", +"dscloud.me", +"dscloud.mobi", +"dsmynas.com", +"dsmynas.net", +"dsmynas.org", +"familyds.com", +"familyds.net", +"familyds.org", +"i234.me", +"myds.me", +"synology.me", +"vpnplus.to", +"direct.quickconnect.to", +"taifun-dns.de", +"gda.pl", +"gdansk.pl", +"gdynia.pl", +"med.pl", +"sopot.pl", +"edugit.org", +"telebit.app", +"telebit.io", +"*.telebit.xyz", +"gwiddle.co.uk", +"thingdustdata.com", +"cust.dev.thingdust.io", +"cust.disrec.thingdust.io", +"cust.prod.thingdust.io", +"cust.testing.thingdust.io", +"arvo.network", +"azimuth.network", +"bloxcms.com", +"townnews-staging.com", +"12hp.at", +"2ix.at", +"4lima.at", +"lima-city.at", +"12hp.ch", +"2ix.ch", +"4lima.ch", +"lima-city.ch", +"trafficplex.cloud", +"de.cool", +"12hp.de", +"2ix.de", +"4lima.de", +"lima-city.de", +"1337.pictures", +"clan.rip", +"lima-city.rocks", +"webspace.rocks", +"lima.zone", +"*.transurl.be", +"*.transurl.eu", +"*.transurl.nl", +"tuxfamily.org", +"dd-dns.de", +"diskstation.eu", +"diskstation.org", +"dray-dns.de", +"draydns.de", +"dyn-vpn.de", +"dynvpn.de", +"mein-vigor.de", +"my-vigor.de", +"my-wan.de", +"syno-ds.de", +"synology-diskstation.de", +"synology-ds.de", +"uber.space", +"*.uberspace.de", +"hk.com", +"hk.org", +"ltd.hk", +"inc.hk", +"virtualuser.de", +"virtual-user.de", +"urown.cloud", +"dnsupdate.info", +"lib.de.us", +"2038.io", +"router.management", +"v-info.info", +"voorloper.cloud", +"v.ua", +"wafflecell.com", +"*.webhare.dev", +"wedeploy.io", +"wedeploy.me", +"wedeploy.sh", +"remotewd.com", +"wmflabs.org", +"myforum.community", +"community-pro.de", +"diskussionsbereich.de", +"community-pro.net", +"meinforum.net", +"half.host", +"xnbay.com", +"u2.xnbay.com", +"u2-local.xnbay.com", +"cistron.nl", +"demon.nl", +"xs4all.space", +"yandexcloud.net", +"storage.yandexcloud.net", +"website.yandexcloud.net", +"official.academy", +"yolasite.com", +"ybo.faith", +"yombo.me", +"homelink.one", +"ybo.party", +"ybo.review", +"ybo.science", +"ybo.trade", +"nohost.me", +"noho.st", +"za.net", +"za.org", +"now.sh", +"bss.design", +"basicserver.io", +"virtualserver.io", +"enterprisecloud.nu" +] \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/psl/dist/psl.js b/packages/字体精简工具/node_modules/psl/dist/psl.js new file mode 100644 index 0000000..f4b9b89 --- /dev/null +++ b/packages/字体精简工具/node_modules/psl/dist/psl.js @@ -0,0 +1,9645 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.psl = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= punySuffix.length) { + // return memo; + // } + //} + return rule; + }, null); +}; + + +// +// Error codes and messages. +// +exports.errorCodes = { + DOMAIN_TOO_SHORT: 'Domain name too short.', + DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.', + LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.', + LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.', + LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.', + LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.', + LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.' +}; + + +// +// Validate domain name and throw if not valid. +// +// From wikipedia: +// +// Hostnames are composed of series of labels concatenated with dots, as are all +// domain names. Each label must be between 1 and 63 characters long, and the +// entire hostname (including the delimiting dots) has a maximum of 255 chars. +// +// Allowed chars: +// +// * `a-z` +// * `0-9` +// * `-` but not as a starting or ending character +// * `.` as a separator for the textual portions of a domain name +// +// * http://en.wikipedia.org/wiki/Domain_name +// * http://en.wikipedia.org/wiki/Hostname +// +internals.validate = function (input) { + + // Before we can validate we need to take care of IDNs with unicode chars. + var ascii = Punycode.toASCII(input); + + if (ascii.length < 1) { + return 'DOMAIN_TOO_SHORT'; + } + if (ascii.length > 255) { + return 'DOMAIN_TOO_LONG'; + } + + // Check each part's length and allowed chars. + var labels = ascii.split('.'); + var label; + + for (var i = 0; i < labels.length; ++i) { + label = labels[i]; + if (!label.length) { + return 'LABEL_TOO_SHORT'; + } + if (label.length > 63) { + return 'LABEL_TOO_LONG'; + } + if (label.charAt(0) === '-') { + return 'LABEL_STARTS_WITH_DASH'; + } + if (label.charAt(label.length - 1) === '-') { + return 'LABEL_ENDS_WITH_DASH'; + } + if (!/^[a-z0-9\-]+$/.test(label)) { + return 'LABEL_INVALID_CHARS'; + } + } +}; + + +// +// Public API +// + + +// +// Parse domain. +// +exports.parse = function (input) { + + if (typeof input !== 'string') { + throw new TypeError('Domain name must be a string.'); + } + + // Force domain to lowercase. + var domain = input.slice(0).toLowerCase(); + + // Handle FQDN. + // TODO: Simply remove trailing dot? + if (domain.charAt(domain.length - 1) === '.') { + domain = domain.slice(0, domain.length - 1); + } + + // Validate and sanitise input. + var error = internals.validate(domain); + if (error) { + return { + input: input, + error: { + message: exports.errorCodes[error], + code: error + } + }; + } + + var parsed = { + input: input, + tld: null, + sld: null, + domain: null, + subdomain: null, + listed: false + }; + + var domainParts = domain.split('.'); + + // Non-Internet TLD + if (domainParts[domainParts.length - 1] === 'local') { + return parsed; + } + + var handlePunycode = function () { + + if (!/xn--/.test(domain)) { + return parsed; + } + if (parsed.domain) { + parsed.domain = Punycode.toASCII(parsed.domain); + } + if (parsed.subdomain) { + parsed.subdomain = Punycode.toASCII(parsed.subdomain); + } + return parsed; + }; + + var rule = internals.findRule(domain); + + // Unlisted tld. + if (!rule) { + if (domainParts.length < 2) { + return parsed; + } + parsed.tld = domainParts.pop(); + parsed.sld = domainParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + if (domainParts.length) { + parsed.subdomain = domainParts.pop(); + } + return handlePunycode(); + } + + // At this point we know the public suffix is listed. + parsed.listed = true; + + var tldParts = rule.suffix.split('.'); + var privateParts = domainParts.slice(0, domainParts.length - tldParts.length); + + if (rule.exception) { + privateParts.push(tldParts.shift()); + } + + parsed.tld = tldParts.join('.'); + + if (!privateParts.length) { + return handlePunycode(); + } + + if (rule.wildcard) { + tldParts.unshift(privateParts.pop()); + parsed.tld = tldParts.join('.'); + } + + if (!privateParts.length) { + return handlePunycode(); + } + + parsed.sld = privateParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + + if (privateParts.length) { + parsed.subdomain = privateParts.join('.'); + } + + return handlePunycode(); +}; + + +// +// Get domain. +// +exports.get = function (domain) { + + if (!domain) { + return null; + } + return exports.parse(domain).domain || null; +}; + + +// +// Check whether domain belongs to a known public suffix. +// +exports.isValid = function (domain) { + + var parsed = exports.parse(domain); + return Boolean(parsed.domain && parsed.listed); +}; + +},{"./data/rules.json":1,"punycode":3}],3:[function(require,module,exports){ +(function (global){ +/*! https://mths.be/punycode v1.4.1 by @mathias */ +;(function(root) { + + /** Detect free variables */ + var freeExports = typeof exports == 'object' && exports && + !exports.nodeType && exports; + var freeModule = typeof module == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof global == 'object' && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw new RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.4.1', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define('punycode', function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { + // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { + // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { + // in Rhino or a web browser + root.punycode = punycode; + } + +}(this)); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[2])(2) +}); diff --git a/packages/字体精简工具/node_modules/psl/dist/psl.min.js b/packages/字体精简工具/node_modules/psl/dist/psl.min.js new file mode 100644 index 0000000..d5c787e --- /dev/null +++ b/packages/字体精简工具/node_modules/psl/dist/psl.min.js @@ -0,0 +1 @@ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).psl=a()}}(function(){return function s(m,t,u){function r(o,a){if(!t[o]){if(!m[o]){var i="function"==typeof require&&require;if(!a&&i)return i(o,!0);if(p)return p(o,!0);var e=new Error("Cannot find module '"+o+"'");throw e.code="MODULE_NOT_FOUND",e}var n=t[o]={exports:{}};m[o][0].call(n.exports,function(a){return r(m[o][1][a]||a)},n,n.exports,s,m,t,u)}return t[o].exports}for(var p="function"==typeof require&&require,a=0;a= 0x80 (not a basic code point)","invalid-input":"Invalid input"},c=b-y,x=Math.floor,q=String.fromCharCode;function A(a){throw new RangeError(k[a])}function l(a,o){for(var i=a.length,e=[];i--;)e[i]=o(a[i]);return e}function g(a,o){var i=a.split("@"),e="";return 1>>10&1023|55296),a=56320|1023&a),o+=q(a)}).join("")}function L(a,o){return a+22+75*(a<26)-((0!=o)<<5)}function I(a,o,i){var e=0;for(a=i?x(a/t):a>>1,a+=x(a/o);c*f>>1x((d-g)/m))&&A("overflow"),g+=u*m,!(u<(r=t<=j?y:j+f<=t?f:t-j));t+=b)m>x(d/(p=b-r))&&A("overflow"),m*=p;j=I(g-s,o=c.length+1,0==s),x(g/o)>d-h&&A("overflow"),h+=x(g/o),g%=o,c.splice(g++,0,h)}return _(c)}function j(a){var o,i,e,n,s,m,t,u,r,p,k,c,l,g,h,j=[];for(c=(a=O(a)).length,o=w,s=v,m=i=0;mx((d-i)/(l=e+1))&&A("overflow"),i+=(t-o)*l,o=t,m=0;md&&A("overflow"),k==o){for(u=i,r=b;!(u<(p=r<=s?y:s+f<=r?f:r-s));r+=b)h=u-p,g=b-p,j.push(q(L(p+h%g,0))),u=x(h/g);j.push(q(L(u,0))),s=I(i,l,e==n),i=0,++e}++i,++o}return j.join("")}if(n={version:"1.4.1",ucs2:{decode:O,encode:_},decode:h,encode:j,toASCII:function(a){return g(a,function(a){return r.test(a)?"xn--"+j(a):a})},toUnicode:function(a){return g(a,function(a){return u.test(a)?h(a.slice(4).toLowerCase()):a})}},0,o&&i)if(T.exports==o)i.exports=n;else for(s in n)n.hasOwnProperty(s)&&(o[s]=n[s]);else a.punycode=n}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[2])(2)}); diff --git a/packages/字体精简工具/node_modules/psl/index.js b/packages/字体精简工具/node_modules/psl/index.js new file mode 100644 index 0000000..da7bc12 --- /dev/null +++ b/packages/字体精简工具/node_modules/psl/index.js @@ -0,0 +1,269 @@ +/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */ +'use strict'; + + +var Punycode = require('punycode'); + + +var internals = {}; + + +// +// Read rules from file. +// +internals.rules = require('./data/rules.json').map(function (rule) { + + return { + rule: rule, + suffix: rule.replace(/^(\*\.|\!)/, ''), + punySuffix: -1, + wildcard: rule.charAt(0) === '*', + exception: rule.charAt(0) === '!' + }; +}); + + +// +// Check is given string ends with `suffix`. +// +internals.endsWith = function (str, suffix) { + + return str.indexOf(suffix, str.length - suffix.length) !== -1; +}; + + +// +// Find rule for a given domain. +// +internals.findRule = function (domain) { + + var punyDomain = Punycode.toASCII(domain); + return internals.rules.reduce(function (memo, rule) { + + if (rule.punySuffix === -1){ + rule.punySuffix = Punycode.toASCII(rule.suffix); + } + if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) { + return memo; + } + // This has been commented out as it never seems to run. This is because + // sub tlds always appear after their parents and we never find a shorter + // match. + //if (memo) { + // var memoSuffix = Punycode.toASCII(memo.suffix); + // if (memoSuffix.length >= punySuffix.length) { + // return memo; + // } + //} + return rule; + }, null); +}; + + +// +// Error codes and messages. +// +exports.errorCodes = { + DOMAIN_TOO_SHORT: 'Domain name too short.', + DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.', + LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.', + LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.', + LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.', + LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.', + LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.' +}; + + +// +// Validate domain name and throw if not valid. +// +// From wikipedia: +// +// Hostnames are composed of series of labels concatenated with dots, as are all +// domain names. Each label must be between 1 and 63 characters long, and the +// entire hostname (including the delimiting dots) has a maximum of 255 chars. +// +// Allowed chars: +// +// * `a-z` +// * `0-9` +// * `-` but not as a starting or ending character +// * `.` as a separator for the textual portions of a domain name +// +// * http://en.wikipedia.org/wiki/Domain_name +// * http://en.wikipedia.org/wiki/Hostname +// +internals.validate = function (input) { + + // Before we can validate we need to take care of IDNs with unicode chars. + var ascii = Punycode.toASCII(input); + + if (ascii.length < 1) { + return 'DOMAIN_TOO_SHORT'; + } + if (ascii.length > 255) { + return 'DOMAIN_TOO_LONG'; + } + + // Check each part's length and allowed chars. + var labels = ascii.split('.'); + var label; + + for (var i = 0; i < labels.length; ++i) { + label = labels[i]; + if (!label.length) { + return 'LABEL_TOO_SHORT'; + } + if (label.length > 63) { + return 'LABEL_TOO_LONG'; + } + if (label.charAt(0) === '-') { + return 'LABEL_STARTS_WITH_DASH'; + } + if (label.charAt(label.length - 1) === '-') { + return 'LABEL_ENDS_WITH_DASH'; + } + if (!/^[a-z0-9\-]+$/.test(label)) { + return 'LABEL_INVALID_CHARS'; + } + } +}; + + +// +// Public API +// + + +// +// Parse domain. +// +exports.parse = function (input) { + + if (typeof input !== 'string') { + throw new TypeError('Domain name must be a string.'); + } + + // Force domain to lowercase. + var domain = input.slice(0).toLowerCase(); + + // Handle FQDN. + // TODO: Simply remove trailing dot? + if (domain.charAt(domain.length - 1) === '.') { + domain = domain.slice(0, domain.length - 1); + } + + // Validate and sanitise input. + var error = internals.validate(domain); + if (error) { + return { + input: input, + error: { + message: exports.errorCodes[error], + code: error + } + }; + } + + var parsed = { + input: input, + tld: null, + sld: null, + domain: null, + subdomain: null, + listed: false + }; + + var domainParts = domain.split('.'); + + // Non-Internet TLD + if (domainParts[domainParts.length - 1] === 'local') { + return parsed; + } + + var handlePunycode = function () { + + if (!/xn--/.test(domain)) { + return parsed; + } + if (parsed.domain) { + parsed.domain = Punycode.toASCII(parsed.domain); + } + if (parsed.subdomain) { + parsed.subdomain = Punycode.toASCII(parsed.subdomain); + } + return parsed; + }; + + var rule = internals.findRule(domain); + + // Unlisted tld. + if (!rule) { + if (domainParts.length < 2) { + return parsed; + } + parsed.tld = domainParts.pop(); + parsed.sld = domainParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + if (domainParts.length) { + parsed.subdomain = domainParts.pop(); + } + return handlePunycode(); + } + + // At this point we know the public suffix is listed. + parsed.listed = true; + + var tldParts = rule.suffix.split('.'); + var privateParts = domainParts.slice(0, domainParts.length - tldParts.length); + + if (rule.exception) { + privateParts.push(tldParts.shift()); + } + + parsed.tld = tldParts.join('.'); + + if (!privateParts.length) { + return handlePunycode(); + } + + if (rule.wildcard) { + tldParts.unshift(privateParts.pop()); + parsed.tld = tldParts.join('.'); + } + + if (!privateParts.length) { + return handlePunycode(); + } + + parsed.sld = privateParts.pop(); + parsed.domain = [parsed.sld, parsed.tld].join('.'); + + if (privateParts.length) { + parsed.subdomain = privateParts.join('.'); + } + + return handlePunycode(); +}; + + +// +// Get domain. +// +exports.get = function (domain) { + + if (!domain) { + return null; + } + return exports.parse(domain).domain || null; +}; + + +// +// Check whether domain belongs to a known public suffix. +// +exports.isValid = function (domain) { + + var parsed = exports.parse(domain); + return Boolean(parsed.domain && parsed.listed); +}; diff --git a/packages/字体精简工具/node_modules/psl/package.json b/packages/字体精简工具/node_modules/psl/package.json new file mode 100644 index 0000000..7d53caa --- /dev/null +++ b/packages/字体精简工具/node_modules/psl/package.json @@ -0,0 +1,77 @@ +{ + "_from": "psl@^1.1.28", + "_id": "psl@1.8.0", + "_inBundle": false, + "_integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", + "_location": "/psl", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "psl@^1.1.28", + "name": "psl", + "escapedName": "psl", + "rawSpec": "^1.1.28", + "saveSpec": null, + "fetchSpec": "^1.1.28" + }, + "_requiredBy": [ + "/tough-cookie" + ], + "_resolved": "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz", + "_shasum": "9326f8bcfb013adcc005fdff056acce020e51c24", + "_spec": "psl@^1.1.28", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\tough-cookie", + "author": { + "name": "Lupo Montero", + "email": "lupomontero@gmail.com", + "url": "https://lupomontero.com/" + }, + "bugs": { + "url": "https://github.com/lupomontero/psl/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Domain name parser based on the Public Suffix List", + "devDependencies": { + "JSONStream": "^1.3.5", + "browserify": "^16.5.0", + "commit-and-pr": "^1.0.4", + "eslint": "^6.8.0", + "eslint-config-hapi": "^12.0.0", + "eslint-plugin-hapi": "^4.1.0", + "karma": "^4.4.1", + "karma-browserify": "^7.0.0", + "karma-mocha": "^1.3.0", + "karma-mocha-reporter": "^2.2.5", + "karma-phantomjs-launcher": "^1.0.4", + "mocha": "^7.1.1", + "phantomjs-prebuilt": "^2.1.16", + "request": "^2.88.2", + "uglify-js": "^3.8.0", + "watchify": "^3.11.1" + }, + "homepage": "https://github.com/lupomontero/psl#readme", + "keywords": [ + "publicsuffix", + "publicsuffixlist" + ], + "license": "MIT", + "main": "index.js", + "name": "psl", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/lupomontero/psl.git" + }, + "scripts": { + "build": "browserify ./index.js --standalone=psl > ./dist/psl.js", + "changelog": "git log $(git describe --tags --abbrev=0)..HEAD --oneline --format=\"%h %s (%an <%ae>)\"", + "commit-and-pr": "commit-and-pr", + "postbuild": "cat ./dist/psl.js | uglifyjs -c -m > ./dist/psl.min.js", + "prebuild": "./scripts/update-rules.js", + "pretest": "eslint .", + "test": "mocha test && karma start ./karma.conf.js --single-run", + "watch": "mocha test --watch" + }, + "version": "1.8.0" +} diff --git a/packages/字体精简工具/node_modules/pump/.travis.yml b/packages/字体精简工具/node_modules/pump/.travis.yml new file mode 100644 index 0000000..17f9433 --- /dev/null +++ b/packages/字体精简工具/node_modules/pump/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - "0.10" + +script: "npm test" diff --git a/packages/字体精简工具/node_modules/pump/LICENSE b/packages/字体精简工具/node_modules/pump/LICENSE new file mode 100644 index 0000000..757562e --- /dev/null +++ b/packages/字体精简工具/node_modules/pump/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/pump/README.md b/packages/字体精简工具/node_modules/pump/README.md new file mode 100644 index 0000000..5029b27 --- /dev/null +++ b/packages/字体精简工具/node_modules/pump/README.md @@ -0,0 +1,56 @@ +# pump + +pump is a small node module that pipes streams together and destroys all of them if one of them closes. + +``` +npm install pump +``` + +[![build status](http://img.shields.io/travis/mafintosh/pump.svg?style=flat)](http://travis-ci.org/mafintosh/pump) + +## What problem does it solve? + +When using standard `source.pipe(dest)` source will _not_ be destroyed if dest emits close or an error. +You are also not able to provide a callback to tell when then pipe has finished. + +pump does these two things for you + +## Usage + +Simply pass the streams you want to pipe together to pump and add an optional callback + +``` js +var pump = require('pump') +var fs = require('fs') + +var source = fs.createReadStream('/dev/random') +var dest = fs.createWriteStream('/dev/null') + +pump(source, dest, function(err) { + console.log('pipe finished', err) +}) + +setTimeout(function() { + dest.destroy() // when dest is closed pump will destroy source +}, 1000) +``` + +You can use pump to pipe more than two streams together as well + +``` js +var transform = someTransformStream() + +pump(source, transform, anotherTransform, dest, function(err) { + console.log('pipe finished', err) +}) +``` + +If `source`, `transform`, `anotherTransform` or `dest` closes all of them will be destroyed. + +## License + +MIT + +## Related + +`pump` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one. diff --git a/packages/字体精简工具/node_modules/pump/index.js b/packages/字体精简工具/node_modules/pump/index.js new file mode 100644 index 0000000..d9ca033 --- /dev/null +++ b/packages/字体精简工具/node_modules/pump/index.js @@ -0,0 +1,82 @@ +var once = require('once') +var eos = require('end-of-stream') +var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes + +var noop = function () {} +var ancient = /^v?\.0/.test(process.version) + +var isFn = function (fn) { + return typeof fn === 'function' +} + +var isFS = function (stream) { + if (!ancient) return false // newer node version do not need to care about fs is a special way + if (!fs) return false // browser + return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) +} + +var isRequest = function (stream) { + return stream.setHeader && isFn(stream.abort) +} + +var destroyer = function (stream, reading, writing, callback) { + callback = once(callback) + + var closed = false + stream.on('close', function () { + closed = true + }) + + eos(stream, {readable: reading, writable: writing}, function (err) { + if (err) return callback(err) + closed = true + callback() + }) + + var destroyed = false + return function (err) { + if (closed) return + if (destroyed) return + destroyed = true + + if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks + if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want + + if (isFn(stream.destroy)) return stream.destroy() + + callback(err || new Error('stream was destroyed')) + } +} + +var call = function (fn) { + fn() +} + +var pipe = function (from, to) { + return from.pipe(to) +} + +var pump = function () { + var streams = Array.prototype.slice.call(arguments) + var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop + + if (Array.isArray(streams[0])) streams = streams[0] + if (streams.length < 2) throw new Error('pump requires two streams per minimum') + + var error + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1 + var writing = i > 0 + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err + if (err) destroys.forEach(call) + if (reading) return + destroys.forEach(call) + callback(error) + }) + }) + + streams.reduce(pipe) +} + +module.exports = pump diff --git a/packages/字体精简工具/node_modules/pump/package.json b/packages/字体精简工具/node_modules/pump/package.json new file mode 100644 index 0000000..0ac1507 --- /dev/null +++ b/packages/字体精简工具/node_modules/pump/package.json @@ -0,0 +1,59 @@ +{ + "_from": "pump@^2.0.0", + "_id": "pump@2.0.1", + "_inBundle": false, + "_integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "_location": "/pump", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "pump@^2.0.0", + "name": "pump", + "escapedName": "pump", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/pumpify" + ], + "_resolved": "https://registry.nlark.com/pump/download/pump-2.0.1.tgz", + "_shasum": "12399add6e4cf7526d973cbc8b5ce2e2908b3909", + "_spec": "pump@^2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\pumpify", + "author": { + "name": "Mathias Buus Madsen", + "email": "mathiasbuus@gmail.com" + }, + "browser": { + "fs": false + }, + "bugs": { + "url": "https://github.com/mafintosh/pump/issues" + }, + "bundleDependencies": false, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "deprecated": false, + "description": "pipe streams together and close all of them if one of them closes", + "homepage": "https://github.com/mafintosh/pump#readme", + "keywords": [ + "streams", + "pipe", + "destroy", + "callback" + ], + "license": "MIT", + "name": "pump", + "repository": { + "type": "git", + "url": "git://github.com/mafintosh/pump.git" + }, + "scripts": { + "test": "node test-browser.js && node test-node.js" + }, + "version": "2.0.1" +} diff --git a/packages/字体精简工具/node_modules/pump/test-browser.js b/packages/字体精简工具/node_modules/pump/test-browser.js new file mode 100644 index 0000000..75ea4a2 --- /dev/null +++ b/packages/字体精简工具/node_modules/pump/test-browser.js @@ -0,0 +1,62 @@ +var stream = require('stream') +var pump = require('./index') + +var rs = new stream.Readable() +var ws = new stream.Writable() + +rs._read = function (size) { + this.push(Buffer(size).fill('abc')) +} + +ws._write = function (chunk, encoding, cb) { + setTimeout(function () { + cb() + }, 100) +} + +var toHex = function () { + var reverse = new (require('stream').Transform)() + + reverse._transform = function (chunk, enc, callback) { + reverse.push(chunk.toString('hex')) + callback() + } + + return reverse +} + +var wsClosed = false +var rsClosed = false +var callbackCalled = false + +var check = function () { + if (wsClosed && rsClosed && callbackCalled) { + console.log('test-browser.js passes') + clearTimeout(timeout) + } +} + +ws.on('finish', function () { + wsClosed = true + check() +}) + +rs.on('end', function () { + rsClosed = true + check() +}) + +pump(rs, toHex(), toHex(), toHex(), ws, function () { + callbackCalled = true + check() +}) + +setTimeout(function () { + rs.push(null) + rs.emit('close') +}, 1000) + +var timeout = setTimeout(function () { + check() + throw new Error('timeout') +}, 5000) diff --git a/packages/字体精简工具/node_modules/pump/test-node.js b/packages/字体精简工具/node_modules/pump/test-node.js new file mode 100644 index 0000000..034a654 --- /dev/null +++ b/packages/字体精简工具/node_modules/pump/test-node.js @@ -0,0 +1,53 @@ +var pump = require('./index') + +var rs = require('fs').createReadStream('/dev/random') +var ws = require('fs').createWriteStream('/dev/null') + +var toHex = function () { + var reverse = new (require('stream').Transform)() + + reverse._transform = function (chunk, enc, callback) { + reverse.push(chunk.toString('hex')) + callback() + } + + return reverse +} + +var wsClosed = false +var rsClosed = false +var callbackCalled = false + +var check = function () { + if (wsClosed && rsClosed && callbackCalled) { + console.log('test-node.js passes') + clearTimeout(timeout) + } +} + +ws.on('close', function () { + wsClosed = true + check() +}) + +rs.on('close', function () { + rsClosed = true + check() +}) + +var res = pump(rs, toHex(), toHex(), toHex(), ws, function () { + callbackCalled = true + check() +}) + +if (res) { + process.exit(1) +} + +setTimeout(function () { + rs.destroy() +}, 1000) + +var timeout = setTimeout(function () { + throw new Error('timeout') +}, 5000) diff --git a/packages/字体精简工具/node_modules/pumpify/.travis.yml b/packages/字体精简工具/node_modules/pumpify/.travis.yml new file mode 100644 index 0000000..32e71a6 --- /dev/null +++ b/packages/字体精简工具/node_modules/pumpify/.travis.yml @@ -0,0 +1,8 @@ +language: node_js + +node_js: + - "0.10" + - "4" + - "5" + +sudo: false diff --git a/packages/字体精简工具/node_modules/pumpify/LICENSE b/packages/字体精简工具/node_modules/pumpify/LICENSE new file mode 100644 index 0000000..757562e --- /dev/null +++ b/packages/字体精简工具/node_modules/pumpify/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/pumpify/README.md b/packages/字体精简工具/node_modules/pumpify/README.md new file mode 100644 index 0000000..4988f7b --- /dev/null +++ b/packages/字体精简工具/node_modules/pumpify/README.md @@ -0,0 +1,56 @@ +# pumpify + +Combine an array of streams into a single duplex stream using [pump](https://github.com/mafintosh/pump) and [duplexify](https://github.com/mafintosh/duplexify). +If one of the streams closes/errors all streams in the pipeline will be destroyed. + +``` +npm install pumpify +``` + +[![build status](http://img.shields.io/travis/mafintosh/pumpify.svg?style=flat)](http://travis-ci.org/mafintosh/pumpify) + +## Usage + +Pass the streams you want to pipe together to pumpify `pipeline = pumpify(s1, s2, s3, ...)`. +`pipeline` is a duplex stream that writes to the first streams and reads from the last one. +Streams are piped together using [pump](https://github.com/mafintosh/pump) so if one of them closes +all streams will be destroyed. + +``` js +var pumpify = require('pumpify') +var tar = require('tar-fs') +var zlib = require('zlib') +var fs = require('fs') + +var untar = pumpify(zlib.createGunzip(), tar.extract('output-folder')) +// you can also pass an array instead +// var untar = pumpify([zlib.createGunzip(), tar.extract('output-folder')]) + +fs.createReadStream('some-gzipped-tarball.tgz').pipe(untar) +``` + +If you are pumping object streams together use `pipeline = pumpify.obj(s1, s2, ...)`. +Call `pipeline.destroy()` to destroy the pipeline (including the streams passed to pumpify). + +### Using `setPipeline(s1, s2, ...)` + +Similar to [duplexify](https://github.com/mafintosh/duplexify) you can also define the pipeline asynchronously using `setPipeline(s1, s2, ...)` + +``` js +var untar = pumpify() + +setTimeout(function() { + // will start draining the input now + untar.setPipeline(zlib.createGunzip(), tar.extract('output-folder')) +}, 1000) + +fs.createReadStream('some-gzipped-tarball.tgz').pipe(untar) +``` + +## License + +MIT + +## Related + +`pumpify` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one. diff --git a/packages/字体精简工具/node_modules/pumpify/index.js b/packages/字体精简工具/node_modules/pumpify/index.js new file mode 100644 index 0000000..473e256 --- /dev/null +++ b/packages/字体精简工具/node_modules/pumpify/index.js @@ -0,0 +1,60 @@ +var pump = require('pump') +var inherits = require('inherits') +var Duplexify = require('duplexify') + +var toArray = function(args) { + if (!args.length) return [] + return Array.isArray(args[0]) ? args[0] : Array.prototype.slice.call(args) +} + +var define = function(opts) { + var Pumpify = function() { + var streams = toArray(arguments) + if (!(this instanceof Pumpify)) return new Pumpify(streams) + Duplexify.call(this, null, null, opts) + if (streams.length) this.setPipeline(streams) + } + + inherits(Pumpify, Duplexify) + + Pumpify.prototype.setPipeline = function() { + var streams = toArray(arguments) + var self = this + var ended = false + var w = streams[0] + var r = streams[streams.length-1] + + r = r.readable ? r : null + w = w.writable ? w : null + + var onclose = function() { + streams[0].emit('error', new Error('stream was destroyed')) + } + + this.on('close', onclose) + this.on('prefinish', function() { + if (!ended) self.cork() + }) + + pump(streams, function(err) { + self.removeListener('close', onclose) + if (err) return self.destroy(err.message === 'premature close' ? null : err) + ended = true + // pump ends after the last stream is not writable *but* + // pumpify still forwards the readable part so we need to catch errors + // still, so reenable autoDestroy in this case + if (self._autoDestroy === false) self._autoDestroy = true + self.uncork() + }) + + if (this.destroyed) return onclose() + this.setWritable(w) + this.setReadable(r) + } + + return Pumpify +} + +module.exports = define({autoDestroy:false, destroy:false}) +module.exports.obj = define({autoDestroy: false, destroy:false, objectMode:true, highWaterMark:16}) +module.exports.ctor = define diff --git a/packages/字体精简工具/node_modules/pumpify/package.json b/packages/字体精简工具/node_modules/pumpify/package.json new file mode 100644 index 0000000..bbd952e --- /dev/null +++ b/packages/字体精简工具/node_modules/pumpify/package.json @@ -0,0 +1,65 @@ +{ + "_from": "pumpify@^1.3.5", + "_id": "pumpify@1.5.1", + "_inBundle": false, + "_integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "_location": "/pumpify", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "pumpify@^1.3.5", + "name": "pumpify", + "escapedName": "pumpify", + "rawSpec": "^1.3.5", + "saveSpec": null, + "fetchSpec": "^1.3.5" + }, + "_requiredBy": [ + "/glob-stream", + "/vinyl-fs" + ], + "_resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", + "_shasum": "36513be246ab27570b1a374a5ce278bfd74370ce", + "_spec": "pumpify@^1.3.5", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs", + "author": { + "name": "Mathias Buus" + }, + "bugs": { + "url": "https://github.com/mafintosh/pumpify/issues" + }, + "bundleDependencies": false, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "deprecated": false, + "description": "Combine an array of streams into a single duplex stream using pump and duplexify", + "devDependencies": { + "tape": "^4.8.0", + "through2": "^2.0.3" + }, + "homepage": "https://github.com/mafintosh/pumpify", + "keywords": [ + "pump", + "duplexify", + "duplex", + "streams", + "stream", + "pipeline", + "combine" + ], + "license": "MIT", + "main": "index.js", + "name": "pumpify", + "repository": { + "type": "git", + "url": "git://github.com/mafintosh/pumpify.git" + }, + "scripts": { + "test": "tape test.js" + }, + "version": "1.5.1" +} diff --git a/packages/字体精简工具/node_modules/pumpify/test.js b/packages/字体精简工具/node_modules/pumpify/test.js new file mode 100644 index 0000000..b603c4d --- /dev/null +++ b/packages/字体精简工具/node_modules/pumpify/test.js @@ -0,0 +1,235 @@ +var tape = require('tape') +var through = require('through2') +var pumpify = require('./') +var stream = require('stream') +var duplexify = require('duplexify') + +tape('basic', function(t) { + t.plan(3) + + var pipeline = pumpify( + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'HELLO') + cb(null, data.toString().toLowerCase()) + }) + ) + + pipeline.write('hello') + pipeline.on('data', function(data) { + t.same(data.toString(), 'hello') + t.end() + }) +}) + +tape('3 times', function(t) { + t.plan(4) + + var pipeline = pumpify( + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'HELLO') + cb(null, data.toString().toLowerCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }) + ) + + pipeline.write('hello') + pipeline.on('data', function(data) { + t.same(data.toString(), 'HELLO') + t.end() + }) +}) + +tape('destroy', function(t) { + var test = through() + test.destroy = function() { + t.ok(true) + t.end() + } + + var pipeline = pumpify(through(), test) + + pipeline.destroy() +}) + +tape('close', function(t) { + var test = through() + var pipeline = pumpify(through(), test) + + pipeline.on('error', function(err) { + t.same(err.message, 'lol') + t.end() + }) + + test.emit('error', new Error('lol')) +}) + +tape('end waits for last one', function(t) { + var ran = false + + var a = through() + var b = through() + var c = through(function(data, enc, cb) { + setTimeout(function() { + ran = true + cb() + }, 100) + }) + + var pipeline = pumpify(a, b, c) + + pipeline.write('foo') + pipeline.end(function() { + t.ok(ran) + t.end() + }) + + t.ok(!ran) +}) + +tape('always wait for finish', function(t) { + var a = new stream.Readable() + a._read = function() {} + a.push('hello') + + var pipeline = pumpify(a, through(), through()) + var ran = false + + pipeline.on('finish', function() { + t.ok(ran) + t.end() + }) + + setTimeout(function() { + ran = true + a.push(null) + }, 100) +}) + +tape('async', function(t) { + var pipeline = pumpify() + + t.plan(4) + + pipeline.write('hello') + pipeline.on('data', function(data) { + t.same(data.toString(), 'HELLO') + t.end() + }) + + setTimeout(function() { + pipeline.setPipeline( + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'HELLO') + cb(null, data.toString().toLowerCase()) + }), + through(function(data, enc, cb) { + t.same(data.toString(), 'hello') + cb(null, data.toString().toUpperCase()) + }) + ) + }, 100) +}) + +tape('early destroy', function(t) { + var a = through() + var b = through() + var c = through() + + b.destroy = function() { + t.ok(true) + t.end() + } + + var pipeline = pumpify() + + pipeline.destroy() + setTimeout(function() { + pipeline.setPipeline(a, b, c) + }, 100) +}) + +tape('preserves error', function (t) { + var a = through() + var b = through(function (data, enc, cb) { + cb(new Error('stop')) + }) + var c = through() + var s = pumpify() + + s.on('error', function (err) { + t.same(err.message, 'stop') + t.end() + }) + + s.setPipeline(a, b, c) + s.resume() + s.write('hi') +}) + +tape('preserves error again', function (t) { + var ws = new stream.Writable() + var rs = new stream.Readable({highWaterMark: 16}) + + ws._write = function (data, enc, cb) { + cb(null) + } + + rs._read = function () { + process.nextTick(function () { + rs.push('hello world') + }) + } + + var pumpifyErr = pumpify( + through(), + through(function(chunk, _, cb) { + cb(new Error('test')) + }), + ws + ) + + rs.pipe(pumpifyErr) + .on('error', function (err) { + t.ok(err) + t.ok(err.message !== 'premature close', 'does not close with premature close') + t.end() + }) +}) + +tape('returns error from duplexify', function (t) { + var a = through() + var b = duplexify() + var s = pumpify() + + s.setPipeline(a, b) + + s.on('error', function (err) { + t.same(err.message, 'stop') + t.end() + }) + + s.write('data') + // Test passes if `.end()` is not called + s.end() + + b.setWritable(through()) + + setImmediate(function () { + b.destroy(new Error('stop')) + }) +}) diff --git a/packages/字体精简工具/node_modules/punycode/LICENSE-MIT.txt b/packages/字体精简工具/node_modules/punycode/LICENSE-MIT.txt new file mode 100644 index 0000000..a41e0a7 --- /dev/null +++ b/packages/字体精简工具/node_modules/punycode/LICENSE-MIT.txt @@ -0,0 +1,20 @@ +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/punycode/README.md b/packages/字体精简工具/node_modules/punycode/README.md new file mode 100644 index 0000000..ee2f9d6 --- /dev/null +++ b/packages/字体精简工具/node_modules/punycode/README.md @@ -0,0 +1,122 @@ +# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.svg?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Code coverage status](http://img.shields.io/codecov/c/github/bestiejs/punycode.js.svg)](https://codecov.io/gh/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.svg)](https://gemnasium.com/bestiejs/punycode.js) + +Punycode.js is a robust Punycode converter that fully complies to [RFC 3492](https://tools.ietf.org/html/rfc3492) and [RFC 5891](https://tools.ietf.org/html/rfc5891). + +This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm: + +* [The C example code from RFC 3492](https://tools.ietf.org/html/rfc3492#appendix-C) +* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c) +* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c) +* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287) +* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072)) + +This project was [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with Node.js from [v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc) until [v7](https://github.com/nodejs/node/pull/7941) (soft-deprecated). + +The current version supports recent versions of Node.js only. It provides a CommonJS module and an ES6 module. For the old version that offers the same functionality with broader support, including Rhino, Ringo, Narwhal, and web browsers, see [v1.4.1](https://github.com/bestiejs/punycode.js/releases/tag/v1.4.1). + +## Installation + +Via [npm](https://www.npmjs.com/): + +```bash +npm install punycode --save +``` + +In [Node.js](https://nodejs.org/): + +```js +const punycode = require('punycode'); +``` + +## API + +### `punycode.decode(string)` + +Converts a Punycode string of ASCII symbols to a string of Unicode symbols. + +```js +// decode domain name parts +punycode.decode('maana-pta'); // 'mañana' +punycode.decode('--dqo34k'); // '☃-⌘' +``` + +### `punycode.encode(string)` + +Converts a string of Unicode symbols to a Punycode string of ASCII symbols. + +```js +// encode domain name parts +punycode.encode('mañana'); // 'maana-pta' +punycode.encode('☃-⌘'); // '--dqo34k' +``` + +### `punycode.toUnicode(input)` + +Converts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode. + +```js +// decode domain names +punycode.toUnicode('xn--maana-pta.com'); +// → 'mañana.com' +punycode.toUnicode('xn----dqo34k.com'); +// → '☃-⌘.com' + +// decode email addresses +punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'); +// → 'джумла@джpумлатест.bрфa' +``` + +### `punycode.toASCII(input)` + +Converts a lowercased Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that’s already in ASCII. + +```js +// encode domain names +punycode.toASCII('mañana.com'); +// → 'xn--maana-pta.com' +punycode.toASCII('☃-⌘.com'); +// → 'xn----dqo34k.com' + +// encode email addresses +punycode.toASCII('джумла@джpумлатест.bрфa'); +// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq' +``` + +### `punycode.ucs2` + +#### `punycode.ucs2.decode(string)` + +Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](https://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16. + +```js +punycode.ucs2.decode('abc'); +// → [0x61, 0x62, 0x63] +// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE: +punycode.ucs2.decode('\uD834\uDF06'); +// → [0x1D306] +``` + +#### `punycode.ucs2.encode(codePoints)` + +Creates a string based on an array of numeric code point values. + +```js +punycode.ucs2.encode([0x61, 0x62, 0x63]); +// → 'abc' +punycode.ucs2.encode([0x1D306]); +// → '\uD834\uDF06' +``` + +### `punycode.version` + +A string representing the current Punycode.js version number. + +## Author + +| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | +|---| +| [Mathias Bynens](https://mathiasbynens.be/) | + +## License + +Punycode.js is available under the [MIT](https://mths.be/mit) license. diff --git a/packages/字体精简工具/node_modules/punycode/package.json b/packages/字体精简工具/node_modules/punycode/package.json new file mode 100644 index 0000000..88b76d7 --- /dev/null +++ b/packages/字体精简工具/node_modules/punycode/package.json @@ -0,0 +1,86 @@ +{ + "_from": "punycode@^2.1.0", + "_id": "punycode@2.1.1", + "_inBundle": false, + "_integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "_location": "/punycode", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "punycode@^2.1.0", + "name": "punycode", + "escapedName": "punycode", + "rawSpec": "^2.1.0", + "saveSpec": null, + "fetchSpec": "^2.1.0" + }, + "_requiredBy": [ + "/tough-cookie", + "/uri-js" + ], + "_resolved": "https://registry.nlark.com/punycode/download/punycode-2.1.1.tgz", + "_shasum": "b58b010ac40c22c5657616c8d2c2c02c7bf479ec", + "_spec": "punycode@^2.1.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\uri-js", + "author": { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + }, + "bugs": { + "url": "https://github.com/bestiejs/punycode.js/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Mathias Bynens", + "url": "https://mathiasbynens.be/" + } + ], + "deprecated": false, + "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.", + "devDependencies": { + "codecov": "^1.0.1", + "istanbul": "^0.4.1", + "mocha": "^2.5.3" + }, + "engines": { + "node": ">=6" + }, + "files": [ + "LICENSE-MIT.txt", + "punycode.js", + "punycode.es6.js" + ], + "homepage": "https://mths.be/punycode", + "jsnext:main": "punycode.es6.js", + "jspm": { + "map": { + "./punycode.js": { + "node": "@node/punycode" + } + } + }, + "keywords": [ + "punycode", + "unicode", + "idn", + "idna", + "dns", + "url", + "domain" + ], + "license": "MIT", + "main": "punycode.js", + "module": "punycode.es6.js", + "name": "punycode", + "repository": { + "type": "git", + "url": "git+https://github.com/bestiejs/punycode.js.git" + }, + "scripts": { + "prepublish": "node scripts/prepublish.js", + "test": "mocha tests" + }, + "version": "2.1.1" +} diff --git a/packages/字体精简工具/node_modules/punycode/punycode.es6.js b/packages/字体精简工具/node_modules/punycode/punycode.es6.js new file mode 100644 index 0000000..4610bc9 --- /dev/null +++ b/packages/字体精简工具/node_modules/punycode/punycode.es6.js @@ -0,0 +1,441 @@ +'use strict'; + +/** Highest positive signed 32-bit float value */ +const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +const base = 36; +const tMin = 1; +const tMax = 26; +const skew = 38; +const damp = 700; +const initialBias = 72; +const initialN = 128; // 0x80 +const delimiter = '-'; // '\x2D' + +/** Regular expressions */ +const regexPunycode = /^xn--/; +const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +const errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +const baseMinusTMin = base - tMin; +const floor = Math.floor; +const stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + const result = []; + let length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + const parts = string.split('@'); + let result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + const labels = string.split('.'); + const encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + const output = []; + let counter = 0; + const length = string.length; + while (counter < length) { + const value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + const extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +const ucs2encode = array => String.fromCodePoint(...array); + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +const basicToDigit = function(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +const digitToBasic = function(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +const adapt = function(delta, numPoints, firstTime) { + let k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +const decode = function(input) { + // Don't use UCS-2. + const output = []; + const inputLength = input.length; + let i = 0; + let n = initialN; + let bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + let basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (let j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + let oldi = i; + for (let w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + const digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + const baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + const out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + + } + + return String.fromCodePoint(...output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +const encode = function(input) { + const output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + let inputLength = input.length; + + // Initialize the state. + let n = initialN; + let delta = 0; + let bias = initialBias; + + // Handle the basic code points. + for (const currentValue of input) { + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + let basicLength = output.length; + let handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + let m = maxInt; + for (const currentValue of input) { + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + const handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (const currentValue of input) { + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + if (currentValue == n) { + // Represent delta as a generalized variable-length integer. + let q = delta; + for (let k = base; /* no condition */; k += base) { + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + const qMinusT = q - t; + const baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +const toUnicode = function(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +const toASCII = function(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +const punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +export { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode }; +export default punycode; diff --git a/packages/字体精简工具/node_modules/punycode/punycode.js b/packages/字体精简工具/node_modules/punycode/punycode.js new file mode 100644 index 0000000..ea61fd0 --- /dev/null +++ b/packages/字体精简工具/node_modules/punycode/punycode.js @@ -0,0 +1,440 @@ +'use strict'; + +/** Highest positive signed 32-bit float value */ +const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +const base = 36; +const tMin = 1; +const tMax = 26; +const skew = 38; +const damp = 700; +const initialBias = 72; +const initialN = 128; // 0x80 +const delimiter = '-'; // '\x2D' + +/** Regular expressions */ +const regexPunycode = /^xn--/; +const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +const errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +const baseMinusTMin = base - tMin; +const floor = Math.floor; +const stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + const result = []; + let length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + const parts = string.split('@'); + let result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + const labels = string.split('.'); + const encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + const output = []; + let counter = 0; + const length = string.length; + while (counter < length) { + const value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + const extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +const ucs2encode = array => String.fromCodePoint(...array); + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +const basicToDigit = function(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +const digitToBasic = function(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +const adapt = function(delta, numPoints, firstTime) { + let k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +const decode = function(input) { + // Don't use UCS-2. + const output = []; + const inputLength = input.length; + let i = 0; + let n = initialN; + let bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + let basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (let j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + let oldi = i; + for (let w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + const digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + const baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + const out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + + } + + return String.fromCodePoint(...output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +const encode = function(input) { + const output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + let inputLength = input.length; + + // Initialize the state. + let n = initialN; + let delta = 0; + let bias = initialBias; + + // Handle the basic code points. + for (const currentValue of input) { + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + let basicLength = output.length; + let handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + let m = maxInt; + for (const currentValue of input) { + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + const handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (const currentValue of input) { + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + if (currentValue == n) { + // Represent delta as a generalized variable-length integer. + let q = delta; + for (let k = base; /* no condition */; k += base) { + const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + const qMinusT = q - t; + const baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +const toUnicode = function(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +const toASCII = function(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +const punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +module.exports = punycode; diff --git a/packages/字体精简工具/node_modules/qs/.editorconfig b/packages/字体精简工具/node_modules/qs/.editorconfig new file mode 100644 index 0000000..b2654e7 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/.editorconfig @@ -0,0 +1,30 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 140 + +[test/*] +max_line_length = off + +[*.md] +max_line_length = off + +[*.json] +max_line_length = off + +[Makefile] +max_line_length = off + +[CHANGELOG.md] +indent_style = space +indent_size = 2 + +[LICENSE] +indent_size = 2 +max_line_length = off diff --git a/packages/字体精简工具/node_modules/qs/.eslintignore b/packages/字体精简工具/node_modules/qs/.eslintignore new file mode 100644 index 0000000..1521c8b --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/.eslintignore @@ -0,0 +1 @@ +dist diff --git a/packages/字体精简工具/node_modules/qs/.eslintrc b/packages/字体精简工具/node_modules/qs/.eslintrc new file mode 100644 index 0000000..b7a87b9 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/.eslintrc @@ -0,0 +1,19 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "complexity": 0, + "consistent-return": 1, + "func-name-matching": 0, + "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], + "indent": [2, 4], + "max-params": [2, 12], + "max-statements": [2, 45], + "no-continue": 1, + "no-magic-numbers": 0, + "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], + "operator-linebreak": [2, "before"], + } +} diff --git a/packages/字体精简工具/node_modules/qs/CHANGELOG.md b/packages/字体精简工具/node_modules/qs/CHANGELOG.md new file mode 100644 index 0000000..fe52320 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/CHANGELOG.md @@ -0,0 +1,226 @@ +## **6.5.2** +- [Fix] use `safer-buffer` instead of `Buffer` constructor +- [Refactor] utils: `module.exports` one thing, instead of mutating `exports` (#230) +- [Dev Deps] update `browserify`, `eslint`, `iconv-lite`, `safer-buffer`, `tape`, `browserify` + +## **6.5.1** +- [Fix] Fix parsing & compacting very deep objects (#224) +- [Refactor] name utils functions +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` +- [Tests] up to `node` `v8.4`; use `nvm install-latest-npm` so newer npm doesn’t break older node +- [Tests] Use precise dist for Node.js 0.6 runtime (#225) +- [Tests] make 0.6 required, now that it’s passing +- [Tests] on `node` `v8.2`; fix npm on node 0.6 + +## **6.5.0** +- [New] add `utils.assign` +- [New] pass default encoder/decoder to custom encoder/decoder functions (#206) +- [New] `parse`/`stringify`: add `ignoreQueryPrefix`/`addQueryPrefix` options, respectively (#213) +- [Fix] Handle stringifying empty objects with addQueryPrefix (#217) +- [Fix] do not mutate `options` argument (#207) +- [Refactor] `parse`: cache index to reuse in else statement (#182) +- [Docs] add various badges to readme (#208) +- [Dev Deps] update `eslint`, `browserify`, `iconv-lite`, `tape` +- [Tests] up to `node` `v8.1`, `v7.10`, `v6.11`; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4 +- [Tests] add `editorconfig-tools` + +## **6.4.0** +- [New] `qs.stringify`: add `encodeValuesOnly` option +- [Fix] follow `allowPrototypes` option during merge (#201, #201) +- [Fix] support keys starting with brackets (#202, #200) +- [Fix] chmod a-x +- [Dev Deps] update `eslint` +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds +- [eslint] reduce warnings + +## **6.3.2** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Dev Deps] update `eslint` +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.3.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties (thanks, @snyk!) +- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `browserify`, `iconv-lite`, `qs-iconv`, `tape` +- [Tests] on all node minors; improve test matrix +- [Docs] document stringify option `allowDots` (#195) +- [Docs] add empty object and array values example (#195) +- [Docs] Fix minor inconsistency/typo (#192) +- [Docs] document stringify option `sort` (#191) +- [Refactor] `stringify`: throw faster with an invalid encoder +- [Refactor] remove unnecessary escapes (#184) +- Remove contributing.md, since `qs` is no longer part of `hapi` (#183) + +## **6.3.0** +- [New] Add support for RFC 1738 (#174, #173) +- [New] `stringify`: Add `serializeDate` option to customize Date serialization (#159) +- [Fix] ensure `utils.merge` handles merging two arrays +- [Refactor] only constructors should be capitalized +- [Refactor] capitalized var names are for constructors only +- [Refactor] avoid using a sparse array +- [Robustness] `formats`: cache `String#replace` +- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`; add `safe-publish-latest` +- [Tests] up to `node` `v6.8`, `v4.6`; improve test matrix +- [Tests] flesh out arrayLimit/arrayFormat tests (#107) +- [Tests] skip Object.create tests when null objects are not available +- [Tests] Turn on eslint for test files (#175) + +## **6.2.3** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.2.2** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## **6.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values +- [Refactor] Be explicit and use `Object.prototype.hasOwnProperty.call` +- [Tests] remove `parallelshell` since it does not reliably report failures +- [Tests] up to `node` `v6.3`, `v5.12` +- [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `qs-iconv` + +## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed) +- [New] pass Buffers to the encoder/decoder directly (#161) +- [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160) +- [Fix] fix compacting of nested sparse arrays (#150) + +## **6.1.2 +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.1.1** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties + +## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed) +- [New] allowDots option for `stringify` (#151) +- [Fix] "sort" option should work at a depth of 3 or more (#151) +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## **6.0.4** +- [Fix] follow `allowPrototypes` option during merge (#201, #200) +- [Fix] chmod a-x +- [Fix] support keys starting with brackets (#202, #200) +- [Tests] up to `node` `v7.7`, `v6.10`,` v4.8`; disable osx builds since they block linux builds + +## **6.0.3** +- [Fix] ensure that `allowPrototypes: false` does not ever shadow Object.prototype properties +- [Fix] Restore `dist` directory; will be removed in v7 (#148) + +## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed) +- Revert ES6 requirement and restore support for node down to v0.8. + +## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed) +- [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json + +## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed) +- [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4 + +## **5.2.1** +- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values + +## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed) +- [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string + +## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed) +- [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional +- [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify + +## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed) +- [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false +- [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm + +## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed) +- [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional + +## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed) +- [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" + +## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed) +- [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties +- [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost +- [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing +- [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object +- [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option +- [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects. +- [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47 +- [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986 +- [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign +- [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute + +## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed) +- [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object # is not a function + +## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed) +- [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option + +## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed) +- [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57 +- [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader + +## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed) +- [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object + +## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed) +- [**#52**](https://github.com/ljharb/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". + +## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed) +- [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46 + +## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed) +- [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer? +- [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45 +- [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39 + +## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed) +- [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number + +## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed) +- [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array +- [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x + +## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed) +- [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value +- [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty +- [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver? + +## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed) +- [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31 +- [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects + +## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed) +- [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present +- [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays +- [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge +- [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters? + +## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed) +- [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter + +## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed) +- [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit? +- [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit +- [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20 + +## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed) +- [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values + +## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed) +- [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters +- [**#15**](https://github.com/ljharb/qs/issues/15) Close code block + +## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed) +- [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument +- [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed + +## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed) +- [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted +- [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null +- [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README + +## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed) +- [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/packages/字体精简工具/node_modules/qs/LICENSE b/packages/字体精简工具/node_modules/qs/LICENSE new file mode 100644 index 0000000..d456948 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014 Nathan LaFreniere and other contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * The names of any contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * * * + +The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/packages/字体精简工具/node_modules/qs/README.md b/packages/字体精简工具/node_modules/qs/README.md new file mode 100644 index 0000000..d811966 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/README.md @@ -0,0 +1,475 @@ +# qs [![Version Badge][2]][1] + +[![Build Status][3]][4] +[![dependency status][5]][6] +[![dev dependency status][7]][8] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][11]][1] + +A querystring parsing and stringifying library with some added security. + +Lead Maintainer: [Jordan Harband](https://github.com/ljharb) + +The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). + +## Usage + +```javascript +var qs = require('qs'); +var assert = require('assert'); + +var obj = qs.parse('a=c'); +assert.deepEqual(obj, { a: 'c' }); + +var str = qs.stringify(obj); +assert.equal(str, 'a=c'); +``` + +### Parsing Objects + +[](#preventEval) +```javascript +qs.parse(string, [options]); +``` + +**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`. +For example, the string `'foo[bar]=baz'` converts to: + +```javascript +assert.deepEqual(qs.parse('foo[bar]=baz'), { + foo: { + bar: 'baz' + } +}); +``` + +When using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: + +```javascript +var nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true }); +assert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } }); +``` + +By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. + +```javascript +var protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }); +assert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } }); +``` + +URI encoded strings work too: + +```javascript +assert.deepEqual(qs.parse('a%5Bb%5D=c'), { + a: { b: 'c' } +}); +``` + +You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: + +```javascript +assert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), { + foo: { + bar: { + baz: 'foobarbaz' + } + } +}); +``` + +By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like +`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: + +```javascript +var expected = { + a: { + b: { + c: { + d: { + e: { + f: { + '[g][h][i]': 'j' + } + } + } + } + } + } +}; +var string = 'a[b][c][d][e][f][g][h][i]=j'; +assert.deepEqual(qs.parse(string), expected); +``` + +This depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`: + +```javascript +var deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); +assert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } }); +``` + +The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. + +For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: + +```javascript +var limited = qs.parse('a=b&c=d', { parameterLimit: 1 }); +assert.deepEqual(limited, { a: 'b' }); +``` + +To bypass the leading question mark, use `ignoreQueryPrefix`: + +```javascript +var prefixed = qs.parse('?a=b&c=d', { ignoreQueryPrefix: true }); +assert.deepEqual(prefixed, { a: 'b', c: 'd' }); +``` + +An optional delimiter can also be passed: + +```javascript +var delimited = qs.parse('a=b;c=d', { delimiter: ';' }); +assert.deepEqual(delimited, { a: 'b', c: 'd' }); +``` + +Delimiters can be a regular expression too: + +```javascript +var regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); +assert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' }); +``` + +Option `allowDots` can be used to enable dot notation: + +```javascript +var withDots = qs.parse('a.b=c', { allowDots: true }); +assert.deepEqual(withDots, { a: { b: 'c' } }); +``` + +### Parsing Arrays + +**qs** can also parse arrays using a similar `[]` notation: + +```javascript +var withArray = qs.parse('a[]=b&a[]=c'); +assert.deepEqual(withArray, { a: ['b', 'c'] }); +``` + +You may specify an index as well: + +```javascript +var withIndexes = qs.parse('a[1]=c&a[0]=b'); +assert.deepEqual(withIndexes, { a: ['b', 'c'] }); +``` + +Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number +to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving +their order: + +```javascript +var noSparse = qs.parse('a[1]=b&a[15]=c'); +assert.deepEqual(noSparse, { a: ['b', 'c'] }); +``` + +Note that an empty string is also a value, and will be preserved: + +```javascript +var withEmptyString = qs.parse('a[]=&a[]=b'); +assert.deepEqual(withEmptyString, { a: ['', 'b'] }); + +var withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c'); +assert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] }); +``` + +**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will +instead be converted to an object with the index as the key: + +```javascript +var withMaxIndex = qs.parse('a[100]=b'); +assert.deepEqual(withMaxIndex, { a: { '100': 'b' } }); +``` + +This limit can be overridden by passing an `arrayLimit` option: + +```javascript +var withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 }); +assert.deepEqual(withArrayLimit, { a: { '1': 'b' } }); +``` + +To disable array parsing entirely, set `parseArrays` to `false`. + +```javascript +var noParsingArrays = qs.parse('a[]=b', { parseArrays: false }); +assert.deepEqual(noParsingArrays, { a: { '0': 'b' } }); +``` + +If you mix notations, **qs** will merge the two items into an object: + +```javascript +var mixedNotation = qs.parse('a[0]=b&a[b]=c'); +assert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } }); +``` + +You can also create arrays of objects: + +```javascript +var arraysOfObjects = qs.parse('a[][b]=c'); +assert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] }); +``` + +### Stringifying + +[](#preventEval) +```javascript +qs.stringify(object, [options]); +``` + +When stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect: + +```javascript +assert.equal(qs.stringify({ a: 'b' }), 'a=b'); +assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); +``` + +This encoding can be disabled by setting the `encode` option to `false`: + +```javascript +var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false }); +assert.equal(unencoded, 'a[b]=c'); +``` + +Encoding can be disabled for keys by setting the `encodeValuesOnly` option to `true`: +```javascript +var encodedValues = qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } +); +assert.equal(encodedValues,'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h'); +``` + +This encoding can also be replaced by a custom encoding method set as `encoder` option: + +```javascript +var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) { + // Passed in values `a`, `b`, `c` + return // Return encoded string +}}) +``` + +_(Note: the `encoder` option does not apply if `encode` is `false`)_ + +Analogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values: + +```javascript +var decoded = qs.parse('x=z', { decoder: function (str) { + // Passed in values `x`, `z` + return // Return decoded string +}}) +``` + +Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. + +When arrays are stringified, by default they are given explicit indices: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }); +// 'a[0]=b&a[1]=c&a[2]=d' +``` + +You may override this by setting the `indices` option to `false`: + +```javascript +qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); +// 'a=b&a=c&a=d' +``` + +You may use the `arrayFormat` option to specify the format of the output array: + +```javascript +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) +// 'a[0]=b&a[1]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) +// 'a[]=b&a[]=c' +qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) +// 'a=b&a=c' +``` + +When objects are stringified, by default they use bracket notation: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }); +// 'a[b][c]=d&a[b][e]=f' +``` + +You may override this to use dot notation by setting the `allowDots` option to `true`: + +```javascript +qs.stringify({ a: { b: { c: 'd', e: 'f' } } }, { allowDots: true }); +// 'a.b.c=d&a.b.e=f' +``` + +Empty strings and null values will omit the value, but the equals sign (=) remains in place: + +```javascript +assert.equal(qs.stringify({ a: '' }), 'a='); +``` + +Key with no values (such as an empty object or array) will return nothing: + +```javascript +assert.equal(qs.stringify({ a: [] }), ''); +assert.equal(qs.stringify({ a: {} }), ''); +assert.equal(qs.stringify({ a: [{}] }), ''); +assert.equal(qs.stringify({ a: { b: []} }), ''); +assert.equal(qs.stringify({ a: { b: {}} }), ''); +``` + +Properties that are set to `undefined` will be omitted entirely: + +```javascript +assert.equal(qs.stringify({ a: null, b: undefined }), 'a='); +``` + +The query string may optionally be prepended with a question mark: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { addQueryPrefix: true }), '?a=b&c=d'); +``` + +The delimiter may be overridden with stringify as well: + +```javascript +assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); +``` + +If you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option: + +```javascript +var date = new Date(7); +assert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A')); +assert.equal( + qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }), + 'a=7' +); +``` + +You may use the `sort` option to affect the order of parameter keys: + +```javascript +function alphabeticalSort(a, b) { + return a.localeCompare(b); +} +assert.equal(qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort: alphabeticalSort }), 'a=c&b=f&z=y'); +``` + +Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. +If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you +pass an array, it will be used to select properties and array indices for stringification: + +```javascript +function filterFunc(prefix, value) { + if (prefix == 'b') { + // Return an `undefined` value to omit a property. + return; + } + if (prefix == 'e[f]') { + return value.getTime(); + } + if (prefix == 'e[g][0]') { + return value * 2; + } + return value; +} +qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }); +// 'a=b&c=d&e[f]=123&e[g][0]=4' +qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }); +// 'a=b&e=f' +qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }); +// 'a[0]=b&a[2]=d' +``` + +### Handling of `null` values + +By default, `null` values are treated like empty strings: + +```javascript +var withNull = qs.stringify({ a: null, b: '' }); +assert.equal(withNull, 'a=&b='); +``` + +Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. + +```javascript +var equalsInsensitive = qs.parse('a&b='); +assert.deepEqual(equalsInsensitive, { a: '', b: '' }); +``` + +To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` +values have no `=` sign: + +```javascript +var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); +assert.equal(strictNull, 'a&b='); +``` + +To parse values without `=` back to `null` use the `strictNullHandling` flag: + +```javascript +var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true }); +assert.deepEqual(parsedStrictNull, { a: null, b: '' }); +``` + +To completely skip rendering keys with `null` values, use the `skipNulls` flag: + +```javascript +var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true }); +assert.equal(nullsSkipped, 'a=b'); +``` + +### Dealing with special character sets + +By default the encoding and decoding of characters is done in `utf-8`. If you +wish to encode querystrings to a different character set (i.e. +[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the +[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library: + +```javascript +var encoder = require('qs-iconv/encoder')('shift_jis'); +var shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder }); +assert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I'); +``` + +This also works for decoding of query strings: + +```javascript +var decoder = require('qs-iconv/decoder')('shift_jis'); +var obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder }); +assert.deepEqual(obj, { a: 'こんにちは!' }); +``` + +### RFC 3986 and RFC 1738 space encoding + +RFC3986 used as default option and encodes ' ' to *%20* which is backward compatible. +In the same time, output can be stringified as per RFC1738 with ' ' equal to '+'. + +``` +assert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c'); +assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c'); +``` + +[1]: https://npmjs.org/package/qs +[2]: http://versionbadg.es/ljharb/qs.svg +[3]: https://api.travis-ci.org/ljharb/qs.svg +[4]: https://travis-ci.org/ljharb/qs +[5]: https://david-dm.org/ljharb/qs.svg +[6]: https://david-dm.org/ljharb/qs +[7]: https://david-dm.org/ljharb/qs/dev-status.svg +[8]: https://david-dm.org/ljharb/qs?type=dev +[9]: https://ci.testling.com/ljharb/qs.png +[10]: https://ci.testling.com/ljharb/qs +[11]: https://nodei.co/npm/qs.png?downloads=true&stars=true +[license-image]: http://img.shields.io/npm/l/qs.svg +[license-url]: LICENSE +[downloads-image]: http://img.shields.io/npm/dm/qs.svg +[downloads-url]: http://npm-stat.com/charts.html?package=qs diff --git a/packages/字体精简工具/node_modules/qs/dist/qs.js b/packages/字体精简工具/node_modules/qs/dist/qs.js new file mode 100644 index 0000000..ecf7ba4 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/dist/qs.js @@ -0,0 +1,638 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]') { + obj = []; + obj = obj.concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys + // that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +module.exports = function (str, opts) { + var options = opts ? utils.assign({}, opts) : {}; + + if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; + options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; + options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; + options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; + options.parseArrays = options.parseArrays !== false; + options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; + options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; + options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; + options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; + options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; + options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; + +},{"./utils":5}],4:[function(require,module,exports){ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (Array.isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (Array.isArray(obj)) { + values = values.concat(stringify( + obj[key], + generateArrayPrefix(prefix, key), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } else { + values = values.concat(stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + } + + return values; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = opts ? utils.assign({}, opts) : {}; + + if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; + var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; + var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; + var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; + var sort = typeof options.sort === 'function' ? options.sort : null; + var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; + var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; + var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; + if (typeof options.format === 'undefined') { + options.format = formats['default']; + } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { + throw new TypeError('Unknown format option provided.'); + } + var formatter = formats.formatters[options.format]; + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (Array.isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (options.arrayFormat in arrayPrefixGenerators) { + arrayFormat = options.arrayFormat; + } else if ('indices' in options) { + arrayFormat = options.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (sort) { + objKeys.sort(sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + keys = keys.concat(stringify( + obj[key], + key, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encode ? encoder : null, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + + var joined = keys.join(delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + return joined.length > 0 ? prefix + joined : ''; +}; + +},{"./formats":1,"./utils":5}],5:[function(require,module,exports){ +'use strict'; + +var has = Object.prototype.hasOwnProperty; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + var obj; + + while (queue.length) { + var item = queue.pop(); + obj = item.obj[item.prop]; + + if (Array.isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } + + return obj; +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (Array.isArray(target)) { + target.push(source); + } else if (typeof target === 'object') { + if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (Array.isArray(target) && !Array.isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (Array.isArray(target) && Array.isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + if (target[i] && typeof target[i] === 'object') { + target[i] = merge(target[i], item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str) { + try { + return decodeURIComponent(str.replace(/\+/g, ' ')); + } catch (e) { + return str; + } +}; + +var encode = function encode(str) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + return compactQueue(queue); +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; + +},{}]},{},[2])(2) +}); diff --git a/packages/字体精简工具/node_modules/qs/lib/formats.js b/packages/字体精简工具/node_modules/qs/lib/formats.js new file mode 100644 index 0000000..df45997 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/lib/formats.js @@ -0,0 +1,18 @@ +'use strict'; + +var replace = String.prototype.replace; +var percentTwenties = /%20/g; + +module.exports = { + 'default': 'RFC3986', + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return value; + } + }, + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; diff --git a/packages/字体精简工具/node_modules/qs/lib/index.js b/packages/字体精简工具/node_modules/qs/lib/index.js new file mode 100644 index 0000000..0d6a97d --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/lib/index.js @@ -0,0 +1,11 @@ +'use strict'; + +var stringify = require('./stringify'); +var parse = require('./parse'); +var formats = require('./formats'); + +module.exports = { + formats: formats, + parse: parse, + stringify: stringify +}; diff --git a/packages/字体精简工具/node_modules/qs/lib/parse.js b/packages/字体精简工具/node_modules/qs/lib/parse.js new file mode 100644 index 0000000..8c9872e --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/lib/parse.js @@ -0,0 +1,174 @@ +'use strict'; + +var utils = require('./utils'); + +var has = Object.prototype.hasOwnProperty; + +var defaults = { + allowDots: false, + allowPrototypes: false, + arrayLimit: 20, + decoder: utils.decode, + delimiter: '&', + depth: 5, + parameterLimit: 1000, + plainObjects: false, + strictNullHandling: false +}; + +var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + + for (var i = 0; i < parts.length; ++i) { + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder); + val = options.decoder(part.slice(pos + 1), defaults.decoder); + } + if (has.call(obj, key)) { + obj[key] = [].concat(obj[key]).concat(val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options) { + var leaf = val; + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]') { + obj = []; + obj = obj.concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys + // that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options); +}; + +module.exports = function (str, opts) { + var options = opts ? utils.assign({}, opts) : {}; + + if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; + options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; + options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; + options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; + options.parseArrays = options.parseArrays !== false; + options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; + options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; + options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; + options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; + options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; + options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options); + obj = utils.merge(obj, newObj, options); + } + + return utils.compact(obj); +}; diff --git a/packages/字体精简工具/node_modules/qs/lib/stringify.js b/packages/字体精简工具/node_modules/qs/lib/stringify.js new file mode 100644 index 0000000..ab915ac --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/lib/stringify.js @@ -0,0 +1,210 @@ +'use strict'; + +var utils = require('./utils'); +var formats = require('./formats'); + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { // eslint-disable-line func-name-matching + return prefix + '[]'; + }, + indices: function indices(prefix, key) { // eslint-disable-line func-name-matching + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { // eslint-disable-line func-name-matching + return prefix; + } +}; + +var toISO = Date.prototype.toISOString; + +var defaults = { + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var stringify = function stringify( // eslint-disable-line func-name-matching + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly +) { + var obj = object; + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; + } + + obj = ''; + } + + if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (Array.isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + if (Array.isArray(obj)) { + values = values.concat(stringify( + obj[key], + generateArrayPrefix(prefix, key), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } else { + values = values.concat(stringify( + obj[key], + prefix + (allowDots ? '.' + key : '[' + key + ']'), + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + } + + return values; +}; + +module.exports = function (object, opts) { + var obj = object; + var options = opts ? utils.assign({}, opts) : {}; + + if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; + var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; + var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; + var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; + var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; + var sort = typeof options.sort === 'function' ? options.sort : null; + var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; + var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; + var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; + if (typeof options.format === 'undefined') { + options.format = formats['default']; + } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { + throw new TypeError('Unknown format option provided.'); + } + var formatter = formats.formatters[options.format]; + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (Array.isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (options.arrayFormat in arrayPrefixGenerators) { + arrayFormat = options.arrayFormat; + } else if ('indices' in options) { + arrayFormat = options.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (sort) { + objKeys.sort(sort); + } + + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (skipNulls && obj[key] === null) { + continue; + } + + keys = keys.concat(stringify( + obj[key], + key, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encode ? encoder : null, + filter, + sort, + allowDots, + serializeDate, + formatter, + encodeValuesOnly + )); + } + + var joined = keys.join(delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + return joined.length > 0 ? prefix + joined : ''; +}; diff --git a/packages/字体精简工具/node_modules/qs/lib/utils.js b/packages/字体精简工具/node_modules/qs/lib/utils.js new file mode 100644 index 0000000..8775a32 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/lib/utils.js @@ -0,0 +1,213 @@ +'use strict'; + +var has = Object.prototype.hasOwnProperty; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + var obj; + + while (queue.length) { + var item = queue.pop(); + obj = item.obj[item.prop]; + + if (Array.isArray(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } + + return obj; +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (Array.isArray(target)) { + target.push(source); + } else if (typeof target === 'object') { + if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (Array.isArray(target) && !Array.isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (Array.isArray(target) && Array.isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + if (target[i] && typeof target[i] === 'object') { + target[i] = merge(target[i], item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str) { + try { + return decodeURIComponent(str.replace(/\+/g, ' ')); + } catch (e) { + return str; + } +}; + +var encode = function encode(str) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = typeof str === 'string' ? str : String(str); + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + return compactQueue(queue); +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (obj === null || typeof obj === 'undefined') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + merge: merge +}; diff --git a/packages/字体精简工具/node_modules/qs/package.json b/packages/字体精简工具/node_modules/qs/package.json new file mode 100644 index 0000000..6ef001f --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/package.json @@ -0,0 +1,80 @@ +{ + "_from": "qs@~6.5.2", + "_id": "qs@6.5.2", + "_inBundle": false, + "_integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "_location": "/qs", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "qs@~6.5.2", + "name": "qs", + "escapedName": "qs", + "rawSpec": "~6.5.2", + "saveSpec": null, + "fetchSpec": "~6.5.2" + }, + "_requiredBy": [ + "/request" + ], + "_resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1616385328325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz", + "_shasum": "cb3ae806e8740444584ef154ce8ee98d403f3e36", + "_spec": "qs@~6.5.2", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\request", + "bugs": { + "url": "https://github.com/ljharb/qs/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Jordan Harband", + "email": "ljharb@gmail.com", + "url": "http://ljharb.codes" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "devDependencies": { + "@ljharb/eslint-config": "^12.2.1", + "browserify": "^16.2.0", + "covert": "^1.1.0", + "editorconfig-tools": "^0.1.1", + "eslint": "^4.19.1", + "evalmd": "^0.0.17", + "iconv-lite": "^0.4.21", + "mkdirp": "^0.5.1", + "qs-iconv": "^1.0.4", + "safe-publish-latest": "^1.1.1", + "safer-buffer": "^2.1.2", + "tape": "^4.9.0" + }, + "engines": { + "node": ">=0.6" + }, + "homepage": "https://github.com/ljharb/qs", + "keywords": [ + "querystring", + "qs" + ], + "license": "BSD-3-Clause", + "main": "lib/index.js", + "name": "qs", + "repository": { + "type": "git", + "url": "git+https://github.com/ljharb/qs.git" + }, + "scripts": { + "coverage": "covert test", + "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js", + "lint": "eslint lib/*.js test/*.js", + "prelint": "editorconfig-tools check * lib/* test/*", + "prepublish": "safe-publish-latest && npm run dist", + "pretest": "npm run --silent readme && npm run --silent lint", + "readme": "evalmd README.md", + "test": "npm run --silent coverage", + "tests-only": "node test" + }, + "version": "6.5.2" +} diff --git a/packages/字体精简工具/node_modules/qs/test/.eslintrc b/packages/字体精简工具/node_modules/qs/test/.eslintrc new file mode 100644 index 0000000..20175d6 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/test/.eslintrc @@ -0,0 +1,15 @@ +{ + "rules": { + "array-bracket-newline": 0, + "array-element-newline": 0, + "consistent-return": 2, + "max-lines": 0, + "max-nested-callbacks": [2, 3], + "max-statements": 0, + "no-buffer-constructor": 0, + "no-extend-native": 0, + "no-magic-numbers": 0, + "object-curly-newline": 0, + "sort-keys": 0 + } +} diff --git a/packages/字体精简工具/node_modules/qs/test/index.js b/packages/字体精简工具/node_modules/qs/test/index.js new file mode 100644 index 0000000..5e6bc8f --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/test/index.js @@ -0,0 +1,7 @@ +'use strict'; + +require('./parse'); + +require('./stringify'); + +require('./utils'); diff --git a/packages/字体精简工具/node_modules/qs/test/parse.js b/packages/字体精简工具/node_modules/qs/test/parse.js new file mode 100644 index 0000000..0f8fe45 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/test/parse.js @@ -0,0 +1,574 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('parse()', function (t) { + t.test('parses a simple string', function (st) { + st.deepEqual(qs.parse('0=foo'), { 0: 'foo' }); + st.deepEqual(qs.parse('foo=c++'), { foo: 'c ' }); + st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } }); + st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } }); + st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } }); + st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null }); + st.deepEqual(qs.parse('foo'), { foo: '' }); + st.deepEqual(qs.parse('foo='), { foo: '' }); + st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' }); + st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' }); + st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' }); + st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' }); + st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' }); + st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null }); + st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' }); + st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), { + cht: 'p3', + chd: 't:60,40', + chs: '250x100', + chl: 'Hello|World' + }); + st.end(); + }); + + t.test('allows enabling dot notation', function (st) { + st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' }); + st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string'); + t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string'); + t.deepEqual( + qs.parse('a[b][c][d][e][f][g][h]=i'), + { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }, + 'defaults to a depth of 5' + ); + + t.test('only parses one level when depth = 1', function (st) { + st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } }); + st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } }); + st.end(); + }); + + t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array'); + + t.test('parses an explicit array', function (st) { + st.deepEqual(qs.parse('a[]=b'), { a: ['b'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] }); + st.end(); + }); + + t.test('parses a mix of simple and explicit arrays', function (st) { + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); + + st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); + + st.end(); + }); + + t.test('parses a nested array', function (st) { + st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } }); + st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } }); + st.end(); + }); + + t.test('allows to specify array indices', function (st) { + st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] }); + st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] }); + st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } }); + st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] }); + st.end(); + }); + + t.test('limits specific array indices to arrayLimit', function (st) { + st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] }); + st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } }); + st.end(); + }); + + t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number'); + + t.test('supports encoded = signs', function (st) { + st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' }); + st.end(); + }); + + t.test('is ok with url encoded strings', function (st) { + st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } }); + st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } }); + st.end(); + }); + + t.test('allows brackets in the value', function (st) { + st.deepEqual(qs.parse('pets=["tobi"]'), { pets: '["tobi"]' }); + st.deepEqual(qs.parse('operators=[">=", "<="]'), { operators: '[">=", "<="]' }); + st.end(); + }); + + t.test('allows empty values', function (st) { + st.deepEqual(qs.parse(''), {}); + st.deepEqual(qs.parse(null), {}); + st.deepEqual(qs.parse(undefined), {}); + st.end(); + }); + + t.test('transforms arrays to objects', function (st) { + st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: false }), { a: { 0: 'b', t: 'u' } }); + st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: true }), { a: { 0: 'b', t: 'u', hasOwnProperty: 'c' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: false }), { a: { 0: 'b', x: 'y' } }); + st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: true }), { a: { 0: 'b', hasOwnProperty: 'c', x: 'y' } }); + st.end(); + }); + + t.test('transforms arrays to objects (dot notation)', function (st) { + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); + st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] }); + st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] }); + st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); + st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { 0: 'bar', bad: 'baz' } }); + st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); + st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); + st.end(); + }); + + t.test('correctly prunes undefined values when converting an array to an object', function (st) { + st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { 2: 'b', 99999999: 'c' } }); + st.end(); + }); + + t.test('supports malformed uri characters', function (st) { + st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null }); + st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' }); + st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' }); + st.end(); + }); + + t.test('doesn\'t produce empty keys', function (st) { + st.deepEqual(qs.parse('_r=1&'), { _r: '1' }); + st.end(); + }); + + t.test('cannot access Object prototype', function (st) { + qs.parse('constructor[prototype][bad]=bad'); + qs.parse('bad[constructor][prototype][bad]=bad'); + st.equal(typeof Object.prototype.bad, 'undefined'); + st.end(); + }); + + t.test('parses arrays of objects', function (st) { + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] }); + st.end(); + }); + + t.test('allows for empty strings in arrays', function (st) { + st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] }); + + st.deepEqual( + qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 20 + array indices: null then empty string works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', null, 'c', ''] }, + 'with arrayLimit 0 + array brackets: null then empty string works' + ); + + st.deepEqual( + qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true, arrayLimit: 20 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 20 + array indices: empty string then null works' + ); + st.deepEqual( + qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }), + { a: ['b', '', 'c', null] }, + 'with arrayLimit 0 + array brackets: empty string then null works' + ); + + st.deepEqual( + qs.parse('a[]=&a[]=b&a[]=c'), + { a: ['', 'b', 'c'] }, + 'array brackets: empty strings work' + ); + st.end(); + }); + + t.test('compacts sparse arrays', function (st) { + st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] }); + st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] }); + st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] }); + st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] }); + st.end(); + }); + + t.test('parses semi-parsed strings', function (st) { + st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } }); + st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } }); + st.end(); + }); + + t.test('parses buffers correctly', function (st) { + var b = SaferBuffer.from('test'); + st.deepEqual(qs.parse({ a: b }), { a: b }); + st.end(); + }); + + t.test('continues parsing when no parent is found', function (st) { + st.deepEqual(qs.parse('[]=&a=b'), { 0: '', a: 'b' }); + st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { 0: null, a: 'b' }); + st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' }); + st.end(); + }); + + t.test('does not error when parsing a very long array', function (st) { + var str = 'a[]=a'; + while (Buffer.byteLength(str) < 128 * 1024) { + str = str + '&' + str; + } + + st.doesNotThrow(function () { + qs.parse(str); + }); + + st.end(); + }); + + t.test('should not throw when a native prototype has an enumerable property', { parallel: false }, function (st) { + Object.prototype.crash = ''; + Array.prototype.crash = ''; + st.doesNotThrow(qs.parse.bind(null, 'a=b')); + st.deepEqual(qs.parse('a=b'), { a: 'b' }); + st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c')); + st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); + delete Object.prototype.crash; + delete Array.prototype.crash; + st.end(); + }); + + t.test('parses a string with an alternative string delimiter', function (st) { + st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('parses a string with an alternative RegExp delimiter', function (st) { + st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not use non-splittable objects as delimiters', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding parameter limit', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' }); + st.end(); + }); + + t.test('allows setting the parameter limit to Infinity', function (st) { + st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('allows overriding array limit', function (st) { + st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } }); + st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } }); + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } }); + st.end(); + }); + + t.test('allows disabling array parsing', function (st) { + st.deepEqual(qs.parse('a[0]=b&a[1]=c', { parseArrays: false }), { a: { 0: 'b', 1: 'c' } }); + st.end(); + }); + + t.test('allows for query string prefix', function (st) { + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('foo=bar', { ignoreQueryPrefix: true }), { foo: 'bar' }); + st.deepEqual(qs.parse('?foo=bar', { ignoreQueryPrefix: false }), { '?foo': 'bar' }); + st.end(); + }); + + t.test('parses an object', function (st) { + var input = { + 'user[name]': { 'pop[bob]': 3 }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses an object in dot notation', function (st) { + var input = { + 'user.name': { 'pop[bob]': 3 }, + 'user.email.': null + }; + + var expected = { + user: { + name: { 'pop[bob]': 3 }, + email: null + } + }; + + var result = qs.parse(input, { allowDots: true }); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('parses an object and not child values', function (st) { + var input = { + 'user[name]': { 'pop[bob]': { test: 3 } }, + 'user[email]': null + }; + + var expected = { + user: { + name: { 'pop[bob]': { test: 3 } }, + email: null + } + }; + + var result = qs.parse(input); + + st.deepEqual(result, expected); + st.end(); + }); + + t.test('does not blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.parse('a=b&c=d'); + global.Buffer = tempBuffer; + st.deepEqual(result, { a: 'b', c: 'd' }); + st.end(); + }); + + t.test('does not crash when parsing circular references', function (st) { + var a = {}; + a.b = a; + + var parsed; + + st.doesNotThrow(function () { + parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + st.equal('bar' in parsed.foo, true); + st.equal('baz' in parsed.foo, true); + st.equal(parsed.foo.bar, 'baz'); + st.deepEqual(parsed.foo.baz, a); + st.end(); + }); + + t.test('does not crash when parsing deep objects', function (st) { + var parsed; + var str = 'foo'; + + for (var i = 0; i < 5000; i++) { + str += '[p]'; + } + + str += '=bar'; + + st.doesNotThrow(function () { + parsed = qs.parse(str, { depth: 5000 }); + }); + + st.equal('foo' in parsed, true, 'parsed has "foo" property'); + + var depth = 0; + var ref = parsed.foo; + while ((ref = ref.p)) { + depth += 1; + } + + st.equal(depth, 5000, 'parsed is 5000 properties deep'); + + st.end(); + }); + + t.test('parses null objects correctly', { skip: !Object.create }, function (st) { + var a = Object.create(null); + a.b = 'c'; + + st.deepEqual(qs.parse(a), { b: 'c' }); + var result = qs.parse({ a: a }); + st.equal('a' in result, true, 'result has "a" property'); + st.deepEqual(result.a, a); + st.end(); + }); + + t.test('parses dates correctly', function (st) { + var now = new Date(); + st.deepEqual(qs.parse({ a: now }), { a: now }); + st.end(); + }); + + t.test('parses regular expressions correctly', function (st) { + var re = /^test$/; + st.deepEqual(qs.parse({ a: re }), { a: re }); + st.end(); + }); + + t.test('does not allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: false }), {}); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: false }), {}); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: false }), + {}, + 'bare "toString" results in {}' + ); + + st.end(); + }); + + t.test('can allow overwriting prototype properties', function (st) { + st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } }); + st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' }); + + st.deepEqual( + qs.parse('toString', { allowPrototypes: true }), + { toString: '' }, + 'bare "toString" results in { toString: "" }' + ); + + st.end(); + }); + + t.test('params starting with a closing bracket', function (st) { + st.deepEqual(qs.parse(']=toString'), { ']': 'toString' }); + st.deepEqual(qs.parse(']]=toString'), { ']]': 'toString' }); + st.deepEqual(qs.parse(']hello]=toString'), { ']hello]': 'toString' }); + st.end(); + }); + + t.test('params starting with a starting bracket', function (st) { + st.deepEqual(qs.parse('[=toString'), { '[': 'toString' }); + st.deepEqual(qs.parse('[[=toString'), { '[[': 'toString' }); + st.deepEqual(qs.parse('[hello[=toString'), { '[hello[': 'toString' }); + st.end(); + }); + + t.test('add keys to objects', function (st) { + st.deepEqual( + qs.parse('a[b]=c&a=d'), + { a: { b: 'c', d: true } }, + 'can add keys to objects' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString'), + { a: { b: 'c' } }, + 'can not overwrite prototype' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { allowPrototypes: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with allowPrototypes true' + ); + + st.deepEqual( + qs.parse('a[b]=c&a=toString', { plainObjects: true }), + { a: { b: 'c', toString: true } }, + 'can overwrite prototype with plainObjects true' + ); + + st.end(); + }); + + t.test('can return null objects', { skip: !Object.create }, function (st) { + var expected = Object.create(null); + expected.a = Object.create(null); + expected.a.b = 'c'; + expected.a.hasOwnProperty = 'd'; + st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected); + st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null)); + var expectedArray = Object.create(null); + expectedArray.a = Object.create(null); + expectedArray.a[0] = 'b'; + expectedArray.a.c = 'd'; + st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray); + st.end(); + }); + + t.test('can parse with custom encoding', function (st) { + st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', { + decoder: function (str) { + var reg = /%([0-9A-F]{2})/ig; + var result = []; + var parts = reg.exec(str); + while (parts) { + result.push(parseInt(parts[1], 16)); + parts = reg.exec(str); + } + return iconv.decode(SaferBuffer.from(result), 'shift_jis').toString(); + } + }), { 県: '大阪府' }); + st.end(); + }); + + t.test('receives the default decoder as a second argument', function (st) { + st.plan(1); + qs.parse('a', { + decoder: function (str, defaultDecoder) { + st.equal(defaultDecoder, utils.decode); + } + }); + st.end(); + }); + + t.test('throws error with wrong decoder', function (st) { + st['throws'](function () { + qs.parse({}, { decoder: 'string' }); + }, new TypeError('Decoder has to be a function.')); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.parse('a[b]=true', options); + st.deepEqual(options, {}); + st.end(); + }); + + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/qs/test/stringify.js b/packages/字体精简工具/node_modules/qs/test/stringify.js new file mode 100644 index 0000000..165ac62 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/test/stringify.js @@ -0,0 +1,597 @@ +'use strict'; + +var test = require('tape'); +var qs = require('../'); +var utils = require('../lib/utils'); +var iconv = require('iconv-lite'); +var SaferBuffer = require('safer-buffer').Buffer; + +test('stringify()', function (t) { + t.test('stringifies a querystring object', function (st) { + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: 1 }), 'a=1'); + st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2'); + st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z'); + st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC'); + st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80'); + st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90'); + st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7'); + st.end(); + }); + + t.test('adds query prefix', function (st) { + st.equal(qs.stringify({ a: 'b' }, { addQueryPrefix: true }), '?a=b'); + st.end(); + }); + + t.test('with query prefix, outputs blank string given an empty object', function (st) { + st.equal(qs.stringify({}, { addQueryPrefix: true }), ''); + st.end(); + }); + + t.test('stringifies a nested object', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies a nested object with dots notation', function (st) { + st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c'); + st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e'); + st.end(); + }); + + t.test('stringifies an array value', function (st) { + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }), + 'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: ['b', 'c', 'd'] }), + 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', + 'default => indices' + ); + st.end(); + }); + + t.test('omits nulls when asked', function (st) { + st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b'); + st.end(); + }); + + t.test('omits nested nulls when asked', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('omits array indices when asked', function (st) { + st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d'); + st.end(); + }); + + t.test('stringifies a nested array value', function (st) { + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d'); + st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + st.end(); + }); + + t.test('stringifies a nested array value with dots notation', function (st) { + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a.b[0]=c&a.b[1]=d', + 'indices: stringifies with dots + indices' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a.b[]=c&a.b[]=d', + 'brackets: stringifies with dots + brackets' + ); + st.equal( + qs.stringify( + { a: { b: ['c', 'd'] } }, + { allowDots: true, encode: false } + ), + 'a.b[0]=c&a.b[1]=d', + 'default: stringifies with dots + indices' + ); + st.end(); + }); + + t.test('stringifies an object inside an array', function (st) { + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D=c', + 'indices => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D=c', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 'c' }] }), + 'a%5B0%5D%5Bb%5D=c', + 'default => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'indices => indices' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }), + 'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1', + 'brackets => brackets' + ); + + st.equal( + qs.stringify({ a: [{ b: { c: [1] } }] }), + 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an array with mixed objects and primitives', function (st) { + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'indices => indices' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }), + 'a[][b]=1&a[]=2&a[]=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), + 'a[0][b]=1&a[1]=2&a[2]=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('stringifies an object inside an array with dots notation', function (st) { + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b=c', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b=c', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: 'c' }] }, + { allowDots: true, encode: false } + ), + 'a[0].b=c', + 'default => indices' + ); + + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'indices' } + ), + 'a[0].b.c[0]=1', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false, arrayFormat: 'brackets' } + ), + 'a[].b.c[]=1', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: [{ b: { c: [1] } }] }, + { allowDots: true, encode: false } + ), + 'a[0].b.c[0]=1', + 'default => indices' + ); + + st.end(); + }); + + t.test('does not omit object keys when indices = false', function (st) { + st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when indices=true', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c'); + st.end(); + }); + + t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c'); + st.end(); + }); + + t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) { + st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c'); + st.end(); + }); + + t.test('stringifies a complicated object', function (st) { + st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e'); + st.end(); + }); + + t.test('stringifies an empty value', function (st) { + st.equal(qs.stringify({ a: '' }), 'a='); + st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a'); + + st.equal(qs.stringify({ a: '', b: '' }), 'a=&b='); + st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b='); + + st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D='); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D'); + st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D='); + + st.end(); + }); + + t.test('stringifies a null object', { skip: !Object.create }, function (st) { + var obj = Object.create(null); + obj.a = 'b'; + st.equal(qs.stringify(obj), 'a=b'); + st.end(); + }); + + t.test('returns an empty string for invalid input', function (st) { + st.equal(qs.stringify(undefined), ''); + st.equal(qs.stringify(false), ''); + st.equal(qs.stringify(null), ''); + st.equal(qs.stringify(''), ''); + st.end(); + }); + + t.test('stringifies an object with a null object as a child', { skip: !Object.create }, function (st) { + var obj = { a: Object.create(null) }; + + obj.a.b = 'c'; + st.equal(qs.stringify(obj), 'a%5Bb%5D=c'); + st.end(); + }); + + t.test('drops keys with a value of undefined', function (st) { + st.equal(qs.stringify({ a: undefined }), ''); + + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D'); + st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D='); + st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D='); + st.end(); + }); + + t.test('url encodes values', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('stringifies a date', function (st) { + var now = new Date(); + var str = 'a=' + encodeURIComponent(now.toISOString()); + st.equal(qs.stringify({ a: now }), str); + st.end(); + }); + + t.test('stringifies the weird object from qs', function (st) { + st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); + st.end(); + }); + + t.test('skips properties that are part of the object prototype', function (st) { + Object.prototype.crash = 'test'; + st.equal(qs.stringify({ a: 'b' }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); + delete Object.prototype.crash; + st.end(); + }); + + t.test('stringifies boolean values', function (st) { + st.equal(qs.stringify({ a: true }), 'a=true'); + st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true'); + st.equal(qs.stringify({ b: false }), 'b=false'); + st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false'); + st.end(); + }); + + t.test('stringifies buffer values', function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from('test') }), 'a=test'); + st.equal(qs.stringify({ a: { b: SaferBuffer.from('test') } }), 'a%5Bb%5D=test'); + st.end(); + }); + + t.test('stringifies an object using an alternative delimiter', function (st) { + st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); + st.end(); + }); + + t.test('doesn\'t blow up when Buffer global is missing', function (st) { + var tempBuffer = global.Buffer; + delete global.Buffer; + var result = qs.stringify({ a: 'b', c: 'd' }); + global.Buffer = tempBuffer; + st.equal(result, 'a=b&c=d'); + st.end(); + }); + + t.test('selects properties when filter=array', function (st) { + st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b'); + st.equal(qs.stringify({ a: 1 }, { filter: [] }), ''); + + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'indices' } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'indices => indices' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' } + ), + 'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3', + 'brackets => brackets' + ); + st.equal( + qs.stringify( + { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, + { filter: ['a', 'b', 0, 2] } + ), + 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', + 'default => indices' + ); + + st.end(); + }); + + t.test('supports custom representations when filter=function', function (st) { + var calls = 0; + var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; + var filterFunc = function (prefix, value) { + calls += 1; + if (calls === 1) { + st.equal(prefix, '', 'prefix is empty'); + st.equal(value, obj); + } else if (prefix === 'c') { + return void 0; + } else if (value instanceof Date) { + st.equal(prefix, 'e[f]'); + return value.getTime(); + } + return value; + }; + + st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000'); + st.equal(calls, 5); + st.end(); + }); + + t.test('can disable uri encoding', function (st) { + st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b'); + st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c'); + st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c'); + st.end(); + }); + + t.test('can sort the keys', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y'); + st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a'); + st.end(); + }); + + t.test('can sort the keys at depth 3 or more too', function (st) { + var sort = function (a, b) { + return a.localeCompare(b); + }; + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: sort, encode: false } + ), + 'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb' + ); + st.equal( + qs.stringify( + { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, + { sort: null, encode: false } + ), + 'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b' + ); + st.end(); + }); + + t.test('can stringify with custom encoding', function (st) { + st.equal(qs.stringify({ 県: '大阪府', '': '' }, { + encoder: function (str) { + if (str.length === 0) { + return ''; + } + var buf = iconv.encode(str, 'shiftjis'); + var result = []; + for (var i = 0; i < buf.length; ++i) { + result.push(buf.readUInt8(i).toString(16)); + } + return '%' + result.join('%'); + } + }), '%8c%a7=%91%e5%8d%e3%95%7b&='); + st.end(); + }); + + t.test('receives the default encoder as a second argument', function (st) { + st.plan(2); + qs.stringify({ a: 1 }, { + encoder: function (str, defaultEncoder) { + st.equal(defaultEncoder, utils.encode); + } + }); + st.end(); + }); + + t.test('throws error with wrong encoder', function (st) { + st['throws'](function () { + qs.stringify({}, { encoder: 'string' }); + }, new TypeError('Encoder has to be a function.')); + st.end(); + }); + + t.test('can use custom encoder for a buffer object', { skip: typeof Buffer === 'undefined' }, function (st) { + st.equal(qs.stringify({ a: SaferBuffer.from([1]) }, { + encoder: function (buffer) { + if (typeof buffer === 'string') { + return buffer; + } + return String.fromCharCode(buffer.readUInt8(0) + 97); + } + }), 'a=b'); + st.end(); + }); + + t.test('serializeDate option', function (st) { + var date = new Date(); + st.equal( + qs.stringify({ a: date }), + 'a=' + date.toISOString().replace(/:/g, '%3A'), + 'default is toISOString' + ); + + var mutatedDate = new Date(); + mutatedDate.toISOString = function () { + throw new SyntaxError(); + }; + st['throws'](function () { + mutatedDate.toISOString(); + }, SyntaxError); + st.equal( + qs.stringify({ a: mutatedDate }), + 'a=' + Date.prototype.toISOString.call(mutatedDate).replace(/:/g, '%3A'), + 'toISOString works even when method is not locally present' + ); + + var specificDate = new Date(6); + st.equal( + qs.stringify( + { a: specificDate }, + { serializeDate: function (d) { return d.getTime() * 7; } } + ), + 'a=42', + 'custom serializeDate function called' + ); + + st.end(); + }); + + t.test('RFC 1738 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC1738 }), 'a=b+c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC1738 }), 'a+b=c+d'); + st.end(); + }); + + t.test('RFC 3986 spaces serialization', function (st) { + st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC3986 }), 'a=b%20c'); + st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC3986 }), 'a%20b=c%20d'); + st.end(); + }); + + t.test('Backward compatibility to RFC 3986', function (st) { + st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); + st.end(); + }); + + t.test('Edge cases and unknown formats', function (st) { + ['UFO1234', false, 1234, null, {}, []].forEach( + function (format) { + st['throws']( + function () { + qs.stringify({ a: 'b c' }, { format: format }); + }, + new TypeError('Unknown format option provided.') + ); + } + ); + st.end(); + }); + + t.test('encodeValuesOnly', function (st) { + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e=f'], f: [['g'], ['h']] }, + { encodeValuesOnly: true } + ), + 'a=b&c[0]=d&c[1]=e%3Df&f[0][0]=g&f[1][0]=h' + ); + st.equal( + qs.stringify( + { a: 'b', c: ['d', 'e'], f: [['g'], ['h']] } + ), + 'a=b&c%5B0%5D=d&c%5B1%5D=e&f%5B0%5D%5B0%5D=g&f%5B1%5D%5B0%5D=h' + ); + st.end(); + }); + + t.test('encodeValuesOnly - strictNullHandling', function (st) { + st.equal( + qs.stringify( + { a: { b: null } }, + { encodeValuesOnly: true, strictNullHandling: true } + ), + 'a[b]' + ); + st.end(); + }); + + t.test('does not mutate the options argument', function (st) { + var options = {}; + qs.stringify({}, options); + st.deepEqual(options, {}); + st.end(); + }); + + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/qs/test/utils.js b/packages/字体精简工具/node_modules/qs/test/utils.js new file mode 100644 index 0000000..eff4011 --- /dev/null +++ b/packages/字体精简工具/node_modules/qs/test/utils.js @@ -0,0 +1,34 @@ +'use strict'; + +var test = require('tape'); +var utils = require('../lib/utils'); + +test('merge()', function (t) { + t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key'); + + var oneMerged = utils.merge({ foo: 'bar' }, { foo: { first: '123' } }); + t.deepEqual(oneMerged, { foo: ['bar', { first: '123' }] }, 'merges a standalone and an object into an array'); + + var twoMerged = utils.merge({ foo: ['bar', { first: '123' }] }, { foo: { second: '456' } }); + t.deepEqual(twoMerged, { foo: { 0: 'bar', 1: { first: '123' }, second: '456' } }, 'merges a standalone and two objects into an array'); + + var sandwiched = utils.merge({ foo: ['bar', { first: '123', second: '456' }] }, { foo: 'baz' }); + t.deepEqual(sandwiched, { foo: ['bar', { first: '123', second: '456' }, 'baz'] }, 'merges an object sandwiched by two standalones into an array'); + + var nestedArrays = utils.merge({ foo: ['baz'] }, { foo: ['bar', 'xyzzy'] }); + t.deepEqual(nestedArrays, { foo: ['baz', 'bar', 'xyzzy'] }); + + t.end(); +}); + +test('assign()', function (t) { + var target = { a: 1, b: 2 }; + var source = { b: 3, c: 4 }; + var result = utils.assign(target, source); + + t.equal(result, target, 'returns the target'); + t.deepEqual(target, { a: 1, b: 3, c: 4 }, 'target and source are merged'); + t.deepEqual(source, { b: 3, c: 4 }, 'source is untouched'); + + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/read-pkg-up/index.js b/packages/字体精简工具/node_modules/read-pkg-up/index.js new file mode 100644 index 0000000..beb3d48 --- /dev/null +++ b/packages/字体精简工具/node_modules/read-pkg-up/index.js @@ -0,0 +1,31 @@ +'use strict'; +var findUp = require('find-up'); +var readPkg = require('read-pkg'); + +module.exports = function (opts) { + return findUp('package.json', opts).then(function (fp) { + if (!fp) { + return {}; + } + + return readPkg(fp, opts).then(function (pkg) { + return { + pkg: pkg, + path: fp + }; + }); + }); +}; + +module.exports.sync = function (opts) { + var fp = findUp.sync('package.json', opts); + + if (!fp) { + return {}; + } + + return { + pkg: readPkg.sync(fp, opts), + path: fp + }; +}; diff --git a/packages/字体精简工具/node_modules/read-pkg-up/license b/packages/字体精简工具/node_modules/read-pkg-up/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/read-pkg-up/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/read-pkg-up/package.json b/packages/字体精简工具/node_modules/read-pkg-up/package.json new file mode 100644 index 0000000..e732225 --- /dev/null +++ b/packages/字体精简工具/node_modules/read-pkg-up/package.json @@ -0,0 +1,92 @@ +{ + "_from": "read-pkg-up@^1.0.1", + "_id": "read-pkg-up@1.0.1", + "_inBundle": false, + "_integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "_location": "/read-pkg-up", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "read-pkg-up@^1.0.1", + "name": "read-pkg-up", + "escapedName": "read-pkg-up", + "rawSpec": "^1.0.1", + "saveSpec": null, + "fetchSpec": "^1.0.1" + }, + "_requiredBy": [ + "/gulp/yargs", + "/meow" + ], + "_resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", + "_shasum": "9d63c13276c065918d57f002a57f40a1b643fb02", + "_spec": "read-pkg-up@^1.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\meow", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/read-pkg-up/issues" + }, + "bundleDependencies": false, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "deprecated": false, + "description": "Read the closest package.json file", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/read-pkg-up#readme", + "keywords": [ + "json", + "read", + "parse", + "file", + "fs", + "graceful", + "load", + "pkg", + "package", + "find", + "up", + "find-up", + "findup", + "look-up", + "look", + "file", + "search", + "match", + "package", + "resolve", + "parent", + "parents", + "folder", + "directory", + "dir", + "walk", + "walking", + "path" + ], + "license": "MIT", + "name": "read-pkg-up", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/read-pkg-up.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.0.1" +} diff --git a/packages/字体精简工具/node_modules/read-pkg-up/readme.md b/packages/字体精简工具/node_modules/read-pkg-up/readme.md new file mode 100644 index 0000000..dbd88f3 --- /dev/null +++ b/packages/字体精简工具/node_modules/read-pkg-up/readme.md @@ -0,0 +1,79 @@ +# read-pkg-up [![Build Status](https://travis-ci.org/sindresorhus/read-pkg-up.svg?branch=master)](https://travis-ci.org/sindresorhus/read-pkg-up) + +> Read the closest package.json file + + +## Why + +- [Finds the closest package.json](https://github.com/sindresorhus/find-up) +- [Gracefully handles filesystem issues](https://github.com/isaacs/node-graceful-fs) +- [Strips UTF-8 BOM](https://github.com/sindresorhus/strip-bom) +- [Throws more helpful JSON errors](https://github.com/sindresorhus/parse-json) +- [Normalizes the data](https://github.com/npm/normalize-package-data#what-normalization-currently-entails) + + +## Install + +``` +$ npm install --save read-pkg-up +``` + + +## Usage + +```js +var readPkgUp = require('read-pkg-up'); + +readPkgUp().then(function (result) { + console.log(result); + /* + { + pkg: { + name: 'awesome-package', + version: '1.0.0', + ... + }, + path: '/Users/sindresorhus/dev/awesome-package' + } + */ +}); +``` + + +## API + +### readPkgUp([options]) + +Returns a promise that resolves to a result object. + +### readPkgUp.sync([options]) + +Returns a result object. + +#### options + +##### cwd + +Type: `string` +Default: `.` + +Directory to start looking for a package.json file. + +##### normalize + +Type: `boolean` +Default: `true` + +[Normalize](https://github.com/npm/normalize-package-data#what-normalization-currently-entails) the package data. + + +## Related + +- [read-pkg](https://github.com/sindresorhus/read-pkg) - Read a package.json file +- [find-up](https://github.com/sindresorhus/find-up) - Find a file by walking up parent directories +- [pkg-conf](https://github.com/sindresorhus/pkg-conf) - Get namespaced config from the closest package.json + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/read-pkg/index.js b/packages/字体精简工具/node_modules/read-pkg/index.js new file mode 100644 index 0000000..c5c3afa --- /dev/null +++ b/packages/字体精简工具/node_modules/read-pkg/index.js @@ -0,0 +1,48 @@ +'use strict'; +var path = require('path'); +var loadJsonFile = require('load-json-file'); +var normalizePackageData = require('normalize-package-data'); +var pathType = require('path-type'); + +module.exports = function (fp, opts) { + if (typeof fp !== 'string') { + opts = fp; + fp = '.'; + } + + opts = opts || {}; + + return pathType.dir(fp) + .then(function (isDir) { + if (isDir) { + fp = path.join(fp, 'package.json'); + } + + return loadJsonFile(fp); + }) + .then(function (x) { + if (opts.normalize !== false) { + normalizePackageData(x); + } + + return x; + }); +}; + +module.exports.sync = function (fp, opts) { + if (typeof fp !== 'string') { + opts = fp; + fp = '.'; + } + + opts = opts || {}; + fp = pathType.dirSync(fp) ? path.join(fp, 'package.json') : fp; + + var x = loadJsonFile.sync(fp); + + if (opts.normalize !== false) { + normalizePackageData(x); + } + + return x; +}; diff --git a/packages/字体精简工具/node_modules/read-pkg/license b/packages/字体精简工具/node_modules/read-pkg/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/read-pkg/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/read-pkg/package.json b/packages/字体精简工具/node_modules/read-pkg/package.json new file mode 100644 index 0000000..2ae1e3c --- /dev/null +++ b/packages/字体精简工具/node_modules/read-pkg/package.json @@ -0,0 +1,74 @@ +{ + "_from": "read-pkg@^1.0.0", + "_id": "read-pkg@1.1.0", + "_inBundle": false, + "_integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "_location": "/read-pkg", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "read-pkg@^1.0.0", + "name": "read-pkg", + "escapedName": "read-pkg", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/read-pkg-up" + ], + "_resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", + "_shasum": "f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28", + "_spec": "read-pkg@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\read-pkg-up", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/read-pkg/issues" + }, + "bundleDependencies": false, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "deprecated": false, + "description": "Read a package.json file", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/read-pkg#readme", + "keywords": [ + "json", + "read", + "parse", + "file", + "fs", + "graceful", + "load", + "pkg", + "package", + "normalize" + ], + "license": "MIT", + "name": "read-pkg", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/read-pkg.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.1.0" +} diff --git a/packages/字体精简工具/node_modules/read-pkg/readme.md b/packages/字体精简工具/node_modules/read-pkg/readme.md new file mode 100644 index 0000000..9a0d4cc --- /dev/null +++ b/packages/字体精简工具/node_modules/read-pkg/readme.md @@ -0,0 +1,79 @@ +# read-pkg [![Build Status](https://travis-ci.org/sindresorhus/read-pkg.svg?branch=master)](https://travis-ci.org/sindresorhus/read-pkg) + +> Read a package.json file + + +## Why + +- [Gracefully handles filesystem issues](https://github.com/isaacs/node-graceful-fs) +- [Strips UTF-8 BOM](https://github.com/sindresorhus/strip-bom) +- [Throws more helpful JSON errors](https://github.com/sindresorhus/parse-json) +- [Normalizes the data](https://github.com/npm/normalize-package-data#what-normalization-currently-entails) + + +## Install + +``` +$ npm install --save read-pkg +``` + + +## Usage + +```js +var readPkg = require('read-pkg'); + +readPkg().then(function (pkg) { + console.log(pkg); + //=> {name: 'read-pkg', ...} +}); + +readPkg(__dirname).then(function (pkg) { + console.log(pkg); + //=> {name: 'read-pkg', ...} +}); + +readPkg(path.join('unicorn', 'package.json')).then(function (pkg) { + console.log(pkg); + //=> {name: 'read-pkg', ...} +}); +``` + + +## API + +### readPkg([path], [options]) + +Returns a promise that resolves to the parsed JSON. + +### readPkg.sync([path], [options]) + +Returns the parsed JSON. + +#### path + +Type: `string` +Default: `.` + +Path to a `package.json` file or its directory. + +#### options + +##### normalize + +Type: `boolean` +Default: `true` + +[Normalize](https://github.com/npm/normalize-package-data#what-normalization-currently-entails) the package data. + + +## Related + +- [read-pkg-up](https://github.com/sindresorhus/read-pkg-up) - Read the closest package.json file +- [write-pkg](https://github.com/sindresorhus/write-pkg) - Write a `package.json` file +- [load-json-file](https://github.com/sindresorhus/load-json-file) - Read and parse a JSON file + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/readable-stream/.travis.yml b/packages/字体精简工具/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000..f62cdac --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/.travis.yml @@ -0,0 +1,34 @@ +sudo: false +language: node_js +before_install: + - (test $NPM_LEGACY && npm install -g npm@2 && npm install -g npm@3) || true +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: NPM_LEGACY=true + - node_js: '0.10' + env: NPM_LEGACY=true + - node_js: '0.11' + env: NPM_LEGACY=true + - node_js: '0.12' + env: NPM_LEGACY=true + - node_js: 1 + env: NPM_LEGACY=true + - node_js: 2 + env: NPM_LEGACY=true + - node_js: 3 + env: NPM_LEGACY=true + - node_js: 4 + - node_js: 5 + - node_js: 6 + - node_js: 7 + - node_js: 8 + - node_js: 9 +script: "npm run test" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/packages/字体精简工具/node_modules/readable-stream/CONTRIBUTING.md b/packages/字体精简工具/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000..f478d58 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/packages/字体精简工具/node_modules/readable-stream/GOVERNANCE.md b/packages/字体精简工具/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000..16ffb93 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/packages/字体精简工具/node_modules/readable-stream/LICENSE b/packages/字体精简工具/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000..2873b3b --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" diff --git a/packages/字体精简工具/node_modules/readable-stream/README.md b/packages/字体精简工具/node_modules/readable-stream/README.md new file mode 100644 index 0000000..23fe3f3 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/packages/字体精简工具/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/packages/字体精简工具/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000..83275f1 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/packages/字体精简工具/node_modules/readable-stream/duplex-browser.js b/packages/字体精简工具/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000..f8b2db8 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/packages/字体精简工具/node_modules/readable-stream/duplex.js b/packages/字体精简工具/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000..46924cb --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/_stream_duplex.js b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000..57003c3 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/_stream_passthrough.js b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000..612edb4 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/_stream_readable.js b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000..0f80764 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/_stream_transform.js b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000..fcfc105 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/_stream_writable.js b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000..b0b0220 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/BufferList.js b/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000..aefc68b --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/destroy.js b/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000..5a0a0d8 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000..9332a3f --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/stream.js b/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000..ce2ad5b --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/packages/字体精简工具/node_modules/readable-stream/package.json b/packages/字体精简工具/node_modules/readable-stream/package.json new file mode 100644 index 0000000..9359b72 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/package.json @@ -0,0 +1,97 @@ +{ + "_from": "readable-stream@^2.0.2", + "_id": "readable-stream@2.3.7", + "_inBundle": false, + "_integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "_location": "/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@^2.0.2", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "^2.0.2", + "saveSpec": null, + "fetchSpec": "^2.0.2" + }, + "_requiredBy": [ + "/are-we-there-yet", + "/buffer-to-vinyl", + "/bufferstreams", + "/cloneable-readable", + "/concat-stream", + "/duplexify", + "/flush-write-stream", + "/fs-mkdirp-stream/through2", + "/glob-stream", + "/gulp-clean/through2", + "/jszip", + "/lazystream", + "/ordered-read-streams", + "/readdirp", + "/remove-bom-stream/through2", + "/to-through/through2", + "/vinyl-fs" + ], + "_resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", + "_shasum": "1eca1cf711aef814c04f62252a36a62f6cb23b57", + "_spec": "readable-stream@^2.0.2", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\buffer-to-vinyl", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.7" +} diff --git a/packages/字体精简工具/node_modules/readable-stream/passthrough.js b/packages/字体精简工具/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000..ffd791d --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/packages/字体精简工具/node_modules/readable-stream/readable-browser.js b/packages/字体精简工具/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000..e503725 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/packages/字体精简工具/node_modules/readable-stream/readable.js b/packages/字体精简工具/node_modules/readable-stream/readable.js new file mode 100644 index 0000000..ec89ec5 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/packages/字体精简工具/node_modules/readable-stream/transform.js b/packages/字体精简工具/node_modules/readable-stream/transform.js new file mode 100644 index 0000000..b1baba2 --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/packages/字体精简工具/node_modules/readable-stream/writable-browser.js b/packages/字体精简工具/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000..ebdde6a --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/packages/字体精简工具/node_modules/readable-stream/writable.js b/packages/字体精简工具/node_modules/readable-stream/writable.js new file mode 100644 index 0000000..3211a6f --- /dev/null +++ b/packages/字体精简工具/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/packages/字体精简工具/node_modules/redent/index.js b/packages/字体精简工具/node_modules/redent/index.js new file mode 100644 index 0000000..2b92020 --- /dev/null +++ b/packages/字体精简工具/node_modules/redent/index.js @@ -0,0 +1,7 @@ +'use strict'; +var stripIndent = require('strip-indent'); +var indentString = require('indent-string'); + +module.exports = function (str, count, indent) { + return indentString(stripIndent(str), indent || ' ', count || 0); +}; diff --git a/packages/字体精简工具/node_modules/redent/license b/packages/字体精简工具/node_modules/redent/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/redent/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/redent/package.json b/packages/字体精简工具/node_modules/redent/package.json new file mode 100644 index 0000000..08f35cc --- /dev/null +++ b/packages/字体精简工具/node_modules/redent/package.json @@ -0,0 +1,75 @@ +{ + "_from": "redent@^1.0.0", + "_id": "redent@1.0.0", + "_inBundle": false, + "_integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "_location": "/redent", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "redent@^1.0.0", + "name": "redent", + "escapedName": "redent", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/meow" + ], + "_resolved": "https://registry.nlark.com/redent/download/redent-1.0.0.tgz?cache=0&sync_timestamp=1620069702182&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fredent%2Fdownload%2Fredent-1.0.0.tgz", + "_shasum": "cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde", + "_spec": "redent@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\meow", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/redent/issues" + }, + "bundleDependencies": false, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "deprecated": false, + "description": "Strip redundant indentation and indent the string", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/redent#readme", + "keywords": [ + "string", + "str", + "strip", + "trim", + "indent", + "indentation", + "add", + "reindent", + "normalize", + "remove", + "whitespace", + "space" + ], + "license": "MIT", + "name": "redent", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/redent.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.0.0" +} diff --git a/packages/字体精简工具/node_modules/redent/readme.md b/packages/字体精简工具/node_modules/redent/readme.md new file mode 100644 index 0000000..8e7a807 --- /dev/null +++ b/packages/字体精简工具/node_modules/redent/readme.md @@ -0,0 +1,48 @@ +# redent [![Build Status](https://travis-ci.org/sindresorhus/redent.svg?branch=master)](https://travis-ci.org/sindresorhus/redent) + +> [Strip redundant indentation](https://github.com/sindresorhus/strip-indent) and [indent the string](https://github.com/sindresorhus/indent-string) + + +## Install + +``` +$ npm install --save redent +``` + + +## Usage + +```js +const redent = require('redent'); + +redent('\n foo\n bar\n', 1); +//=> '\n foo\n bar\n' +``` + + +## API + +### redent(input, [count], [indent]) + +#### input + +Type: `string` + +#### count + +Type: `number` +Default: `0` + +How many times you want `indent` repeated. + +#### indent + +Type: `string` +Default: `' '` + +The string to use for the indent. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/remove-bom-buffer/LICENSE b/packages/字体精简工具/node_modules/remove-bom-buffer/LICENSE new file mode 100644 index 0000000..c0d7f13 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/remove-bom-buffer/README.md b/packages/字体精简工具/node_modules/remove-bom-buffer/README.md new file mode 100644 index 0000000..8ed18a4 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-buffer/README.md @@ -0,0 +1,65 @@ +# remove-bom-buffer [![NPM version](https://img.shields.io/npm/v/remove-bom-buffer.svg?style=flat)](https://www.npmjs.com/package/remove-bom-buffer) [![NPM monthly downloads](https://img.shields.io/npm/dm/remove-bom-buffer.svg?style=flat)](https://npmjs.org/package/remove-bom-buffer) [![NPM total downloads](https://img.shields.io/npm/dt/remove-bom-buffer.svg?style=flat)](https://npmjs.org/package/remove-bom-buffer) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/remove-bom-buffer.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/remove-bom-buffer) + +> Remove a byte order mark (BOM) from a buffer. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save remove-bom-buffer +``` + +## Usage + +```js +var remove = require('remove-bom-buffer'); +remove(new Buffer('\ufefffoo')); +``` + +## About + +### Related projects + +* [cr](https://www.npmjs.com/package/cr): Strip windows carriage returns, or convert carriage returns to newlines. | [homepage](https://github.com/jonschlinkert/cr "Strip windows carriage returns, or convert carriage returns to newlines.") +* [has-bom](https://www.npmjs.com/package/has-bom): Returns true if a buffer or string has a byte order mark (BOM) | [homepage](https://github.com/jonschlinkert/has-bom "Returns true if a buffer or string has a byte order mark (BOM)") +* [read-file](https://www.npmjs.com/package/read-file): Thin wrapper around fs.readFile and fs.readFileSync that also strips byte order marks when `utf8` encoding… [more](https://github.com/jonschlinkert/read-file) | [homepage](https://github.com/jonschlinkert/read-file "Thin wrapper around fs.readFile and fs.readFileSync that also strips byte order marks when `utf8` encoding is chosen. Also optionally replaces windows newlines with unix newlines.") +* [strip-bom-string](https://www.npmjs.com/package/strip-bom-string): Strip a byte order mark (BOM) from a string. | [homepage](https://github.com/jonschlinkert/strip-bom-string "Strip a byte order mark (BOM) from a string.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +### Running tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 16, 2017._ \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/remove-bom-buffer/index.js b/packages/字体精简工具/node_modules/remove-bom-buffer/index.js new file mode 100644 index 0000000..7a299ca --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-buffer/index.js @@ -0,0 +1,27 @@ +/*! + * remove-bom-buffer + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +var isUTF8 = require('is-utf8'); +var isBuffer = require('is-buffer'); + +function matchBOM(buf) { + return buf[0] === 0xEF && buf[1] === 0xBB && buf[2] === 0xBF; +} + +function maybeUTF8(buf) { + // Only "maybe" because we aren't sniffing the whole buffer + return isUTF8(buf.slice(3, 7)); +} + +module.exports = function(buf) { + if (isBuffer(buf) && matchBOM(buf) && maybeUTF8(buf)) { + return buf.slice(3); + } + return buf; +}; diff --git a/packages/字体精简工具/node_modules/remove-bom-buffer/package.json b/packages/字体精简工具/node_modules/remove-bom-buffer/package.json new file mode 100644 index 0000000..b98ae7a --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-buffer/package.json @@ -0,0 +1,109 @@ +{ + "_from": "remove-bom-buffer@^3.0.0", + "_id": "remove-bom-buffer@3.0.0", + "_inBundle": false, + "_integrity": "sha1-wr8eN3Ug0yT2I4kuM8EMrCwlK1M=", + "_location": "/remove-bom-buffer", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "remove-bom-buffer@^3.0.0", + "name": "remove-bom-buffer", + "escapedName": "remove-bom-buffer", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/remove-bom-stream", + "/vinyl-fs", + "/vinyl-sourcemap" + ], + "_resolved": "https://registry.nlark.com/remove-bom-buffer/download/remove-bom-buffer-3.0.0.tgz", + "_shasum": "c2bf1e377520d324f623892e33c10cac2c252b53", + "_spec": "remove-bom-buffer@^3.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/remove-bom-buffer/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Blaine Bublitz", + "url": "https://twitter.com/BlaineBublitz" + }, + { + "name": "Erik Kemperman", + "url": "https://github.com/erikkemperman" + }, + { + "name": "Jon Schlinkert", + "url": "http://twitter.com/jonschlinkert" + } + ], + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "deprecated": false, + "description": "Remove a byte order mark (BOM) from a buffer.", + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/remove-bom-buffer", + "keywords": [ + "bom", + "buffer", + "byte-order-mark", + "normalize", + "remove", + "strip", + "strip-bom", + "strip-bom-buffer", + "strip-bom-string" + ], + "license": "MIT", + "main": "index.js", + "name": "remove-bom-buffer", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/remove-bom-buffer.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "cr", + "has-bom", + "read-file", + "strip-bom-string" + ] + }, + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + }, + "version": "3.0.0" +} diff --git a/packages/字体精简工具/node_modules/remove-bom-stream/LICENSE b/packages/字体精简工具/node_modules/remove-bom-stream/LICENSE new file mode 100644 index 0000000..b8fc743 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-stream/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/remove-bom-stream/README.md b/packages/字体精简工具/node_modules/remove-bom-stream/README.md new file mode 100644 index 0000000..c4a0589 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-stream/README.md @@ -0,0 +1,51 @@ +

+ + + +

+ +# remove-bom-stream + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Remove a UTF8 BOM at the start of the stream. + +## Usage + +```js +var fs = require('fs'); +var concat = require('concat-stream'); +var removeBOM = require('remove-bom-stream'); + +fs.createReadStream('utf8-file-with-bom.txt') + .pipe(removeBOM()) + .pipe(concat(function(result) { + // result won't have a BOM + })); +``` + +## API + +### `removeBOM()` + +Returns a `through2` stream that will remove a BOM, given the data is a UTF8 Buffer with a BOM at the beginning. If the data is not UTF8 or does not have a BOM, the data is not changed and this becomes a normal passthrough stream. + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/remove-bom-stream.svg +[npm-url]: https://npmjs.com/package/remove-bom-stream +[npm-image]: http://img.shields.io/npm/v/remove-bom-stream.svg + +[travis-url]: https://travis-ci.org/gulpjs/remove-bom-stream +[travis-image]: http://img.shields.io/travis/gulpjs/remove-bom-stream.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/remove-bom-stream +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/remove-bom-stream.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/remove-bom-stream +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/remove-bom-stream/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/packages/字体精简工具/node_modules/remove-bom-stream/index.js b/packages/字体精简工具/node_modules/remove-bom-stream/index.js new file mode 100644 index 0000000..93501f1 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-stream/index.js @@ -0,0 +1,51 @@ +'use strict'; + +var through = require('through2'); +var removeBom = require('remove-bom-buffer'); +var SafeBuffer = require('safe-buffer').Buffer; + +function removeBomStream() { + var completed = false; + var buffer = SafeBuffer.alloc(0); + + return through(onChunk, onFlush); + + function removeAndCleanup(data) { + completed = true; + + buffer = null; + + return removeBom(data); + } + + function onChunk(data, enc, cb) { + if (completed) { + return cb(null, data); + } + + if (data.length >= 7) { + return cb(null, removeAndCleanup(data)); + } + + var bufferLength = buffer.length; + var chunkLength = data.length; + var totalLength = bufferLength + chunkLength; + + buffer = SafeBuffer.concat([buffer, data], totalLength); + + if (totalLength >= 7) { + return cb(null, removeAndCleanup(buffer)); + } + cb(); + } + + function onFlush(cb) { + if (completed || !buffer) { + return cb(); + } + + cb(null, removeAndCleanup(buffer)); + } +} + +module.exports = removeBomStream; diff --git a/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/LICENSE.md b/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/LICENSE.md new file mode 100644 index 0000000..a2429b6 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/README.md b/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/README.md new file mode 100644 index 0000000..b5e44c7 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/README.md @@ -0,0 +1,134 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) Rod Vagg [@rvagg](https://twitter.com/rvagg) and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/package.json b/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/package.json new file mode 100644 index 0000000..eb3e484 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/package.json @@ -0,0 +1,66 @@ +{ + "_from": "through2@^2.0.3", + "_id": "through2@2.0.5", + "_inBundle": false, + "_integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "_location": "/remove-bom-stream/through2", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "through2@^2.0.3", + "name": "through2", + "escapedName": "through2", + "rawSpec": "^2.0.3", + "saveSpec": null, + "fetchSpec": "^2.0.3" + }, + "_requiredBy": [ + "/remove-bom-stream" + ], + "_resolved": "https://registry.nlark.com/through2/download/through2-2.0.5.tgz", + "_shasum": "01c1e39eb31d07cb7d03a96a70823260b23132cd", + "_spec": "through2@^2.0.3", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\remove-bom-stream", + "author": { + "name": "Rod Vagg", + "email": "r@va.gg", + "url": "https://github.com/rvagg" + }, + "bugs": { + "url": "https://github.com/rvagg/through2/issues" + }, + "bundleDependencies": false, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "deprecated": false, + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "devDependencies": { + "bl": "~2.0.1", + "faucet": "0.0.1", + "nyc": "~13.1.0", + "safe-buffer": "~5.1.2", + "stream-spigot": "~3.0.6", + "tape": "~4.9.1" + }, + "homepage": "https://github.com/rvagg/through2#readme", + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "license": "MIT", + "main": "through2.js", + "name": "through2", + "repository": { + "type": "git", + "url": "git+https://github.com/rvagg/through2.git" + }, + "scripts": { + "test": "node test/test.js | faucet" + }, + "version": "2.0.5" +} diff --git a/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/through2.js b/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/through2.js new file mode 100644 index 0000000..6baa6a1 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-stream/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream').Transform + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/packages/字体精简工具/node_modules/remove-bom-stream/package.json b/packages/字体精简工具/node_modules/remove-bom-stream/package.json new file mode 100644 index 0000000..031e379 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-bom-stream/package.json @@ -0,0 +1,93 @@ +{ + "_from": "remove-bom-stream@^1.2.0", + "_id": "remove-bom-stream@1.2.0", + "_inBundle": false, + "_integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "_location": "/remove-bom-stream", + "_phantomChildren": { + "readable-stream": "2.3.7", + "xtend": "4.0.2" + }, + "_requested": { + "type": "range", + "registry": true, + "raw": "remove-bom-stream@^1.2.0", + "name": "remove-bom-stream", + "escapedName": "remove-bom-stream", + "rawSpec": "^1.2.0", + "saveSpec": null, + "fetchSpec": "^1.2.0" + }, + "_requiredBy": [ + "/vinyl-fs" + ], + "_resolved": "https://registry.npm.taobao.org/remove-bom-stream/download/remove-bom-stream-1.2.0.tgz", + "_shasum": "05f1a593f16e42e1fb90ebf59de8e569525f9523", + "_spec": "remove-bom-stream@^1.2.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/remove-bom-stream/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "deprecated": false, + "description": "Remove a UTF8 BOM at the start of the stream.", + "devDependencies": { + "buffer-equal": "^1.0.0", + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.3.0", + "mocha": "^3.2.0", + "stream-chunker": "^1.2.8" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/gulpjs/remove-bom-stream#readme", + "keywords": [ + "bom", + "remove", + "utf8", + "streaming", + "stream" + ], + "license": "MIT", + "main": "index.js", + "name": "remove-bom-stream", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/remove-bom-stream.git" + }, + "scripts": { + "cover": "istanbul cover _mocha", + "coveralls": "npm run cover && istanbul-coveralls", + "lint": "eslint index.js test/ && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only" + }, + "version": "1.2.0" +} diff --git a/packages/字体精简工具/node_modules/remove-trailing-separator/history.md b/packages/字体精简工具/node_modules/remove-trailing-separator/history.md new file mode 100644 index 0000000..e15e8a4 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-trailing-separator/history.md @@ -0,0 +1,17 @@ +## History + +### 1.1.0 - 16th Aug 2017 + +- [f4576e3](https://github.com/darsain/remove-trailing-separator/commit/f4576e3638c39b794998b533fffb27854dcbee01) Implement faster slash slicing + +### 1.0.2 - 07th Jun 2017 + +- [8e13ecb](https://github.com/darsain/remove-trailing-separator/commit/8e13ecbfd7b9f5fdf97c5d5ff923e4718b874e31) ES5 compatibility + +### 1.0.1 - 25th Sep 2016 + +- [b78606d](https://github.com/darsain/remove-trailing-separator/commit/af90b4e153a4527894741af6c7005acaeb78606d) Remove backslash only on win32 systems + +### 1.0.0 - 24th Sep 2016 + +Initial release. diff --git a/packages/字体精简工具/node_modules/remove-trailing-separator/index.js b/packages/字体精简工具/node_modules/remove-trailing-separator/index.js new file mode 100644 index 0000000..512306b --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-trailing-separator/index.js @@ -0,0 +1,17 @@ +var isWin = process.platform === 'win32'; + +module.exports = function (str) { + var i = str.length - 1; + if (i < 2) { + return str; + } + while (isSeparator(str, i)) { + i--; + } + return str.substr(0, i + 1); +}; + +function isSeparator(str, i) { + var char = str[i]; + return i > 0 && (char === '/' || (isWin && char === '\\')); +} diff --git a/packages/字体精简工具/node_modules/remove-trailing-separator/license b/packages/字体精简工具/node_modules/remove-trailing-separator/license new file mode 100644 index 0000000..a169aff --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-trailing-separator/license @@ -0,0 +1,3 @@ +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/remove-trailing-separator/package.json b/packages/字体精简工具/node_modules/remove-trailing-separator/package.json new file mode 100644 index 0000000..51a58a4 --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-trailing-separator/package.json @@ -0,0 +1,69 @@ +{ + "_from": "remove-trailing-separator@^1.0.1", + "_id": "remove-trailing-separator@1.1.0", + "_inBundle": false, + "_integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "_location": "/remove-trailing-separator", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "remove-trailing-separator@^1.0.1", + "name": "remove-trailing-separator", + "escapedName": "remove-trailing-separator", + "rawSpec": "^1.0.1", + "saveSpec": null, + "fetchSpec": "^1.0.1" + }, + "_requiredBy": [ + "/glob-stream", + "/gulp-clean/vinyl", + "/normalize-path", + "/replace-homedir", + "/vinyl-fs/vinyl", + "/vinyl-sourcemap/vinyl" + ], + "_resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "_shasum": "c24bce2a283adad5bc3f58e0d48249b92379d8ef", + "_spec": "remove-trailing-separator@^1.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\glob-stream", + "author": { + "name": "darsain" + }, + "bugs": { + "url": "https://github.com/darsain/remove-trailing-separator/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Removes separators from the end of the string.", + "devDependencies": { + "ava": "^0.16.0", + "coveralls": "^2.11.14", + "nyc": "^8.3.0", + "xo": "^0.16.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/darsain/remove-trailing-separator#readme", + "keywords": [ + "remove", + "strip", + "trailing", + "separator" + ], + "license": "ISC", + "main": "index.js", + "name": "remove-trailing-separator", + "repository": { + "type": "git", + "url": "git+https://github.com/darsain/remove-trailing-separator.git" + }, + "scripts": { + "lint": "xo", + "pretest": "npm run lint", + "report": "nyc report --reporter=html", + "test": "nyc ava" + }, + "version": "1.1.0" +} diff --git a/packages/字体精简工具/node_modules/remove-trailing-separator/readme.md b/packages/字体精简工具/node_modules/remove-trailing-separator/readme.md new file mode 100644 index 0000000..747086a --- /dev/null +++ b/packages/字体精简工具/node_modules/remove-trailing-separator/readme.md @@ -0,0 +1,51 @@ +# remove-trailing-separator + +[![NPM version][npm-img]][npm-url] [![Build Status: Linux][travis-img]][travis-url] [![Build Status: Windows][appveyor-img]][appveyor-url] [![Coverage Status][coveralls-img]][coveralls-url] + +Removes all separators from the end of a string. + +## Install + +``` +npm install remove-trailing-separator +``` + +## Examples + +```js +const removeTrailingSeparator = require('remove-trailing-separator'); + +removeTrailingSeparator('/foo/bar/') // '/foo/bar' +removeTrailingSeparator('/foo/bar///') // '/foo/bar' + +// leaves only/last separator +removeTrailingSeparator('/') // '/' +removeTrailingSeparator('///') // '/' + +// returns empty string +removeTrailingSeparator('') // '' +``` + +## Notable backslash, or win32 separator behavior + +`\` is considered a separator only on WIN32 systems. All POSIX compliant systems +see backslash as a valid file name character, so it would break POSIX compliance +to remove it there. + +In practice, this means that this code will return different things depending on +what system it runs on: + +```js +removeTrailingSeparator('\\foo\\') +// UNIX => '\\foo\\' +// WIN32 => '\\foo' +``` + +[npm-url]: https://npmjs.org/package/remove-trailing-separator +[npm-img]: https://badge.fury.io/js/remove-trailing-separator.svg +[travis-url]: https://travis-ci.org/darsain/remove-trailing-separator +[travis-img]: https://travis-ci.org/darsain/remove-trailing-separator.svg?branch=master +[appveyor-url]: https://ci.appveyor.com/project/darsain/remove-trailing-separator/branch/master +[appveyor-img]: https://ci.appveyor.com/api/projects/status/wvg9a93rrq95n2xl/branch/master?svg=true +[coveralls-url]: https://coveralls.io/github/darsain/remove-trailing-separator?branch=master +[coveralls-img]: https://coveralls.io/repos/github/darsain/remove-trailing-separator/badge.svg?branch=master diff --git a/packages/字体精简工具/node_modules/repeating/index.js b/packages/字体精简工具/node_modules/repeating/index.js new file mode 100644 index 0000000..ccae0d7 --- /dev/null +++ b/packages/字体精简工具/node_modules/repeating/index.js @@ -0,0 +1,24 @@ +'use strict'; +var isFinite = require('is-finite'); + +module.exports = function (str, n) { + if (typeof str !== 'string') { + throw new TypeError('Expected `input` to be a string'); + } + + if (n < 0 || !isFinite(n)) { + throw new TypeError('Expected `count` to be a positive finite number'); + } + + var ret = ''; + + do { + if (n & 1) { + ret += str; + } + + str += str; + } while ((n >>= 1)); + + return ret; +}; diff --git a/packages/字体精简工具/node_modules/repeating/license b/packages/字体精简工具/node_modules/repeating/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/repeating/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/repeating/package.json b/packages/字体精简工具/node_modules/repeating/package.json new file mode 100644 index 0000000..4fed53a --- /dev/null +++ b/packages/字体精简工具/node_modules/repeating/package.json @@ -0,0 +1,69 @@ +{ + "_from": "repeating@^2.0.0", + "_id": "repeating@2.0.1", + "_inBundle": false, + "_integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "_location": "/repeating", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "repeating@^2.0.0", + "name": "repeating", + "escapedName": "repeating", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/indent-string" + ], + "_resolved": "https://registry.nlark.com/repeating/download/repeating-2.0.1.tgz", + "_shasum": "5214c53a926d3552707527fbab415dbc08d06dda", + "_spec": "repeating@^2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\indent-string", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/repeating/issues" + }, + "bundleDependencies": false, + "dependencies": { + "is-finite": "^1.0.0" + }, + "deprecated": false, + "description": "Repeat a string - fast", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/repeating#readme", + "keywords": [ + "repeat", + "string", + "repeating", + "str", + "text", + "fill", + "pad" + ], + "license": "MIT", + "name": "repeating", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/repeating.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "2.0.1" +} diff --git a/packages/字体精简工具/node_modules/repeating/readme.md b/packages/字体精简工具/node_modules/repeating/readme.md new file mode 100644 index 0000000..06f0b69 --- /dev/null +++ b/packages/字体精简工具/node_modules/repeating/readme.md @@ -0,0 +1,30 @@ +# repeating [![Build Status](https://travis-ci.org/sindresorhus/repeating.svg?branch=master)](https://travis-ci.org/sindresorhus/repeating) + +> Repeat a string - fast + + +## Install + +``` +$ npm install --save repeating +``` + + +## Usage + +```js +const repeating = require('repeating'); + +repeating('unicorn ', 100); +//=> 'unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn unicorn ' +``` + + +## Related + +- [repeating-cli](https://github.com/sindresorhus/repeating-cli) - CLI for this module + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/replace-ext/.npmignore b/packages/字体精简工具/node_modules/replace-ext/.npmignore new file mode 100644 index 0000000..b5ef13a --- /dev/null +++ b/packages/字体精简工具/node_modules/replace-ext/.npmignore @@ -0,0 +1,6 @@ +.DS_Store +*.log +node_modules +build +*.node +components \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/replace-ext/.travis.yml b/packages/字体精简工具/node_modules/replace-ext/.travis.yml new file mode 100644 index 0000000..8101b9f --- /dev/null +++ b/packages/字体精简工具/node_modules/replace-ext/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - "0.7" + - "0.8" + - "0.9" + - "0.10" +after_script: + - npm run coveralls \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/replace-ext/LICENSE b/packages/字体精简工具/node_modules/replace-ext/LICENSE new file mode 100644 index 0000000..7cbe012 --- /dev/null +++ b/packages/字体精简工具/node_modules/replace-ext/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014 Fractal + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/replace-ext/README.md b/packages/字体精简工具/node_modules/replace-ext/README.md new file mode 100644 index 0000000..05b5d21 --- /dev/null +++ b/packages/字体精简工具/node_modules/replace-ext/README.md @@ -0,0 +1,44 @@ +# replace-ext [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status][david-image]][david-url] + + +## Information + + + + + + + + + + + + + +
Packagereplace-ext
DescriptionReplaces a file extension with another one
Node Version>= 0.4
+ +## Usage + +```javascript +var replaceExt = require('replace-ext'); + +var path = '/some/dir/file.js'; +var npath = replaceExt(path, '.coffee'); + +console.log(npath); // /some/dir/file.coffee +``` + +[npm-url]: https://npmjs.org/package/replace-ext +[npm-image]: https://badge.fury.io/js/replace-ext.png + +[travis-url]: https://travis-ci.org/wearefractal/replace-ext +[travis-image]: https://travis-ci.org/wearefractal/replace-ext.png?branch=master + +[coveralls-url]: https://coveralls.io/r/wearefractal/replace-ext +[coveralls-image]: https://coveralls.io/repos/wearefractal/replace-ext/badge.png + +[depstat-url]: https://david-dm.org/wearefractal/replace-ext +[depstat-image]: https://david-dm.org/wearefractal/replace-ext.png + +[david-url]: https://david-dm.org/wearefractal/replace-ext +[david-image]: https://david-dm.org/wearefractal/replace-ext.png?theme=shields.io \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/replace-ext/index.js b/packages/字体精简工具/node_modules/replace-ext/index.js new file mode 100644 index 0000000..3f76938 --- /dev/null +++ b/packages/字体精简工具/node_modules/replace-ext/index.js @@ -0,0 +1,9 @@ +var path = require('path'); + +module.exports = function(npath, ext) { + if (typeof npath !== 'string') return npath; + if (npath.length === 0) return npath; + + var nFileName = path.basename(npath, path.extname(npath))+ext; + return path.join(path.dirname(npath), nFileName); +}; \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/replace-ext/package.json b/packages/字体精简工具/node_modules/replace-ext/package.json new file mode 100644 index 0000000..9ec3e4b --- /dev/null +++ b/packages/字体精简工具/node_modules/replace-ext/package.json @@ -0,0 +1,68 @@ +{ + "_from": "replace-ext@0.0.1", + "_id": "replace-ext@0.0.1", + "_inBundle": false, + "_integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "_location": "/replace-ext", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "replace-ext@0.0.1", + "name": "replace-ext", + "escapedName": "replace-ext", + "rawSpec": "0.0.1", + "saveSpec": null, + "fetchSpec": "0.0.1" + }, + "_requiredBy": [ + "/fontmin", + "/vinyl" + ], + "_resolved": "https://registry.npm.taobao.org/replace-ext/download/replace-ext-0.0.1.tgz", + "_shasum": "29bbd92078a739f0bcce2b4ee41e837953522924", + "_spec": "replace-ext@0.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\fontmin", + "author": { + "name": "Fractal", + "email": "contact@wearefractal.com", + "url": "http://wearefractal.com/" + }, + "bugs": { + "url": "https://github.com/wearefractal/replace-ext/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Replaces a file extension with another one", + "devDependencies": { + "coveralls": "~2.6.1", + "istanbul": "~0.2.3", + "jshint": "~2.4.1", + "mocha": "~1.17.0", + "mocha-lcov-reporter": "~0.0.1", + "rimraf": "~2.2.5", + "should": "~3.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "homepage": "http://github.com/wearefractal/replace-ext", + "licenses": [ + { + "type": "MIT", + "url": "http://github.com/wearefractal/replace-ext/raw/master/LICENSE" + } + ], + "main": "./index.js", + "name": "replace-ext", + "repository": { + "type": "git", + "url": "git://github.com/wearefractal/replace-ext.git" + }, + "scripts": { + "coveralls": "istanbul cover _mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | coveralls && rm -rf ./coverage", + "test": "mocha --reporter spec && jshint" + }, + "version": "0.0.1" +} diff --git a/packages/字体精简工具/node_modules/replace-ext/test/main.js b/packages/字体精简工具/node_modules/replace-ext/test/main.js new file mode 100644 index 0000000..5137702 --- /dev/null +++ b/packages/字体精简工具/node_modules/replace-ext/test/main.js @@ -0,0 +1,51 @@ +var replaceExt = require('../'); +var path = require('path'); +var should = require('should'); +require('mocha'); + +describe('replace-ext', function() { + it('should return a valid replaced extension on nested', function(done) { + var fname = path.join(__dirname, './fixtures/test.coffee'); + var expected = path.join(__dirname, './fixtures/test.js'); + var nu = replaceExt(fname, '.js'); + should.exist(nu); + nu.should.equal(expected); + done(); + }); + + it('should return a valid replaced extension on flat', function(done) { + var fname = 'test.coffee'; + var expected = 'test.js'; + var nu = replaceExt(fname, '.js'); + should.exist(nu); + nu.should.equal(expected); + done(); + }); + + it('should not return a valid replaced extension on empty string', function(done) { + var fname = ''; + var expected = ''; + var nu = replaceExt(fname, '.js'); + should.exist(nu); + nu.should.equal(expected); + done(); + }); + + it('should return a valid removed extension on nested', function(done) { + var fname = path.join(__dirname, './fixtures/test.coffee'); + var expected = path.join(__dirname, './fixtures/test'); + var nu = replaceExt(fname, ''); + should.exist(nu); + nu.should.equal(expected); + done(); + }); + + it('should return a valid added extension on nested', function(done) { + var fname = path.join(__dirname, './fixtures/test'); + var expected = path.join(__dirname, './fixtures/test.js'); + var nu = replaceExt(fname, '.js'); + should.exist(nu); + nu.should.equal(expected); + done(); + }); +}); diff --git a/packages/字体精简工具/node_modules/request/CHANGELOG.md b/packages/字体精简工具/node_modules/request/CHANGELOG.md new file mode 100644 index 0000000..d3ffcd0 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/CHANGELOG.md @@ -0,0 +1,717 @@ +## Change Log + +### v2.88.0 (2018/08/10) +- [#2996](https://github.com/request/request/pull/2996) fix(uuid): import versioned uuid (@kwonoj) +- [#2994](https://github.com/request/request/pull/2994) Update to oauth-sign 0.9.0 (@dlecocq) +- [#2993](https://github.com/request/request/pull/2993) Fix header tests (@simov) +- [#2904](https://github.com/request/request/pull/2904) #515, #2894 Strip port suffix from Host header if the protocol is known. (#2904) (@paambaati) +- [#2791](https://github.com/request/request/pull/2791) Improve AWS SigV4 support. (#2791) (@vikhyat) +- [#2977](https://github.com/request/request/pull/2977) Update test certificates (@simov) + +### v2.87.0 (2018/05/21) +- [#2943](https://github.com/request/request/pull/2943) Replace hawk dependency with a local implemenation (#2943) (@hueniverse) + +### v2.86.0 (2018/05/15) +- [#2885](https://github.com/request/request/pull/2885) Remove redundant code (for Node.js 0.9.4 and below) and dependency (@ChALkeR) +- [#2942](https://github.com/request/request/pull/2942) Make Test GREEN Again! (@simov) +- [#2923](https://github.com/request/request/pull/2923) Alterations for failing CI tests (@gareth-robinson) + +### v2.85.0 (2018/03/12) +- [#2880](https://github.com/request/request/pull/2880) Revert "Update hawk to 7.0.7 (#2880)" (@simov) + +### v2.84.0 (2018/03/12) +- [#2793](https://github.com/request/request/pull/2793) Fixed calculation of oauth_body_hash, issue #2792 (@dvishniakov) +- [#2880](https://github.com/request/request/pull/2880) Update hawk to 7.0.7 (#2880) (@kornel-kedzierski) + +### v2.83.0 (2017/09/27) +- [#2776](https://github.com/request/request/pull/2776) Updating tough-cookie due to security fix. (#2776) (@karlnorling) + +### v2.82.0 (2017/09/19) +- [#2703](https://github.com/request/request/pull/2703) Add Node.js v8 to Travis CI (@ryysud) +- [#2751](https://github.com/request/request/pull/2751) Update of hawk and qs to latest version (#2751) (@Olivier-Moreau) +- [#2658](https://github.com/request/request/pull/2658) Fixed some text in README.md (#2658) (@Marketionist) +- [#2635](https://github.com/request/request/pull/2635) chore(package): update aws-sign2 to version 0.7.0 (#2635) (@greenkeeperio-bot) +- [#2641](https://github.com/request/request/pull/2641) Update README to simplify & update convenience methods (#2641) (@FredKSchott) +- [#2541](https://github.com/request/request/pull/2541) Add convenience method for HTTP OPTIONS (#2541) (@jamesseanwright) +- [#2605](https://github.com/request/request/pull/2605) Add promise support section to README (#2605) (@FredKSchott) +- [#2579](https://github.com/request/request/pull/2579) refactor(lint): replace eslint with standard (#2579) (@ahmadnassri) +- [#2598](https://github.com/request/request/pull/2598) Update codecov to version 2.0.2 🚀 (@greenkeeperio-bot) +- [#2590](https://github.com/request/request/pull/2590) Adds test-timing keepAlive test (@nicjansma) +- [#2589](https://github.com/request/request/pull/2589) fix tabulation on request example README.MD (@odykyi) +- [#2594](https://github.com/request/request/pull/2594) chore(dependencies): har-validator to 5.x [removes babel dep] (@ahmadnassri) + +### v2.81.0 (2017/03/09) +- [#2584](https://github.com/request/request/pull/2584) Security issue: Upgrade qs to version 6.4.0 (@sergejmueller) +- [#2578](https://github.com/request/request/pull/2578) safe-buffer doesn't zero-fill by default, its just a polyfill. (#2578) (@mikeal) +- [#2566](https://github.com/request/request/pull/2566) Timings: Tracks 'lookup', adds 'wait' time, fixes connection re-use (#2566) (@nicjansma) +- [#2574](https://github.com/request/request/pull/2574) Migrating to safe-buffer for improved security. (@mikeal) +- [#2573](https://github.com/request/request/pull/2573) fixes #2572 (@ahmadnassri) + +### v2.80.0 (2017/03/04) +- [#2571](https://github.com/request/request/pull/2571) Correctly format the Host header for IPv6 addresses (@JamesMGreene) +- [#2558](https://github.com/request/request/pull/2558) Update README.md example snippet (@FredKSchott) +- [#2221](https://github.com/request/request/pull/2221) Adding a simple Response object reference in argument specification (@calamarico) +- [#2452](https://github.com/request/request/pull/2452) Adds .timings array with DNC, TCP, request and response times (@nicjansma) +- [#2553](https://github.com/request/request/pull/2553) add ISSUE_TEMPLATE, move PR template (@FredKSchott) +- [#2539](https://github.com/request/request/pull/2539) Create PULL_REQUEST_TEMPLATE.md (@FredKSchott) +- [#2524](https://github.com/request/request/pull/2524) Update caseless to version 0.12.0 🚀 (@greenkeeperio-bot) +- [#2460](https://github.com/request/request/pull/2460) Fix wrong MIME type in example (@OwnageIsMagic) +- [#2514](https://github.com/request/request/pull/2514) Change tags to keywords in package.json (@humphd) +- [#2492](https://github.com/request/request/pull/2492) More lenient gzip decompression (@addaleax) + +### v2.79.0 (2016/11/18) +- [#2368](https://github.com/request/request/pull/2368) Fix typeof check in test-pool.js (@forivall) +- [#2394](https://github.com/request/request/pull/2394) Use `files` in package.json (@SimenB) +- [#2463](https://github.com/request/request/pull/2463) AWS support for session tokens for temporary credentials (@simov) +- [#2467](https://github.com/request/request/pull/2467) Migrate to uuid (@simov, @antialias) +- [#2459](https://github.com/request/request/pull/2459) Update taper to version 0.5.0 🚀 (@greenkeeperio-bot) +- [#2448](https://github.com/request/request/pull/2448) Make other connect timeout test more reliable too (@mscdex) + +### v2.78.0 (2016/11/03) +- [#2447](https://github.com/request/request/pull/2447) Always set request timeout on keep-alive connections (@mscdex) + +### v2.77.0 (2016/11/03) +- [#2439](https://github.com/request/request/pull/2439) Fix socket 'connect' listener handling (@mscdex) +- [#2442](https://github.com/request/request/pull/2442) 👻😱 Node.js 0.10 is unmaintained 😱👻 (@greenkeeperio-bot) +- [#2435](https://github.com/request/request/pull/2435) Add followOriginalHttpMethod to redirect to original HTTP method (@kirrg001) +- [#2414](https://github.com/request/request/pull/2414) Improve test-timeout reliability (@mscdex) + +### v2.76.0 (2016/10/25) +- [#2424](https://github.com/request/request/pull/2424) Handle buffers directly instead of using "bl" (@zertosh) +- [#2415](https://github.com/request/request/pull/2415) Re-enable timeout tests on Travis + other fixes (@mscdex) +- [#2431](https://github.com/request/request/pull/2431) Improve timeouts accuracy and node v6.8.0+ compatibility (@mscdex, @greenkeeperio-bot) +- [#2428](https://github.com/request/request/pull/2428) Update qs to version 6.3.0 🚀 (@greenkeeperio-bot) +- [#2420](https://github.com/request/request/pull/2420) change .on to .once, remove possible memory leaks (@duereg) +- [#2426](https://github.com/request/request/pull/2426) Remove "isFunction" helper in favor of "typeof" check (@zertosh) +- [#2425](https://github.com/request/request/pull/2425) Simplify "defer" helper creation (@zertosh) +- [#2402](https://github.com/request/request/pull/2402) form-data@2.1.1 breaks build 🚨 (@greenkeeperio-bot) +- [#2393](https://github.com/request/request/pull/2393) Update form-data to version 2.1.0 🚀 (@greenkeeperio-bot) + +### v2.75.0 (2016/09/17) +- [#2381](https://github.com/request/request/pull/2381) Drop support for Node 0.10 (@simov) +- [#2377](https://github.com/request/request/pull/2377) Update form-data to version 2.0.0 🚀 (@greenkeeperio-bot) +- [#2353](https://github.com/request/request/pull/2353) Add greenkeeper ignored packages (@simov) +- [#2351](https://github.com/request/request/pull/2351) Update karma-tap to version 3.0.1 🚀 (@greenkeeperio-bot) +- [#2348](https://github.com/request/request/pull/2348) form-data@1.0.1 breaks build 🚨 (@greenkeeperio-bot) +- [#2349](https://github.com/request/request/pull/2349) Check error type instead of string (@scotttrinh) + +### v2.74.0 (2016/07/22) +- [#2295](https://github.com/request/request/pull/2295) Update tough-cookie to 2.3.0 (@stash-sfdc) +- [#2280](https://github.com/request/request/pull/2280) Update karma-tap to version 2.0.1 🚀 (@greenkeeperio-bot) + +### v2.73.0 (2016/07/09) +- [#2240](https://github.com/request/request/pull/2240) Remove connectionErrorHandler to fix #1903 (@zarenner) +- [#2251](https://github.com/request/request/pull/2251) tape@4.6.0 breaks build 🚨 (@greenkeeperio-bot) +- [#2225](https://github.com/request/request/pull/2225) Update docs (@ArtskydJ) +- [#2203](https://github.com/request/request/pull/2203) Update browserify to version 13.0.1 🚀 (@greenkeeperio-bot) +- [#2275](https://github.com/request/request/pull/2275) Update karma to version 1.1.1 🚀 (@greenkeeperio-bot) +- [#2204](https://github.com/request/request/pull/2204) Add codecov.yml and disable PR comments (@simov) +- [#2212](https://github.com/request/request/pull/2212) Fix link to http.IncomingMessage documentation (@nazieb) +- [#2208](https://github.com/request/request/pull/2208) Update to form-data RC4 and pass null values to it (@simov) +- [#2207](https://github.com/request/request/pull/2207) Move aws4 require statement to the top (@simov) +- [#2199](https://github.com/request/request/pull/2199) Update karma-coverage to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#2206](https://github.com/request/request/pull/2206) Update qs to version 6.2.0 🚀 (@greenkeeperio-bot) +- [#2205](https://github.com/request/request/pull/2205) Use server-destory to close hanging sockets in tests (@simov) +- [#2200](https://github.com/request/request/pull/2200) Update karma-cli to version 1.0.0 🚀 (@greenkeeperio-bot) + +### v2.72.0 (2016/04/17) +- [#2176](https://github.com/request/request/pull/2176) Do not try to pipe Gzip responses with no body (@simov) +- [#2175](https://github.com/request/request/pull/2175) Add 'delete' alias for the 'del' API method (@simov, @MuhanZou) +- [#2172](https://github.com/request/request/pull/2172) Add support for deflate content encoding (@czardoz) +- [#2169](https://github.com/request/request/pull/2169) Add callback option (@simov) +- [#2165](https://github.com/request/request/pull/2165) Check for self.req existence inside the write method (@simov) +- [#2167](https://github.com/request/request/pull/2167) Fix TravisCI badge reference master branch (@a0viedo) + +### v2.71.0 (2016/04/12) +- [#2164](https://github.com/request/request/pull/2164) Catch errors from the underlying http module (@simov) + +### v2.70.0 (2016/04/05) +- [#2147](https://github.com/request/request/pull/2147) Update eslint to version 2.5.3 🚀 (@simov, @greenkeeperio-bot) +- [#2009](https://github.com/request/request/pull/2009) Support JSON stringify replacer argument. (@elyobo) +- [#2142](https://github.com/request/request/pull/2142) Update eslint to version 2.5.1 🚀 (@greenkeeperio-bot) +- [#2128](https://github.com/request/request/pull/2128) Update browserify-istanbul to version 2.0.0 🚀 (@greenkeeperio-bot) +- [#2115](https://github.com/request/request/pull/2115) Update eslint to version 2.3.0 🚀 (@simov, @greenkeeperio-bot) +- [#2089](https://github.com/request/request/pull/2089) Fix badges (@simov) +- [#2092](https://github.com/request/request/pull/2092) Update browserify-istanbul to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#2079](https://github.com/request/request/pull/2079) Accept read stream as body option (@simov) +- [#2070](https://github.com/request/request/pull/2070) Update bl to version 1.1.2 🚀 (@greenkeeperio-bot) +- [#2063](https://github.com/request/request/pull/2063) Up bluebird and oauth-sign (@simov) +- [#2058](https://github.com/request/request/pull/2058) Karma fixes for latest versions (@eiriksm) +- [#2057](https://github.com/request/request/pull/2057) Update contributing guidelines (@simov) +- [#2054](https://github.com/request/request/pull/2054) Update qs to version 6.1.0 🚀 (@greenkeeperio-bot) + +### v2.69.0 (2016/01/27) +- [#2041](https://github.com/request/request/pull/2041) restore aws4 as regular dependency (@rmg) + +### v2.68.0 (2016/01/27) +- [#2036](https://github.com/request/request/pull/2036) Add AWS Signature Version 4 (@simov, @mirkods) +- [#2022](https://github.com/request/request/pull/2022) Convert numeric multipart bodies to string (@simov, @feross) +- [#2024](https://github.com/request/request/pull/2024) Update har-validator dependency for nsp advisory #76 (@TylerDixon) +- [#2016](https://github.com/request/request/pull/2016) Update qs to version 6.0.2 🚀 (@greenkeeperio-bot) +- [#2007](https://github.com/request/request/pull/2007) Use the `extend` module instead of util._extend (@simov) +- [#2003](https://github.com/request/request/pull/2003) Update browserify to version 13.0.0 🚀 (@greenkeeperio-bot) +- [#1989](https://github.com/request/request/pull/1989) Update buffer-equal to version 1.0.0 🚀 (@greenkeeperio-bot) +- [#1956](https://github.com/request/request/pull/1956) Check form-data content-length value before setting up the header (@jongyoonlee) +- [#1958](https://github.com/request/request/pull/1958) Use IncomingMessage.destroy method (@simov) +- [#1952](https://github.com/request/request/pull/1952) Adds example for Tor proxy (@prometheansacrifice) +- [#1943](https://github.com/request/request/pull/1943) Update eslint to version 1.10.3 🚀 (@simov, @greenkeeperio-bot) +- [#1924](https://github.com/request/request/pull/1924) Update eslint to version 1.10.1 🚀 (@greenkeeperio-bot) +- [#1915](https://github.com/request/request/pull/1915) Remove content-length and transfer-encoding headers from defaultProxyHeaderWhiteList (@yaxia) + +### v2.67.0 (2015/11/19) +- [#1913](https://github.com/request/request/pull/1913) Update http-signature to version 1.1.0 🚀 (@greenkeeperio-bot) + +### v2.66.0 (2015/11/18) +- [#1906](https://github.com/request/request/pull/1906) Update README URLs based on HTTP redirects (@ReadmeCritic) +- [#1905](https://github.com/request/request/pull/1905) Convert typed arrays into regular buffers (@simov) +- [#1902](https://github.com/request/request/pull/1902) node-uuid@1.4.7 breaks build 🚨 (@greenkeeperio-bot) +- [#1894](https://github.com/request/request/pull/1894) Fix tunneling after redirection from https (Original: #1881) (@simov, @falms) +- [#1893](https://github.com/request/request/pull/1893) Update eslint to version 1.9.0 🚀 (@greenkeeperio-bot) +- [#1852](https://github.com/request/request/pull/1852) Update eslint to version 1.7.3 🚀 (@simov, @greenkeeperio-bot, @paulomcnally, @michelsalib, @arbaaz, @nsklkn, @LoicMahieu, @JoshWillik, @jzaefferer, @ryanwholey, @djchie, @thisconnect, @mgenereu, @acroca, @Sebmaster, @KoltesDigital) +- [#1876](https://github.com/request/request/pull/1876) Implement loose matching for har mime types (@simov) +- [#1875](https://github.com/request/request/pull/1875) Update bluebird to version 3.0.2 🚀 (@simov, @greenkeeperio-bot) +- [#1871](https://github.com/request/request/pull/1871) Update browserify to version 12.0.1 🚀 (@greenkeeperio-bot) +- [#1866](https://github.com/request/request/pull/1866) Add missing quotes on x-token property in README (@miguelmota) +- [#1874](https://github.com/request/request/pull/1874) Fix typo in README.md (@gswalden) +- [#1860](https://github.com/request/request/pull/1860) Improve referer header tests and docs (@simov) +- [#1861](https://github.com/request/request/pull/1861) Remove redundant call to Stream constructor (@watson) +- [#1857](https://github.com/request/request/pull/1857) Fix Referer header to point to the original host name (@simov) +- [#1850](https://github.com/request/request/pull/1850) Update karma-coverage to version 0.5.3 🚀 (@greenkeeperio-bot) +- [#1847](https://github.com/request/request/pull/1847) Use node's latest version when building (@simov) +- [#1836](https://github.com/request/request/pull/1836) Tunnel: fix wrong property name (@KoltesDigital) +- [#1820](https://github.com/request/request/pull/1820) Set href as request.js uses it (@mgenereu) +- [#1840](https://github.com/request/request/pull/1840) Update http-signature to version 1.0.2 🚀 (@greenkeeperio-bot) +- [#1845](https://github.com/request/request/pull/1845) Update istanbul to version 0.4.0 🚀 (@greenkeeperio-bot) + +### v2.65.0 (2015/10/11) +- [#1833](https://github.com/request/request/pull/1833) Update aws-sign2 to version 0.6.0 🚀 (@greenkeeperio-bot) +- [#1811](https://github.com/request/request/pull/1811) Enable loose cookie parsing in tough-cookie (@Sebmaster) +- [#1830](https://github.com/request/request/pull/1830) Bring back tilde ranges for all dependencies (@simov) +- [#1821](https://github.com/request/request/pull/1821) Implement support for RFC 2617 MD5-sess algorithm. (@BigDSK) +- [#1828](https://github.com/request/request/pull/1828) Updated qs dependency to 5.2.0 (@acroca) +- [#1818](https://github.com/request/request/pull/1818) Extract `readResponseBody` method out of `onRequestResponse` (@pvoisin) +- [#1819](https://github.com/request/request/pull/1819) Run stringify once (@mgenereu) +- [#1814](https://github.com/request/request/pull/1814) Updated har-validator to version 2.0.2 (@greenkeeperio-bot) +- [#1807](https://github.com/request/request/pull/1807) Updated tough-cookie to version 2.1.0 (@greenkeeperio-bot) +- [#1800](https://github.com/request/request/pull/1800) Add caret ranges for devDependencies, except eslint (@simov) +- [#1799](https://github.com/request/request/pull/1799) Updated karma-browserify to version 4.4.0 (@greenkeeperio-bot) +- [#1797](https://github.com/request/request/pull/1797) Updated tape to version 4.2.0 (@greenkeeperio-bot) +- [#1788](https://github.com/request/request/pull/1788) Pinned all dependencies (@greenkeeperio-bot) + +### v2.64.0 (2015/09/25) +- [#1787](https://github.com/request/request/pull/1787) npm ignore examples, release.sh and disabled.appveyor.yml (@thisconnect) +- [#1775](https://github.com/request/request/pull/1775) Fix typo in README.md (@djchie) +- [#1776](https://github.com/request/request/pull/1776) Changed word 'conjuction' to read 'conjunction' in README.md (@ryanwholey) +- [#1785](https://github.com/request/request/pull/1785) Revert: Set default application/json content-type when using json option #1772 (@simov) + +### v2.63.0 (2015/09/21) +- [#1772](https://github.com/request/request/pull/1772) Set default application/json content-type when using json option (@jzaefferer) + +### v2.62.0 (2015/09/15) +- [#1768](https://github.com/request/request/pull/1768) Add node 4.0 to the list of build targets (@simov) +- [#1767](https://github.com/request/request/pull/1767) Query strings now cooperate with unix sockets (@JoshWillik) +- [#1750](https://github.com/request/request/pull/1750) Revert doc about installation of tough-cookie added in #884 (@LoicMahieu) +- [#1746](https://github.com/request/request/pull/1746) Missed comma in Readme (@nsklkn) +- [#1743](https://github.com/request/request/pull/1743) Fix options not being initialized in defaults method (@simov) + +### v2.61.0 (2015/08/19) +- [#1721](https://github.com/request/request/pull/1721) Minor fix in README.md (@arbaaz) +- [#1733](https://github.com/request/request/pull/1733) Avoid useless Buffer transformation (@michelsalib) +- [#1726](https://github.com/request/request/pull/1726) Update README.md (@paulomcnally) +- [#1715](https://github.com/request/request/pull/1715) Fix forever option in node > 0.10 #1709 (@calibr) +- [#1716](https://github.com/request/request/pull/1716) Do not create Buffer from Object in setContentLength(iojs v3.0 issue) (@calibr) +- [#1711](https://github.com/request/request/pull/1711) Add ability to detect connect timeouts (@kevinburke) +- [#1712](https://github.com/request/request/pull/1712) Set certificate expiration to August 2, 2018 (@kevinburke) +- [#1700](https://github.com/request/request/pull/1700) debug() when JSON.parse() on a response body fails (@phillipj) + +### v2.60.0 (2015/07/21) +- [#1687](https://github.com/request/request/pull/1687) Fix caseless bug - content-type not being set for multipart/form-data (@simov, @garymathews) + +### v2.59.0 (2015/07/20) +- [#1671](https://github.com/request/request/pull/1671) Add tests and docs for using the agent, agentClass, agentOptions and forever options. + Forever option defaults to using http(s).Agent in node 0.12+ (@simov) +- [#1679](https://github.com/request/request/pull/1679) Fix - do not remove OAuth param when using OAuth realm (@simov, @jhalickman) +- [#1668](https://github.com/request/request/pull/1668) updated dependencies (@deamme) +- [#1656](https://github.com/request/request/pull/1656) Fix form method (@simov) +- [#1651](https://github.com/request/request/pull/1651) Preserve HEAD method when using followAllRedirects (@simov) +- [#1652](https://github.com/request/request/pull/1652) Update `encoding` option documentation in README.md (@daniel347x) +- [#1650](https://github.com/request/request/pull/1650) Allow content-type overriding when using the `form` option (@simov) +- [#1646](https://github.com/request/request/pull/1646) Clarify the nature of setting `ca` in `agentOptions` (@jeffcharles) + +### v2.58.0 (2015/06/16) +- [#1638](https://github.com/request/request/pull/1638) Use the `extend` module to deep extend in the defaults method (@simov) +- [#1631](https://github.com/request/request/pull/1631) Move tunnel logic into separate module (@simov) +- [#1634](https://github.com/request/request/pull/1634) Fix OAuth query transport_method (@simov) +- [#1603](https://github.com/request/request/pull/1603) Add codecov (@simov) + +### v2.57.0 (2015/05/31) +- [#1615](https://github.com/request/request/pull/1615) Replace '.client' with '.socket' as the former was deprecated in 2.2.0. (@ChALkeR) + +### v2.56.0 (2015/05/28) +- [#1610](https://github.com/request/request/pull/1610) Bump module dependencies (@simov) +- [#1600](https://github.com/request/request/pull/1600) Extract the querystring logic into separate module (@simov) +- [#1607](https://github.com/request/request/pull/1607) Re-generate certificates (@simov) +- [#1599](https://github.com/request/request/pull/1599) Move getProxyFromURI logic below the check for Invaild URI (#1595) (@simov) +- [#1598](https://github.com/request/request/pull/1598) Fix the way http verbs are defined in order to please intellisense IDEs (@simov, @flannelJesus) +- [#1591](https://github.com/request/request/pull/1591) A few minor fixes: (@simov) +- [#1584](https://github.com/request/request/pull/1584) Refactor test-default tests (according to comments in #1430) (@simov) +- [#1585](https://github.com/request/request/pull/1585) Fixing documentation regarding TLS options (#1583) (@mainakae) +- [#1574](https://github.com/request/request/pull/1574) Refresh the oauth_nonce on redirect (#1573) (@simov) +- [#1570](https://github.com/request/request/pull/1570) Discovered tests that weren't properly running (@seanstrom) +- [#1569](https://github.com/request/request/pull/1569) Fix pause before response arrives (@kevinoid) +- [#1558](https://github.com/request/request/pull/1558) Emit error instead of throw (@simov) +- [#1568](https://github.com/request/request/pull/1568) Fix stall when piping gzipped response (@kevinoid) +- [#1560](https://github.com/request/request/pull/1560) Update combined-stream (@apechimp) +- [#1543](https://github.com/request/request/pull/1543) Initial support for oauth_body_hash on json payloads (@simov, @aesopwolf) +- [#1541](https://github.com/request/request/pull/1541) Fix coveralls (@simov) +- [#1540](https://github.com/request/request/pull/1540) Fix recursive defaults for convenience methods (@simov) +- [#1536](https://github.com/request/request/pull/1536) More eslint style rules (@froatsnook) +- [#1533](https://github.com/request/request/pull/1533) Adding dependency status bar to README.md (@YasharF) +- [#1539](https://github.com/request/request/pull/1539) ensure the latest version of har-validator is included (@ahmadnassri) +- [#1516](https://github.com/request/request/pull/1516) forever+pool test (@devTristan) + +### v2.55.0 (2015/04/05) +- [#1520](https://github.com/request/request/pull/1520) Refactor defaults (@simov) +- [#1525](https://github.com/request/request/pull/1525) Delete request headers with undefined value. (@froatsnook) +- [#1521](https://github.com/request/request/pull/1521) Add promise tests (@simov) +- [#1518](https://github.com/request/request/pull/1518) Fix defaults (@simov) +- [#1515](https://github.com/request/request/pull/1515) Allow static invoking of convenience methods (@simov) +- [#1505](https://github.com/request/request/pull/1505) Fix multipart boundary extraction regexp (@simov) +- [#1510](https://github.com/request/request/pull/1510) Fix basic auth form data (@simov) + +### v2.54.0 (2015/03/24) +- [#1501](https://github.com/request/request/pull/1501) HTTP Archive 1.2 support (@ahmadnassri) +- [#1486](https://github.com/request/request/pull/1486) Add a test for the forever agent (@akshayp) +- [#1500](https://github.com/request/request/pull/1500) Adding handling for no auth method and null bearer (@philberg) +- [#1498](https://github.com/request/request/pull/1498) Add table of contents in readme (@simov) +- [#1477](https://github.com/request/request/pull/1477) Add support for qs options via qsOptions key (@simov) +- [#1496](https://github.com/request/request/pull/1496) Parameters encoded to base 64 should be decoded as UTF-8, not ASCII. (@albanm) +- [#1494](https://github.com/request/request/pull/1494) Update eslint (@froatsnook) +- [#1474](https://github.com/request/request/pull/1474) Require Colon in Basic Auth (@erykwalder) +- [#1481](https://github.com/request/request/pull/1481) Fix baseUrl and redirections. (@burningtree) +- [#1469](https://github.com/request/request/pull/1469) Feature/base url (@froatsnook) +- [#1459](https://github.com/request/request/pull/1459) Add option to time request/response cycle (including rollup of redirects) (@aaron-em) +- [#1468](https://github.com/request/request/pull/1468) Re-enable io.js/node 0.12 build (@simov, @mikeal, @BBB) +- [#1442](https://github.com/request/request/pull/1442) Fixed the issue with strictSSL tests on 0.12 & io.js by explicitly setting a cipher that matches the cert. (@BBB, @nickmccurdy, @demohi, @simov, @0x4139) +- [#1460](https://github.com/request/request/pull/1460) localAddress or proxy config is lost when redirecting (@simov, @0x4139) +- [#1453](https://github.com/request/request/pull/1453) Test on Node.js 0.12 and io.js with allowed failures (@nickmccurdy, @demohi) +- [#1426](https://github.com/request/request/pull/1426) Fixing tests to pass on io.js and node 0.12 (only test-https.js stiff failing) (@mikeal) +- [#1446](https://github.com/request/request/pull/1446) Missing HTTP referer header with redirects Fixes #1038 (@simov, @guimon) +- [#1428](https://github.com/request/request/pull/1428) Deprecate Node v0.8.x (@nylen) +- [#1436](https://github.com/request/request/pull/1436) Add ability to set a requester without setting default options (@tikotzky) +- [#1435](https://github.com/request/request/pull/1435) dry up verb methods (@sethpollack) +- [#1423](https://github.com/request/request/pull/1423) Allow fully qualified multipart content-type header (@simov) +- [#1430](https://github.com/request/request/pull/1430) Fix recursive requester (@tikotzky) +- [#1429](https://github.com/request/request/pull/1429) Throw error when making HEAD request with a body (@tikotzky) +- [#1419](https://github.com/request/request/pull/1419) Add note that the project is broken in 0.12.x (@nylen) +- [#1413](https://github.com/request/request/pull/1413) Fix basic auth (@simov) +- [#1397](https://github.com/request/request/pull/1397) Improve pipe-from-file tests (@nylen) + +### v2.53.0 (2015/02/02) +- [#1396](https://github.com/request/request/pull/1396) Do not rfc3986 escape JSON bodies (@nylen, @simov) +- [#1392](https://github.com/request/request/pull/1392) Improve `timeout` option description (@watson) + +### v2.52.0 (2015/02/02) +- [#1383](https://github.com/request/request/pull/1383) Add missing HTTPS options that were not being passed to tunnel (@brichard19) (@nylen) +- [#1388](https://github.com/request/request/pull/1388) Upgrade mime-types package version (@roderickhsiao) +- [#1389](https://github.com/request/request/pull/1389) Revise Setup Tunnel Function (@seanstrom) +- [#1374](https://github.com/request/request/pull/1374) Allow explicitly disabling tunneling for proxied https destinations (@nylen) +- [#1376](https://github.com/request/request/pull/1376) Use karma-browserify for tests. Add browser test coverage reporter. (@eiriksm) +- [#1366](https://github.com/request/request/pull/1366) Refactor OAuth into separate module (@simov) +- [#1373](https://github.com/request/request/pull/1373) Rewrite tunnel test to be pure Node.js (@nylen) +- [#1371](https://github.com/request/request/pull/1371) Upgrade test reporter (@nylen) +- [#1360](https://github.com/request/request/pull/1360) Refactor basic, bearer, digest auth logic into separate class (@simov) +- [#1354](https://github.com/request/request/pull/1354) Remove circular dependency from debugging code (@nylen) +- [#1351](https://github.com/request/request/pull/1351) Move digest auth into private prototype method (@simov) +- [#1352](https://github.com/request/request/pull/1352) Update hawk dependency to ~2.3.0 (@mridgway) +- [#1353](https://github.com/request/request/pull/1353) Correct travis-ci badge (@dogancelik) +- [#1349](https://github.com/request/request/pull/1349) Make sure we return on errored browser requests. (@eiriksm) +- [#1346](https://github.com/request/request/pull/1346) getProxyFromURI Extraction Refactor (@seanstrom) +- [#1337](https://github.com/request/request/pull/1337) Standardize test ports on 6767 (@nylen) +- [#1341](https://github.com/request/request/pull/1341) Emit FormData error events as Request error events (@nylen, @rwky) +- [#1343](https://github.com/request/request/pull/1343) Clean up readme badges, and add Travis and Coveralls badges (@nylen) +- [#1345](https://github.com/request/request/pull/1345) Update README.md (@Aaron-Hartwig) +- [#1338](https://github.com/request/request/pull/1338) Always wait for server.close() callback in tests (@nylen) +- [#1342](https://github.com/request/request/pull/1342) Add mock https server and redo start of browser tests for this purpose. (@eiriksm) +- [#1339](https://github.com/request/request/pull/1339) Improve auth docs (@nylen) +- [#1335](https://github.com/request/request/pull/1335) Add support for OAuth plaintext signature method (@simov) +- [#1332](https://github.com/request/request/pull/1332) Add clean script to remove test-browser.js after the tests run (@seanstrom) +- [#1327](https://github.com/request/request/pull/1327) Fix errors generating coverage reports. (@nylen) +- [#1330](https://github.com/request/request/pull/1330) Return empty buffer upon empty response body and encoding is set to null (@seanstrom) +- [#1326](https://github.com/request/request/pull/1326) Use faster container-based infrastructure on Travis (@nylen) +- [#1315](https://github.com/request/request/pull/1315) Implement rfc3986 option (@simov, @nylen, @apoco, @DullReferenceException, @mmalecki, @oliamb, @cliffcrosland, @LewisJEllis, @eiriksm, @poislagarde) +- [#1314](https://github.com/request/request/pull/1314) Detect urlencoded form data header via regex (@simov) +- [#1317](https://github.com/request/request/pull/1317) Improve OAuth1.0 server side flow example (@simov) + +### v2.51.0 (2014/12/10) +- [#1310](https://github.com/request/request/pull/1310) Revert changes introduced in https://github.com/request/request/pull/1282 (@simov) + +### v2.50.0 (2014/12/09) +- [#1308](https://github.com/request/request/pull/1308) Add browser test to keep track of browserify compability. (@eiriksm) +- [#1299](https://github.com/request/request/pull/1299) Add optional support for jsonReviver (@poislagarde) +- [#1277](https://github.com/request/request/pull/1277) Add Coveralls configuration (@simov) +- [#1307](https://github.com/request/request/pull/1307) Upgrade form-data, add back browserify compability. Fixes #455. (@eiriksm) +- [#1305](https://github.com/request/request/pull/1305) Fix typo in README.md (@LewisJEllis) +- [#1288](https://github.com/request/request/pull/1288) Update README.md to explain custom file use case (@cliffcrosland) + +### v2.49.0 (2014/11/28) +- [#1295](https://github.com/request/request/pull/1295) fix(proxy): no-proxy false positive (@oliamb) +- [#1292](https://github.com/request/request/pull/1292) Upgrade `caseless` to 0.8.1 (@mmalecki) +- [#1276](https://github.com/request/request/pull/1276) Set transfer encoding for multipart/related to chunked by default (@simov) +- [#1275](https://github.com/request/request/pull/1275) Fix multipart content-type headers detection (@simov) +- [#1269](https://github.com/request/request/pull/1269) adds streams example for review (@tbuchok) +- [#1238](https://github.com/request/request/pull/1238) Add examples README.md (@simov) + +### v2.48.0 (2014/11/12) +- [#1263](https://github.com/request/request/pull/1263) Fixed a syntax error / typo in README.md (@xna2) +- [#1253](https://github.com/request/request/pull/1253) Add multipart chunked flag (@simov, @nylen) +- [#1251](https://github.com/request/request/pull/1251) Clarify that defaults() does not modify global defaults (@nylen) +- [#1250](https://github.com/request/request/pull/1250) Improve documentation for pool and maxSockets options (@nylen) +- [#1237](https://github.com/request/request/pull/1237) Documenting error handling when using streams (@vmattos) +- [#1244](https://github.com/request/request/pull/1244) Finalize changelog command (@nylen) +- [#1241](https://github.com/request/request/pull/1241) Fix typo (@alexanderGugel) +- [#1223](https://github.com/request/request/pull/1223) Show latest version number instead of "upcoming" in changelog (@nylen) +- [#1236](https://github.com/request/request/pull/1236) Document how to use custom CA in README (#1229) (@hypesystem) +- [#1228](https://github.com/request/request/pull/1228) Support for oauth with RSA-SHA1 signing (@nylen) +- [#1216](https://github.com/request/request/pull/1216) Made json and multipart options coexist (@nylen, @simov) +- [#1225](https://github.com/request/request/pull/1225) Allow header white/exclusive lists in any case. (@RReverser) + +### v2.47.0 (2014/10/26) +- [#1222](https://github.com/request/request/pull/1222) Move from mikeal/request to request/request (@nylen) +- [#1220](https://github.com/request/request/pull/1220) update qs dependency to 2.3.1 (@FredKSchott) +- [#1212](https://github.com/request/request/pull/1212) Improve tests/test-timeout.js (@nylen) +- [#1219](https://github.com/request/request/pull/1219) remove old globalAgent workaround for node 0.4 (@request) +- [#1214](https://github.com/request/request/pull/1214) Remove cruft left over from optional dependencies (@nylen) +- [#1215](https://github.com/request/request/pull/1215) Add proxyHeaderExclusiveList option for proxy-only headers. (@RReverser) +- [#1211](https://github.com/request/request/pull/1211) Allow 'Host' header instead of 'host' and remember case across redirects (@nylen) +- [#1208](https://github.com/request/request/pull/1208) Improve release script (@nylen) +- [#1213](https://github.com/request/request/pull/1213) Support for custom cookie store (@nylen, @mitsuru) +- [#1197](https://github.com/request/request/pull/1197) Clean up some code around setting the agent (@FredKSchott) +- [#1209](https://github.com/request/request/pull/1209) Improve multipart form append test (@simov) +- [#1207](https://github.com/request/request/pull/1207) Update changelog (@nylen) +- [#1185](https://github.com/request/request/pull/1185) Stream multipart/related bodies (@simov) + +### v2.46.0 (2014/10/23) +- [#1198](https://github.com/request/request/pull/1198) doc for TLS/SSL protocol options (@shawnzhu) +- [#1200](https://github.com/request/request/pull/1200) Add a Gitter chat badge to README.md (@gitter-badger) +- [#1196](https://github.com/request/request/pull/1196) Upgrade taper test reporter to v0.3.0 (@nylen) +- [#1199](https://github.com/request/request/pull/1199) Fix lint error: undeclared var i (@nylen) +- [#1191](https://github.com/request/request/pull/1191) Move self.proxy decision logic out of init and into a helper (@FredKSchott) +- [#1190](https://github.com/request/request/pull/1190) Move _buildRequest() logic back into init (@FredKSchott) +- [#1186](https://github.com/request/request/pull/1186) Support Smarter Unix URL Scheme (@FredKSchott) +- [#1178](https://github.com/request/request/pull/1178) update form documentation for new usage (@FredKSchott) +- [#1180](https://github.com/request/request/pull/1180) Enable no-mixed-requires linting rule (@nylen) +- [#1184](https://github.com/request/request/pull/1184) Don't forward authorization header across redirects to different hosts (@nylen) +- [#1183](https://github.com/request/request/pull/1183) Correct README about pre and postamble CRLF using multipart and not mult... (@netpoetica) +- [#1179](https://github.com/request/request/pull/1179) Lint tests directory (@nylen) +- [#1169](https://github.com/request/request/pull/1169) add metadata for form-data file field (@dotcypress) +- [#1173](https://github.com/request/request/pull/1173) remove optional dependencies (@seanstrom) +- [#1165](https://github.com/request/request/pull/1165) Cleanup event listeners and remove function creation from init (@FredKSchott) +- [#1174](https://github.com/request/request/pull/1174) update the request.cookie docs to have a valid cookie example (@seanstrom) +- [#1168](https://github.com/request/request/pull/1168) create a detach helper and use detach helper in replace of nextTick (@seanstrom) +- [#1171](https://github.com/request/request/pull/1171) in post can send form data and use callback (@MiroRadenovic) +- [#1159](https://github.com/request/request/pull/1159) accept charset for x-www-form-urlencoded content-type (@seanstrom) +- [#1157](https://github.com/request/request/pull/1157) Update README.md: body with json=true (@Rob--W) +- [#1164](https://github.com/request/request/pull/1164) Disable tests/test-timeout.js on Travis (@nylen) +- [#1153](https://github.com/request/request/pull/1153) Document how to run a single test (@nylen) +- [#1144](https://github.com/request/request/pull/1144) adds documentation for the "response" event within the streaming section (@tbuchok) +- [#1162](https://github.com/request/request/pull/1162) Update eslintrc file to no longer allow past errors (@FredKSchott) +- [#1155](https://github.com/request/request/pull/1155) Support/use self everywhere (@seanstrom) +- [#1161](https://github.com/request/request/pull/1161) fix no-use-before-define lint warnings (@emkay) +- [#1156](https://github.com/request/request/pull/1156) adding curly brackets to get rid of lint errors (@emkay) +- [#1151](https://github.com/request/request/pull/1151) Fix localAddress test on OS X (@nylen) +- [#1145](https://github.com/request/request/pull/1145) documentation: fix outdated reference to setCookieSync old name in README (@FredKSchott) +- [#1131](https://github.com/request/request/pull/1131) Update pool documentation (@FredKSchott) +- [#1143](https://github.com/request/request/pull/1143) Rewrite all tests to use tape (@nylen) +- [#1137](https://github.com/request/request/pull/1137) Add ability to specifiy querystring lib in options. (@jgrund) +- [#1138](https://github.com/request/request/pull/1138) allow hostname and port in place of host on uri (@cappslock) +- [#1134](https://github.com/request/request/pull/1134) Fix multiple redirects and `self.followRedirect` (@blakeembrey) +- [#1130](https://github.com/request/request/pull/1130) documentation fix: add note about npm test for contributing (@FredKSchott) +- [#1120](https://github.com/request/request/pull/1120) Support/refactor request setup tunnel (@seanstrom) +- [#1129](https://github.com/request/request/pull/1129) linting fix: convert double quote strings to use single quotes (@FredKSchott) +- [#1124](https://github.com/request/request/pull/1124) linting fix: remove unneccesary semi-colons (@FredKSchott) + +### v2.45.0 (2014/10/06) +- [#1128](https://github.com/request/request/pull/1128) Add test for setCookie regression (@nylen) +- [#1127](https://github.com/request/request/pull/1127) added tests around using objects as values in a query string (@bcoe) +- [#1103](https://github.com/request/request/pull/1103) Support/refactor request constructor (@nylen, @seanstrom) +- [#1119](https://github.com/request/request/pull/1119) add basic linting to request library (@FredKSchott) +- [#1121](https://github.com/request/request/pull/1121) Revert "Explicitly use sync versions of cookie functions" (@nylen) +- [#1118](https://github.com/request/request/pull/1118) linting fix: Restructure bad empty if statement (@FredKSchott) +- [#1117](https://github.com/request/request/pull/1117) Fix a bad check for valid URIs (@FredKSchott) +- [#1113](https://github.com/request/request/pull/1113) linting fix: space out operators (@FredKSchott) +- [#1116](https://github.com/request/request/pull/1116) Fix typo in `noProxyHost` definition (@FredKSchott) +- [#1114](https://github.com/request/request/pull/1114) linting fix: Added a `new` operator that was missing when creating and throwing a new error (@FredKSchott) +- [#1096](https://github.com/request/request/pull/1096) No_proxy support (@samcday) +- [#1107](https://github.com/request/request/pull/1107) linting-fix: remove unused variables (@FredKSchott) +- [#1112](https://github.com/request/request/pull/1112) linting fix: Make return values consistent and more straitforward (@FredKSchott) +- [#1111](https://github.com/request/request/pull/1111) linting fix: authPieces was getting redeclared (@FredKSchott) +- [#1105](https://github.com/request/request/pull/1105) Use strict mode in request (@FredKSchott) +- [#1110](https://github.com/request/request/pull/1110) linting fix: replace lazy '==' with more strict '===' (@FredKSchott) +- [#1109](https://github.com/request/request/pull/1109) linting fix: remove function call from if-else conditional statement (@FredKSchott) +- [#1102](https://github.com/request/request/pull/1102) Fix to allow setting a `requester` on recursive calls to `request.defaults` (@tikotzky) +- [#1095](https://github.com/request/request/pull/1095) Tweaking engines in package.json (@pdehaan) +- [#1082](https://github.com/request/request/pull/1082) Forward the socket event from the httpModule request (@seanstrom) +- [#972](https://github.com/request/request/pull/972) Clarify gzip handling in the README (@kevinoid) +- [#1089](https://github.com/request/request/pull/1089) Mention that encoding defaults to utf8, not Buffer (@stuartpb) +- [#1088](https://github.com/request/request/pull/1088) Fix cookie example in README.md and make it more clear (@pipi32167) +- [#1027](https://github.com/request/request/pull/1027) Add support for multipart form data in request options. (@crocket) +- [#1076](https://github.com/request/request/pull/1076) use Request.abort() to abort the request when the request has timed-out (@seanstrom) +- [#1068](https://github.com/request/request/pull/1068) add optional postamble required by .NET multipart requests (@netpoetica) + +### v2.43.0 (2014/09/18) +- [#1057](https://github.com/request/request/pull/1057) Defaults should not overwrite defined options (@davidwood) +- [#1046](https://github.com/request/request/pull/1046) Propagate datastream errors, useful in case gzip fails. (@ZJONSSON, @Janpot) +- [#1063](https://github.com/request/request/pull/1063) copy the input headers object #1060 (@finnp) +- [#1031](https://github.com/request/request/pull/1031) Explicitly use sync versions of cookie functions (@ZJONSSON) +- [#1056](https://github.com/request/request/pull/1056) Fix redirects when passing url.parse(x) as URL to convenience method (@nylen) + +### v2.42.0 (2014/09/04) +- [#1053](https://github.com/request/request/pull/1053) Fix #1051 Parse auth properly when using non-tunneling proxy (@isaacs) + +### v2.41.0 (2014/09/04) +- [#1050](https://github.com/request/request/pull/1050) Pass whitelisted headers to tunneling proxy. Organize all tunneling logic. (@isaacs, @Feldhacker) +- [#1035](https://github.com/request/request/pull/1035) souped up nodei.co badge (@rvagg) +- [#1048](https://github.com/request/request/pull/1048) Aws is now possible over a proxy (@steven-aerts) +- [#1039](https://github.com/request/request/pull/1039) extract out helper functions to a helper file (@seanstrom) +- [#1021](https://github.com/request/request/pull/1021) Support/refactor indexjs (@seanstrom) +- [#1033](https://github.com/request/request/pull/1033) Improve and document debug options (@nylen) +- [#1034](https://github.com/request/request/pull/1034) Fix readme headings (@nylen) +- [#1030](https://github.com/request/request/pull/1030) Allow recursive request.defaults (@tikotzky) +- [#1029](https://github.com/request/request/pull/1029) Fix a couple of typos (@nylen) +- [#675](https://github.com/request/request/pull/675) Checking for SSL fault on connection before reading SSL properties (@VRMink) +- [#989](https://github.com/request/request/pull/989) Added allowRedirect function. Should return true if redirect is allowed or false otherwise (@doronin) +- [#1025](https://github.com/request/request/pull/1025) [fixes #1023] Set self._ended to true once response has ended (@mridgway) +- [#1020](https://github.com/request/request/pull/1020) Add back removed debug metadata (@FredKSchott) +- [#1008](https://github.com/request/request/pull/1008) Moving to module instead of cutomer buffer concatenation. (@mikeal) +- [#770](https://github.com/request/request/pull/770) Added dependency badge for README file; (@timgluz, @mafintosh, @lalitkapoor, @stash, @bobyrizov) +- [#1016](https://github.com/request/request/pull/1016) toJSON no longer results in an infinite loop, returns simple objects (@FredKSchott) +- [#1018](https://github.com/request/request/pull/1018) Remove pre-0.4.4 HTTPS fix (@mmalecki) +- [#1006](https://github.com/request/request/pull/1006) Migrate to caseless, fixes #1001 (@mikeal) +- [#995](https://github.com/request/request/pull/995) Fix parsing array of objects (@sjonnet19) +- [#999](https://github.com/request/request/pull/999) Fix fallback for browserify for optional modules. (@eiriksm) +- [#996](https://github.com/request/request/pull/996) Wrong oauth signature when multiple same param keys exist [updated] (@bengl) + +### v2.40.0 (2014/08/06) +- [#992](https://github.com/request/request/pull/992) Fix security vulnerability. Update qs (@poeticninja) +- [#988](https://github.com/request/request/pull/988) “--” -> “—” (@upisfree) +- [#987](https://github.com/request/request/pull/987) Show optional modules as being loaded by the module that reqeusted them (@iarna) + +### v2.39.0 (2014/07/24) +- [#976](https://github.com/request/request/pull/976) Update README.md (@pvoznenko) + +### v2.38.0 (2014/07/22) +- [#952](https://github.com/request/request/pull/952) Adding support to client certificate with proxy use case (@ofirshaked) +- [#884](https://github.com/request/request/pull/884) Documented tough-cookie installation. (@wbyoung) +- [#935](https://github.com/request/request/pull/935) Correct repository url (@fritx) +- [#963](https://github.com/request/request/pull/963) Update changelog (@nylen) +- [#960](https://github.com/request/request/pull/960) Support gzip with encoding on node pre-v0.9.4 (@kevinoid) +- [#953](https://github.com/request/request/pull/953) Add async Content-Length computation when using form-data (@LoicMahieu) +- [#844](https://github.com/request/request/pull/844) Add support for HTTP[S]_PROXY environment variables. Fixes #595. (@jvmccarthy) +- [#946](https://github.com/request/request/pull/946) defaults: merge headers (@aj0strow) + +### v2.37.0 (2014/07/07) +- [#957](https://github.com/request/request/pull/957) Silence EventEmitter memory leak warning #311 (@watson) +- [#955](https://github.com/request/request/pull/955) check for content-length header before setting it in nextTick (@camilleanne) +- [#951](https://github.com/request/request/pull/951) Add support for gzip content decoding (@kevinoid) +- [#949](https://github.com/request/request/pull/949) Manually enter querystring in form option (@charlespwd) +- [#944](https://github.com/request/request/pull/944) Make request work with browserify (@eiriksm) +- [#943](https://github.com/request/request/pull/943) New mime module (@eiriksm) +- [#927](https://github.com/request/request/pull/927) Bump version of hawk dep. (@samccone) +- [#907](https://github.com/request/request/pull/907) append secureOptions to poolKey (@medovob) + +### v2.35.0 (2014/05/17) +- [#901](https://github.com/request/request/pull/901) Fixes #555 (@pigulla) +- [#897](https://github.com/request/request/pull/897) merge with default options (@vohof) +- [#891](https://github.com/request/request/pull/891) fixes 857 - options object is mutated by calling request (@lalitkapoor) +- [#869](https://github.com/request/request/pull/869) Pipefilter test (@tgohn) +- [#866](https://github.com/request/request/pull/866) Fix typo (@dandv) +- [#861](https://github.com/request/request/pull/861) Add support for RFC 6750 Bearer Tokens (@phedny) +- [#809](https://github.com/request/request/pull/809) upgrade tunnel-proxy to 0.4.0 (@ksato9700) +- [#850](https://github.com/request/request/pull/850) Fix word consistency in readme (@0xNobody) +- [#810](https://github.com/request/request/pull/810) add some exposition to mpu example in README.md (@mikermcneil) +- [#840](https://github.com/request/request/pull/840) improve error reporting for invalid protocols (@FND) +- [#821](https://github.com/request/request/pull/821) added secureOptions back (@nw) +- [#815](https://github.com/request/request/pull/815) Create changelog based on pull requests (@lalitkapoor) + +### v2.34.0 (2014/02/18) +- [#516](https://github.com/request/request/pull/516) UNIX Socket URL Support (@lyuzashi) +- [#801](https://github.com/request/request/pull/801) 794 ignore cookie parsing and domain errors (@lalitkapoor) +- [#802](https://github.com/request/request/pull/802) Added the Apache license to the package.json. (@keskival) +- [#793](https://github.com/request/request/pull/793) Adds content-length calculation when submitting forms using form-data li... (@Juul) +- [#785](https://github.com/request/request/pull/785) Provide ability to override content-type when `json` option used (@vvo) +- [#781](https://github.com/request/request/pull/781) simpler isReadStream function (@joaojeronimo) + +### v2.32.0 (2014/01/16) +- [#767](https://github.com/request/request/pull/767) Use tough-cookie CookieJar sync API (@stash) +- [#764](https://github.com/request/request/pull/764) Case-insensitive authentication scheme (@bobyrizov) +- [#763](https://github.com/request/request/pull/763) Upgrade tough-cookie to 0.10.0 (@stash) +- [#744](https://github.com/request/request/pull/744) Use Cookie.parse (@lalitkapoor) +- [#757](https://github.com/request/request/pull/757) require aws-sign2 (@mafintosh) + +### v2.31.0 (2014/01/08) +- [#645](https://github.com/request/request/pull/645) update twitter api url to v1.1 (@mick) +- [#746](https://github.com/request/request/pull/746) README: Markdown code highlight (@weakish) +- [#745](https://github.com/request/request/pull/745) updating setCookie example to make it clear that the callback is required (@emkay) +- [#742](https://github.com/request/request/pull/742) Add note about JSON output body type (@iansltx) +- [#741](https://github.com/request/request/pull/741) README example is using old cookie jar api (@emkay) +- [#736](https://github.com/request/request/pull/736) Fix callback arguments documentation (@mmalecki) +- [#732](https://github.com/request/request/pull/732) JSHINT: Creating global 'for' variable. Should be 'for (var ...'. (@Fritz-Lium) +- [#730](https://github.com/request/request/pull/730) better HTTP DIGEST support (@dai-shi) +- [#728](https://github.com/request/request/pull/728) Fix TypeError when calling request.cookie (@scarletmeow) +- [#727](https://github.com/request/request/pull/727) fix requester bug (@jchris) +- [#724](https://github.com/request/request/pull/724) README.md: add custom HTTP Headers example. (@tcort) +- [#719](https://github.com/request/request/pull/719) Made a comment gender neutral. (@unsetbit) +- [#715](https://github.com/request/request/pull/715) Request.multipart no longer crashes when header 'Content-type' present (@pastaclub) +- [#710](https://github.com/request/request/pull/710) Fixing listing in callback part of docs. (@lukasz-zak) +- [#696](https://github.com/request/request/pull/696) Edited README.md for formatting and clarity of phrasing (@Zearin) +- [#694](https://github.com/request/request/pull/694) Typo in README (@VRMink) +- [#690](https://github.com/request/request/pull/690) Handle blank password in basic auth. (@diversario) +- [#682](https://github.com/request/request/pull/682) Optional dependencies (@Turbo87) +- [#683](https://github.com/request/request/pull/683) Travis CI support (@Turbo87) +- [#674](https://github.com/request/request/pull/674) change cookie module,to tough-cookie.please check it . (@sxyizhiren) +- [#666](https://github.com/request/request/pull/666) make `ciphers` and `secureProtocol` to work in https request (@richarddong) +- [#656](https://github.com/request/request/pull/656) Test case for #304. (@diversario) +- [#662](https://github.com/request/request/pull/662) option.tunnel to explicitly disable tunneling (@seanmonstar) +- [#659](https://github.com/request/request/pull/659) fix failure when running with NODE_DEBUG=request, and a test for that (@jrgm) +- [#630](https://github.com/request/request/pull/630) Send random cnonce for HTTP Digest requests (@wprl) +- [#619](https://github.com/request/request/pull/619) decouple things a bit (@joaojeronimo) +- [#613](https://github.com/request/request/pull/613) Fixes #583, moved initialization of self.uri.pathname (@lexander) +- [#605](https://github.com/request/request/pull/605) Only include ":" + pass in Basic Auth if it's defined (fixes #602) (@bendrucker) +- [#596](https://github.com/request/request/pull/596) Global agent is being used when pool is specified (@Cauldrath) +- [#594](https://github.com/request/request/pull/594) Emit complete event when there is no callback (@RomainLK) +- [#601](https://github.com/request/request/pull/601) Fixed a small typo (@michalstanko) +- [#589](https://github.com/request/request/pull/589) Prevent setting headers after they are sent (@geek) +- [#587](https://github.com/request/request/pull/587) Global cookie jar disabled by default (@threepointone) +- [#544](https://github.com/request/request/pull/544) Update http-signature version. (@davidlehn) +- [#581](https://github.com/request/request/pull/581) Fix spelling of "ignoring." (@bigeasy) +- [#568](https://github.com/request/request/pull/568) use agentOptions to create agent when specified in request (@SamPlacette) +- [#564](https://github.com/request/request/pull/564) Fix redirections (@criloz) +- [#541](https://github.com/request/request/pull/541) The exported request function doesn't have an auth method (@tschaub) +- [#542](https://github.com/request/request/pull/542) Expose Request class (@regality) +- [#536](https://github.com/request/request/pull/536) Allow explicitly empty user field for basic authentication. (@mikeando) +- [#532](https://github.com/request/request/pull/532) fix typo (@fredericosilva) +- [#497](https://github.com/request/request/pull/497) Added redirect event (@Cauldrath) +- [#503](https://github.com/request/request/pull/503) Fix basic auth for passwords that contain colons (@tonistiigi) +- [#521](https://github.com/request/request/pull/521) Improving test-localAddress.js (@noway) +- [#529](https://github.com/request/request/pull/529) dependencies versions bump (@jodaka) +- [#523](https://github.com/request/request/pull/523) Updating dependencies (@noway) +- [#520](https://github.com/request/request/pull/520) Fixing test-tunnel.js (@noway) +- [#519](https://github.com/request/request/pull/519) Update internal path state on post-creation QS changes (@jblebrun) +- [#510](https://github.com/request/request/pull/510) Add HTTP Signature support. (@davidlehn) +- [#502](https://github.com/request/request/pull/502) Fix POST (and probably other) requests that are retried after 401 Unauthorized (@nylen) +- [#508](https://github.com/request/request/pull/508) Honor the .strictSSL option when using proxies (tunnel-agent) (@jhs) +- [#512](https://github.com/request/request/pull/512) Make password optional to support the format: http://username@hostname/ (@pajato1) +- [#513](https://github.com/request/request/pull/513) add 'localAddress' support (@yyfrankyy) +- [#498](https://github.com/request/request/pull/498) Moving response emit above setHeaders on destination streams (@kenperkins) +- [#490](https://github.com/request/request/pull/490) Empty response body (3-rd argument) must be passed to callback as an empty string (@Olegas) +- [#479](https://github.com/request/request/pull/479) Changing so if Accept header is explicitly set, sending json does not ov... (@RoryH) +- [#475](https://github.com/request/request/pull/475) Use `unescape` from `querystring` (@shimaore) +- [#473](https://github.com/request/request/pull/473) V0.10 compat (@isaacs) +- [#471](https://github.com/request/request/pull/471) Using querystring library from visionmedia (@kbackowski) +- [#461](https://github.com/request/request/pull/461) Strip the UTF8 BOM from a UTF encoded response (@kppullin) +- [#460](https://github.com/request/request/pull/460) hawk 0.10.0 (@hueniverse) +- [#462](https://github.com/request/request/pull/462) if query params are empty, then request path shouldn't end with a '?' (merges cleanly now) (@jaipandya) +- [#456](https://github.com/request/request/pull/456) hawk 0.9.0 (@hueniverse) +- [#429](https://github.com/request/request/pull/429) Copy options before adding callback. (@nrn, @nfriedly, @youurayy, @jplock, @kapetan, @landeiro, @othiym23, @mmalecki) +- [#454](https://github.com/request/request/pull/454) Destroy the response if present when destroying the request (clean merge) (@mafintosh) +- [#310](https://github.com/request/request/pull/310) Twitter Oauth Stuff Out of Date; Now Updated (@joemccann, @isaacs, @mscdex) +- [#413](https://github.com/request/request/pull/413) rename googledoodle.png to .jpg (@nfriedly, @youurayy, @jplock, @kapetan, @landeiro, @othiym23, @mmalecki) +- [#448](https://github.com/request/request/pull/448) Convenience method for PATCH (@mloar) +- [#444](https://github.com/request/request/pull/444) protect against double callbacks on error path (@spollack) +- [#433](https://github.com/request/request/pull/433) Added support for HTTPS cert & key (@mmalecki) +- [#430](https://github.com/request/request/pull/430) Respect specified {Host,host} headers, not just {host} (@andrewschaaf) +- [#415](https://github.com/request/request/pull/415) Fixed a typo. (@jerem) +- [#338](https://github.com/request/request/pull/338) Add more auth options, including digest support (@nylen) +- [#403](https://github.com/request/request/pull/403) Optimize environment lookup to happen once only (@mmalecki) +- [#398](https://github.com/request/request/pull/398) Add more reporting to tests (@mmalecki) +- [#388](https://github.com/request/request/pull/388) Ensure "safe" toJSON doesn't break EventEmitters (@othiym23) +- [#381](https://github.com/request/request/pull/381) Resolving "Invalid signature. Expected signature base string: " (@landeiro) +- [#380](https://github.com/request/request/pull/380) Fixes missing host header on retried request when using forever agent (@mac-) +- [#376](https://github.com/request/request/pull/376) Headers lost on redirect (@kapetan) +- [#375](https://github.com/request/request/pull/375) Fix for missing oauth_timestamp parameter (@jplock) +- [#374](https://github.com/request/request/pull/374) Correct Host header for proxy tunnel CONNECT (@youurayy) +- [#370](https://github.com/request/request/pull/370) Twitter reverse auth uses x_auth_mode not x_auth_type (@drudge) +- [#369](https://github.com/request/request/pull/369) Don't remove x_auth_mode for Twitter reverse auth (@drudge) +- [#344](https://github.com/request/request/pull/344) Make AWS auth signing find headers correctly (@nlf) +- [#363](https://github.com/request/request/pull/363) rfc3986 on base_uri, now passes tests (@jeffmarshall) +- [#362](https://github.com/request/request/pull/362) Running `rfc3986` on `base_uri` in `oauth.hmacsign` instead of just `encodeURIComponent` (@jeffmarshall) +- [#361](https://github.com/request/request/pull/361) Don't create a Content-Length header if we already have it set (@danjenkins) +- [#360](https://github.com/request/request/pull/360) Delete self._form along with everything else on redirect (@jgautier) +- [#355](https://github.com/request/request/pull/355) stop sending erroneous headers on redirected requests (@azylman) +- [#332](https://github.com/request/request/pull/332) Fix #296 - Only set Content-Type if body exists (@Marsup) +- [#343](https://github.com/request/request/pull/343) Allow AWS to work in more situations, added a note in the README on its usage (@nlf) +- [#320](https://github.com/request/request/pull/320) request.defaults() doesn't need to wrap jar() (@StuartHarris) +- [#322](https://github.com/request/request/pull/322) Fix + test for piped into request bumped into redirect. #321 (@alexindigo) +- [#326](https://github.com/request/request/pull/326) Do not try to remove listener from an undefined connection (@CartoDB) +- [#318](https://github.com/request/request/pull/318) Pass servername to tunneling secure socket creation (@isaacs) +- [#317](https://github.com/request/request/pull/317) Workaround for #313 (@isaacs) +- [#293](https://github.com/request/request/pull/293) Allow parser errors to bubble up to request (@mscdex) +- [#290](https://github.com/request/request/pull/290) A test for #289 (@isaacs) +- [#280](https://github.com/request/request/pull/280) Like in node.js print options if NODE_DEBUG contains the word request (@Filirom1) +- [#207](https://github.com/request/request/pull/207) Fix #206 Change HTTP/HTTPS agent when redirecting between protocols (@isaacs) +- [#214](https://github.com/request/request/pull/214) documenting additional behavior of json option (@jphaas, @vpulim) +- [#272](https://github.com/request/request/pull/272) Boundary begins with CRLF? (@elspoono, @timshadel, @naholyr, @nanodocumet, @TehShrike) +- [#284](https://github.com/request/request/pull/284) Remove stray `console.log()` call in multipart generator. (@bcherry) +- [#241](https://github.com/request/request/pull/241) Composability updates suggested by issue #239 (@polotek) +- [#282](https://github.com/request/request/pull/282) OAuth Authorization header contains non-"oauth_" parameters (@jplock) +- [#279](https://github.com/request/request/pull/279) fix tests with boundary by injecting boundry from header (@benatkin) +- [#273](https://github.com/request/request/pull/273) Pipe back pressure issue (@mafintosh) +- [#268](https://github.com/request/request/pull/268) I'm not OCD seriously (@TehShrike) +- [#263](https://github.com/request/request/pull/263) Bug in OAuth key generation for sha1 (@nanodocumet) +- [#265](https://github.com/request/request/pull/265) uncaughtException when redirected to invalid URI (@naholyr) +- [#262](https://github.com/request/request/pull/262) JSON test should check for equality (@timshadel) +- [#261](https://github.com/request/request/pull/261) Setting 'pool' to 'false' does NOT disable Agent pooling (@timshadel) +- [#249](https://github.com/request/request/pull/249) Fix for the fix of your (closed) issue #89 where self.headers[content-length] is set to 0 for all methods (@sethbridges, @polotek, @zephrax, @jeromegn) +- [#255](https://github.com/request/request/pull/255) multipart allow body === '' ( the empty string ) (@Filirom1) +- [#260](https://github.com/request/request/pull/260) fixed just another leak of 'i' (@sreuter) +- [#246](https://github.com/request/request/pull/246) Fixing the set-cookie header (@jeromegn) +- [#243](https://github.com/request/request/pull/243) Dynamic boundary (@zephrax) +- [#240](https://github.com/request/request/pull/240) don't error when null is passed for options (@polotek) +- [#211](https://github.com/request/request/pull/211) Replace all occurrences of special chars in RFC3986 (@chriso, @vpulim) +- [#224](https://github.com/request/request/pull/224) Multipart content-type change (@janjongboom) +- [#217](https://github.com/request/request/pull/217) need to use Authorization (titlecase) header with Tumblr OAuth (@visnup) +- [#203](https://github.com/request/request/pull/203) Fix cookie and redirect bugs and add auth support for HTTPS tunnel (@vpulim) +- [#199](https://github.com/request/request/pull/199) Tunnel (@isaacs) +- [#198](https://github.com/request/request/pull/198) Bugfix on forever usage of util.inherits (@isaacs) +- [#197](https://github.com/request/request/pull/197) Make ForeverAgent work with HTTPS (@isaacs) +- [#193](https://github.com/request/request/pull/193) Fixes GH-119 (@goatslacker) +- [#188](https://github.com/request/request/pull/188) Add abort support to the returned request (@itay) +- [#176](https://github.com/request/request/pull/176) Querystring option (@csainty) +- [#182](https://github.com/request/request/pull/182) Fix request.defaults to support (uri, options, callback) api (@twilson63) +- [#180](https://github.com/request/request/pull/180) Modified the post, put, head and del shortcuts to support uri optional param (@twilson63) +- [#179](https://github.com/request/request/pull/179) fix to add opts in .pipe(stream, opts) (@substack) +- [#177](https://github.com/request/request/pull/177) Issue #173 Support uri as first and optional config as second argument (@twilson63) +- [#170](https://github.com/request/request/pull/170) can't create a cookie in a wrapped request (defaults) (@fabianonunes) +- [#168](https://github.com/request/request/pull/168) Picking off an EasyFix by adding some missing mimetypes. (@serby) +- [#161](https://github.com/request/request/pull/161) Fix cookie jar/headers.cookie collision (#125) (@papandreou) +- [#162](https://github.com/request/request/pull/162) Fix issue #159 (@dpetukhov) +- [#90](https://github.com/request/request/pull/90) add option followAllRedirects to follow post/put redirects (@jroes) +- [#148](https://github.com/request/request/pull/148) Retry Agent (@thejh) +- [#146](https://github.com/request/request/pull/146) Multipart should respect content-type if previously set (@apeace) +- [#144](https://github.com/request/request/pull/144) added "form" option to readme (@petejkim) +- [#133](https://github.com/request/request/pull/133) Fixed cookies parsing (@afanasy) +- [#135](https://github.com/request/request/pull/135) host vs hostname (@iangreenleaf) +- [#132](https://github.com/request/request/pull/132) return the body as a Buffer when encoding is set to null (@jahewson) +- [#112](https://github.com/request/request/pull/112) Support using a custom http-like module (@jhs) +- [#104](https://github.com/request/request/pull/104) Cookie handling contains bugs (@janjongboom) +- [#121](https://github.com/request/request/pull/121) Another patch for cookie handling regression (@jhurliman) +- [#117](https://github.com/request/request/pull/117) Remove the global `i` (@3rd-Eden) +- [#110](https://github.com/request/request/pull/110) Update to Iris Couch URL (@jhs) +- [#86](https://github.com/request/request/pull/86) Can't post binary to multipart requests (@kkaefer) +- [#105](https://github.com/request/request/pull/105) added test for proxy option. (@dominictarr) +- [#102](https://github.com/request/request/pull/102) Implemented cookies - closes issue 82: https://github.com/mikeal/request/issues/82 (@alessioalex) +- [#97](https://github.com/request/request/pull/97) Typo in previous pull causes TypeError in non-0.5.11 versions (@isaacs) +- [#96](https://github.com/request/request/pull/96) Authless parsed url host support (@isaacs) +- [#81](https://github.com/request/request/pull/81) Enhance redirect handling (@danmactough) +- [#78](https://github.com/request/request/pull/78) Don't try to do strictSSL for non-ssl connections (@isaacs) +- [#76](https://github.com/request/request/pull/76) Bug when a request fails and a timeout is set (@Marsup) +- [#70](https://github.com/request/request/pull/70) add test script to package.json (@isaacs, @aheckmann) +- [#73](https://github.com/request/request/pull/73) Fix #71 Respect the strictSSL flag (@isaacs) +- [#69](https://github.com/request/request/pull/69) Flatten chunked requests properly (@isaacs) +- [#67](https://github.com/request/request/pull/67) fixed global variable leaks (@aheckmann) +- [#66](https://github.com/request/request/pull/66) Do not overwrite established content-type headers for read stream deliver (@voodootikigod) +- [#53](https://github.com/request/request/pull/53) Parse json: Issue #51 (@benatkin) +- [#45](https://github.com/request/request/pull/45) Added timeout option (@mbrevoort) +- [#35](https://github.com/request/request/pull/35) The "end" event isn't emitted for some responses (@voxpelli) +- [#31](https://github.com/request/request/pull/31) Error on piping a request to a destination (@tobowers) \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/request/LICENSE b/packages/字体精简工具/node_modules/request/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/packages/字体精简工具/node_modules/request/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/request/README.md b/packages/字体精简工具/node_modules/request/README.md new file mode 100644 index 0000000..9da0eb7 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/README.md @@ -0,0 +1,1133 @@ +# Deprecated! + +As of Feb 11th 2020, request is fully deprecated. No new changes are expected land. In fact, none have landed for some time. + +For more information about why request is deprecated and possible alternatives refer to +[this issue](https://github.com/request/request/issues/3142). + +# Request - Simplified HTTP client + +[![npm package](https://nodei.co/npm/request.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/request/) + +[![Build status](https://img.shields.io/travis/request/request/master.svg?style=flat-square)](https://travis-ci.org/request/request) +[![Coverage](https://img.shields.io/codecov/c/github/request/request.svg?style=flat-square)](https://codecov.io/github/request/request?branch=master) +[![Coverage](https://img.shields.io/coveralls/request/request.svg?style=flat-square)](https://coveralls.io/r/request/request) +[![Dependency Status](https://img.shields.io/david/request/request.svg?style=flat-square)](https://david-dm.org/request/request) +[![Known Vulnerabilities](https://snyk.io/test/npm/request/badge.svg?style=flat-square)](https://snyk.io/test/npm/request) +[![Gitter](https://img.shields.io/badge/gitter-join_chat-blue.svg?style=flat-square)](https://gitter.im/request/request?utm_source=badge) + + +## Super simple to use + +Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. + +```js +const request = require('request'); +request('http://www.google.com', function (error, response, body) { + console.error('error:', error); // Print the error if one occurred + console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received + console.log('body:', body); // Print the HTML for the Google homepage. +}); +``` + + +## Table of contents + +- [Streaming](#streaming) +- [Promises & Async/Await](#promises--asyncawait) +- [Forms](#forms) +- [HTTP Authentication](#http-authentication) +- [Custom HTTP Headers](#custom-http-headers) +- [OAuth Signing](#oauth-signing) +- [Proxies](#proxies) +- [Unix Domain Sockets](#unix-domain-sockets) +- [TLS/SSL Protocol](#tlsssl-protocol) +- [Support for HAR 1.2](#support-for-har-12) +- [**All Available Options**](#requestoptions-callback) + +Request also offers [convenience methods](#convenience-methods) like +`request.defaults` and `request.post`, and there are +lots of [usage examples](#examples) and several +[debugging techniques](#debugging). + + +--- + + +## Streaming + +You can stream any response to a file stream. + +```js +request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) +``` + +You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers don’t already provide one). + +```js +fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) +``` + +Request can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers. + +```js +request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) +``` + +Request emits a "response" event when a response is received. The `response` argument will be an instance of [http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage). + +```js +request + .get('http://google.com/img.png') + .on('response', function(response) { + console.log(response.statusCode) // 200 + console.log(response.headers['content-type']) // 'image/png' + }) + .pipe(request.put('http://mysite.com/img.png')) +``` + +To easily handle errors when streaming requests, listen to the `error` event before piping: + +```js +request + .get('http://mysite.com/doodle.png') + .on('error', function(err) { + console.error(err) + }) + .pipe(fs.createWriteStream('doodle.png')) +``` + +Now let’s get fancy. + +```js +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + if (req.method === 'PUT') { + req.pipe(request.put('http://mysite.com/doodle.png')) + } else if (req.method === 'GET' || req.method === 'HEAD') { + request.get('http://mysite.com/doodle.png').pipe(resp) + } + } +}) +``` + +You can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do: + +```js +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + const x = request('http://mysite.com/doodle.png') + req.pipe(x) + x.pipe(resp) + } +}) +``` + +And since `pipe()` returns the destination stream in ≥ Node 0.5.x you can do one line proxying. :) + +```js +req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) +``` + +Also, none of this new functionality conflicts with requests previous features, it just expands them. + +```js +const r = request.defaults({'proxy':'http://localproxy.com'}) + +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + r.get('http://google.com/doodle.png').pipe(resp) + } +}) +``` + +You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. + +[back to top](#table-of-contents) + + +--- + + +## Promises & Async/Await + +`request` supports both streaming and callback interfaces natively. If you'd like `request` to return a Promise instead, you can use an alternative interface wrapper for `request`. These wrappers can be useful if you prefer to work with Promises, or if you'd like to use `async`/`await` in ES2017. + +Several alternative interfaces are provided by the request team, including: +- [`request-promise`](https://github.com/request/request-promise) (uses [Bluebird](https://github.com/petkaantonov/bluebird) Promises) +- [`request-promise-native`](https://github.com/request/request-promise-native) (uses native Promises) +- [`request-promise-any`](https://github.com/request/request-promise-any) (uses [any-promise](https://www.npmjs.com/package/any-promise) Promises) + +Also, [`util.promisify`](https://nodejs.org/api/util.html#util_util_promisify_original), which is available from Node.js v8.0 can be used to convert a regular function that takes a callback to return a promise instead. + + +[back to top](#table-of-contents) + + +--- + + +## Forms + +`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. + + +#### application/x-www-form-urlencoded (URL-Encoded Forms) + +URL-encoded forms are simple. + +```js +request.post('http://service.com/upload', {form:{key:'value'}}) +// or +request.post('http://service.com/upload').form({key:'value'}) +// or +request.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ /* ... */ }) +``` + + +#### multipart/form-data (Multipart Form Uploads) + +For `multipart/form-data` we use the [form-data](https://github.com/form-data/form-data) library by [@felixge](https://github.com/felixge). For the most cases, you can pass your upload form data via the `formData` option. + + +```js +const formData = { + // Pass a simple key-value pair + my_field: 'my_value', + // Pass data via Buffers + my_buffer: Buffer.from([1, 2, 3]), + // Pass data via Streams + my_file: fs.createReadStream(__dirname + '/unicycle.jpg'), + // Pass multiple values /w an Array + attachments: [ + fs.createReadStream(__dirname + '/attachment1.jpg'), + fs.createReadStream(__dirname + '/attachment2.jpg') + ], + // Pass optional meta-data with an 'options' object with style: {value: DATA, options: OPTIONS} + // Use case: for some types of streams, you'll need to provide "file"-related information manually. + // See the `form-data` README for more information about options: https://github.com/form-data/form-data + custom_file: { + value: fs.createReadStream('/dev/urandom'), + options: { + filename: 'topsecret.jpg', + contentType: 'image/jpeg' + } + } +}; +request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) { + if (err) { + return console.error('upload failed:', err); + } + console.log('Upload successful! Server responded with:', body); +}); +``` + +For advanced cases, you can access the form-data object itself via `r.form()`. This can be modified until the request is fired on the next cycle of the event-loop. (Note that this calling `form()` will clear the currently set form data for that request.) + +```js +// NOTE: Advanced use-case, for normal use see 'formData' usage above +const r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...}) +const form = r.form(); +form.append('my_field', 'my_value'); +form.append('my_buffer', Buffer.from([1, 2, 3])); +form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'}); +``` +See the [form-data README](https://github.com/form-data/form-data) for more information & examples. + + +#### multipart/related + +Some variations in different HTTP implementations require a newline/CRLF before, after, or both before and after the boundary of a `multipart/related` request (using the multipart option). This has been observed in the .NET WebAPI version 4.0. You can turn on a boundary preambleCRLF or postamble by passing them as `true` to your request options. + +```js + request({ + method: 'PUT', + preambleCRLF: true, + postambleCRLF: true, + uri: 'http://service.com/upload', + multipart: [ + { + 'content-type': 'application/json', + body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + }, + { body: 'I am an attachment' }, + { body: fs.createReadStream('image.png') } + ], + // alternatively pass an object containing additional options + multipart: { + chunked: false, + data: [ + { + 'content-type': 'application/json', + body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + }, + { body: 'I am an attachment' } + ] + } + }, + function (error, response, body) { + if (error) { + return console.error('upload failed:', error); + } + console.log('Upload successful! Server responded with:', body); + }) +``` + +[back to top](#table-of-contents) + + +--- + + +## HTTP Authentication + +```js +request.get('http://some.server.com/').auth('username', 'password', false); +// or +request.get('http://some.server.com/', { + 'auth': { + 'user': 'username', + 'pass': 'password', + 'sendImmediately': false + } +}); +// or +request.get('http://some.server.com/').auth(null, null, true, 'bearerToken'); +// or +request.get('http://some.server.com/', { + 'auth': { + 'bearer': 'bearerToken' + } +}); +``` + +If passed as an option, `auth` should be a hash containing values: + +- `user` || `username` +- `pass` || `password` +- `sendImmediately` (optional) +- `bearer` (optional) + +The method form takes parameters +`auth(username, password, sendImmediately, bearer)`. + +`sendImmediately` defaults to `true`, which causes a basic or bearer +authentication header to be sent. If `sendImmediately` is `false`, then +`request` will retry with a proper authentication header after receiving a +`401` response from the server (which must contain a `WWW-Authenticate` header +indicating the required authentication method). + +Note that you can also specify basic authentication using the URL itself, as +detailed in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt). Simply pass the +`user:password` before the host with an `@` sign: + +```js +const username = 'username', + password = 'password', + url = 'http://' + username + ':' + password + '@some.server.com'; + +request({url}, function (error, response, body) { + // Do more stuff with 'body' here +}); +``` + +Digest authentication is supported, but it only works with `sendImmediately` +set to `false`; otherwise `request` will send basic authentication on the +initial request, which will probably cause the request to fail. + +Bearer authentication is supported, and is activated when the `bearer` value is +available. The value may be either a `String` or a `Function` returning a +`String`. Using a function to supply the bearer token is particularly useful if +used in conjunction with `defaults` to allow a single function to supply the +last known token at the time of sending a request, or to compute one on the fly. + +[back to top](#table-of-contents) + + +--- + + +## Custom HTTP Headers + +HTTP Headers, such as `User-Agent`, can be set in the `options` object. +In the example below, we call the github API to find out the number +of stars and forks for the request repository. This requires a +custom `User-Agent` header as well as https. + +```js +const request = require('request'); + +const options = { + url: 'https://api.github.com/repos/request/request', + headers: { + 'User-Agent': 'request' + } +}; + +function callback(error, response, body) { + if (!error && response.statusCode == 200) { + const info = JSON.parse(body); + console.log(info.stargazers_count + " Stars"); + console.log(info.forks_count + " Forks"); + } +} + +request(options, callback); +``` + +[back to top](#table-of-contents) + + +--- + + +## OAuth Signing + +[OAuth version 1.0](https://tools.ietf.org/html/rfc5849) is supported. The +default signing algorithm is +[HMAC-SHA1](https://tools.ietf.org/html/rfc5849#section-3.4.2): + +```js +// OAuth1.0 - 3-legged server side flow (Twitter example) +// step 1 +const qs = require('querystring') + , oauth = + { callback: 'http://mysite.com/callback/' + , consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + } + , url = 'https://api.twitter.com/oauth/request_token' + ; +request.post({url:url, oauth:oauth}, function (e, r, body) { + // Ideally, you would take the body in the response + // and construct a URL that a user clicks on (like a sign in button). + // The verifier is only available in the response after a user has + // verified with twitter that they are authorizing your app. + + // step 2 + const req_data = qs.parse(body) + const uri = 'https://api.twitter.com/oauth/authenticate' + + '?' + qs.stringify({oauth_token: req_data.oauth_token}) + // redirect the user to the authorize uri + + // step 3 + // after the user is redirected back to your server + const auth_data = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: auth_data.oauth_token + , token_secret: req_data.oauth_token_secret + , verifier: auth_data.oauth_verifier + } + , url = 'https://api.twitter.com/oauth/access_token' + ; + request.post({url:url, oauth:oauth}, function (e, r, body) { + // ready to make signed requests on behalf of the user + const perm_data = qs.parse(body) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: perm_data.oauth_token + , token_secret: perm_data.oauth_token_secret + } + , url = 'https://api.twitter.com/1.1/users/show.json' + , qs = + { screen_name: perm_data.screen_name + , user_id: perm_data.user_id + } + ; + request.get({url:url, oauth:oauth, qs:qs, json:true}, function (e, r, user) { + console.log(user) + }) + }) +}) +``` + +For [RSA-SHA1 signing](https://tools.ietf.org/html/rfc5849#section-3.4.3), make +the following changes to the OAuth options object: +* Pass `signature_method : 'RSA-SHA1'` +* Instead of `consumer_secret`, specify a `private_key` string in + [PEM format](http://how2ssl.com/articles/working_with_pem_files/) + +For [PLAINTEXT signing](http://oauth.net/core/1.0/#anchor22), make +the following changes to the OAuth options object: +* Pass `signature_method : 'PLAINTEXT'` + +To send OAuth parameters via query params or in a post body as described in The +[Consumer Request Parameters](http://oauth.net/core/1.0/#consumer_req_param) +section of the oauth1 spec: +* Pass `transport_method : 'query'` or `transport_method : 'body'` in the OAuth + options object. +* `transport_method` defaults to `'header'` + +To use [Request Body Hash](https://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html) you can either +* Manually generate the body hash and pass it as a string `body_hash: '...'` +* Automatically generate the body hash by passing `body_hash: true` + +[back to top](#table-of-contents) + + +--- + + +## Proxies + +If you specify a `proxy` option, then the request (and any subsequent +redirects) will be sent via a connection to the proxy server. + +If your endpoint is an `https` url, and you are using a proxy, then +request will send a `CONNECT` request to the proxy server *first*, and +then use the supplied connection to connect to the endpoint. + +That is, first it will make a request like: + +``` +HTTP/1.1 CONNECT endpoint-server.com:80 +Host: proxy-server.com +User-Agent: whatever user agent you specify +``` + +and then the proxy server make a TCP connection to `endpoint-server` +on port `80`, and return a response that looks like: + +``` +HTTP/1.1 200 OK +``` + +At this point, the connection is left open, and the client is +communicating directly with the `endpoint-server.com` machine. + +See [the wikipedia page on HTTP Tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel) +for more information. + +By default, when proxying `http` traffic, request will simply make a +standard proxied `http` request. This is done by making the `url` +section of the initial line of the request a fully qualified url to +the endpoint. + +For example, it will make a single request that looks like: + +``` +HTTP/1.1 GET http://endpoint-server.com/some-url +Host: proxy-server.com +Other-Headers: all go here + +request body or whatever +``` + +Because a pure "http over http" tunnel offers no additional security +or other features, it is generally simpler to go with a +straightforward HTTP proxy in this case. However, if you would like +to force a tunneling proxy, you may set the `tunnel` option to `true`. + +You can also make a standard proxied `http` request by explicitly setting +`tunnel : false`, but **note that this will allow the proxy to see the traffic +to/from the destination server**. + +If you are using a tunneling proxy, you may set the +`proxyHeaderWhiteList` to share certain headers with the proxy. + +You can also set the `proxyHeaderExclusiveList` to share certain +headers only with the proxy and not with destination host. + +By default, this set is: + +``` +accept +accept-charset +accept-encoding +accept-language +accept-ranges +cache-control +content-encoding +content-language +content-length +content-location +content-md5 +content-range +content-type +connection +date +expect +max-forwards +pragma +proxy-authorization +referer +te +transfer-encoding +user-agent +via +``` + +Note that, when using a tunneling proxy, the `proxy-authorization` +header and any headers from custom `proxyHeaderExclusiveList` are +*never* sent to the endpoint server, but only to the proxy server. + + +### Controlling proxy behaviour using environment variables + +The following environment variables are respected by `request`: + + * `HTTP_PROXY` / `http_proxy` + * `HTTPS_PROXY` / `https_proxy` + * `NO_PROXY` / `no_proxy` + +When `HTTP_PROXY` / `http_proxy` are set, they will be used to proxy non-SSL requests that do not have an explicit `proxy` configuration option present. Similarly, `HTTPS_PROXY` / `https_proxy` will be respected for SSL requests that do not have an explicit `proxy` configuration option. It is valid to define a proxy in one of the environment variables, but then override it for a specific request, using the `proxy` configuration option. Furthermore, the `proxy` configuration option can be explicitly set to false / null to opt out of proxying altogether for that request. + +`request` is also aware of the `NO_PROXY`/`no_proxy` environment variables. These variables provide a granular way to opt out of proxying, on a per-host basis. It should contain a comma separated list of hosts to opt out of proxying. It is also possible to opt of proxying when a particular destination port is used. Finally, the variable may be set to `*` to opt out of the implicit proxy configuration of the other environment variables. + +Here's some examples of valid `no_proxy` values: + + * `google.com` - don't proxy HTTP/HTTPS requests to Google. + * `google.com:443` - don't proxy HTTPS requests to Google, but *do* proxy HTTP requests to Google. + * `google.com:443, yahoo.com:80` - don't proxy HTTPS requests to Google, and don't proxy HTTP requests to Yahoo! + * `*` - ignore `https_proxy`/`http_proxy` environment variables altogether. + +[back to top](#table-of-contents) + + +--- + + +## UNIX Domain Sockets + +`request` supports making requests to [UNIX Domain Sockets](https://en.wikipedia.org/wiki/Unix_domain_socket). To make one, use the following URL scheme: + +```js +/* Pattern */ 'http://unix:SOCKET:PATH' +/* Example */ request.get('http://unix:/absolute/path/to/unix.socket:/request/path') +``` + +Note: The `SOCKET` path is assumed to be absolute to the root of the host file system. + +[back to top](#table-of-contents) + + +--- + + +## TLS/SSL Protocol + +TLS/SSL Protocol options, such as `cert`, `key` and `passphrase`, can be +set directly in `options` object, in the `agentOptions` property of the `options` object, or even in `https.globalAgent.options`. Keep in mind that, although `agentOptions` allows for a slightly wider range of configurations, the recommended way is via `options` object directly, as using `agentOptions` or `https.globalAgent.options` would not be applied in the same way in proxied environments (as data travels through a TLS connection instead of an http/https agent). + +```js +const fs = require('fs') + , path = require('path') + , certFile = path.resolve(__dirname, 'ssl/client.crt') + , keyFile = path.resolve(__dirname, 'ssl/client.key') + , caFile = path.resolve(__dirname, 'ssl/ca.cert.pem') + , request = require('request'); + +const options = { + url: 'https://api.some-server.com/', + cert: fs.readFileSync(certFile), + key: fs.readFileSync(keyFile), + passphrase: 'password', + ca: fs.readFileSync(caFile) +}; + +request.get(options); +``` + +### Using `options.agentOptions` + +In the example below, we call an API that requires client side SSL certificate +(in PEM format) with passphrase protected private key (in PEM format) and disable the SSLv3 protocol: + +```js +const fs = require('fs') + , path = require('path') + , certFile = path.resolve(__dirname, 'ssl/client.crt') + , keyFile = path.resolve(__dirname, 'ssl/client.key') + , request = require('request'); + +const options = { + url: 'https://api.some-server.com/', + agentOptions: { + cert: fs.readFileSync(certFile), + key: fs.readFileSync(keyFile), + // Or use `pfx` property replacing `cert` and `key` when using private key, certificate and CA certs in PFX or PKCS12 format: + // pfx: fs.readFileSync(pfxFilePath), + passphrase: 'password', + securityOptions: 'SSL_OP_NO_SSLv3' + } +}; + +request.get(options); +``` + +It is able to force using SSLv3 only by specifying `secureProtocol`: + +```js +request.get({ + url: 'https://api.some-server.com/', + agentOptions: { + secureProtocol: 'SSLv3_method' + } +}); +``` + +It is possible to accept other certificates than those signed by generally allowed Certificate Authorities (CAs). +This can be useful, for example, when using self-signed certificates. +To require a different root certificate, you can specify the signing CA by adding the contents of the CA's certificate file to the `agentOptions`. +The certificate the domain presents must be signed by the root certificate specified: + +```js +request.get({ + url: 'https://api.some-server.com/', + agentOptions: { + ca: fs.readFileSync('ca.cert.pem') + } +}); +``` + +The `ca` value can be an array of certificates, in the event you have a private or internal corporate public-key infrastructure hierarchy. For example, if you want to connect to https://api.some-server.com which presents a key chain consisting of: +1. its own public key, which is signed by: +2. an intermediate "Corp Issuing Server", that is in turn signed by: +3. a root CA "Corp Root CA"; + +you can configure your request as follows: + +```js +request.get({ + url: 'https://api.some-server.com/', + agentOptions: { + ca: [ + fs.readFileSync('Corp Issuing Server.pem'), + fs.readFileSync('Corp Root CA.pem') + ] + } +}); +``` + +[back to top](#table-of-contents) + + +--- + +## Support for HAR 1.2 + +The `options.har` property will override the values: `url`, `method`, `qs`, `headers`, `form`, `formData`, `body`, `json`, as well as construct multipart data and read files from disk when `request.postData.params[].fileName` is present without a matching `value`. + +A validation step will check if the HAR Request format matches the latest spec (v1.2) and will skip parsing if not matching. + +```js + const request = require('request') + request({ + // will be ignored + method: 'GET', + uri: 'http://www.google.com', + + // HTTP Archive Request Object + har: { + url: 'http://www.mockbin.com/har', + method: 'POST', + headers: [ + { + name: 'content-type', + value: 'application/x-www-form-urlencoded' + } + ], + postData: { + mimeType: 'application/x-www-form-urlencoded', + params: [ + { + name: 'foo', + value: 'bar' + }, + { + name: 'hello', + value: 'world' + } + ] + } + } + }) + + // a POST request will be sent to http://www.mockbin.com + // with body an application/x-www-form-urlencoded body: + // foo=bar&hello=world +``` + +[back to top](#table-of-contents) + + +--- + +## request(options, callback) + +The first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional. + +- `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()` +- `baseUrl` - fully qualified uri string used as the base url. Most useful with `request.defaults`, for example when you want to do many requests to the same domain. If `baseUrl` is `https://example.com/api/`, then requesting `/end/point?test=true` will fetch `https://example.com/api/end/point?test=true`. When `baseUrl` is given, `uri` must also be a string. +- `method` - http method (default: `"GET"`) +- `headers` - http headers (default: `{}`) + +--- + +- `qs` - object containing querystring values to be appended to the `uri` +- `qsParseOptions` - object containing options to pass to the [qs.parse](https://github.com/hapijs/qs#parsing-objects) method. Alternatively pass options to the [querystring.parse](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_parse_str_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}` +- `qsStringifyOptions` - object containing options to pass to the [qs.stringify](https://github.com/hapijs/qs#stringifying) method. Alternatively pass options to the [querystring.stringify](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}`. For example, to change the way arrays are converted to query strings using the `qs` module pass the `arrayFormat` option with one of `indices|brackets|repeat` +- `useQuerystring` - if true, use `querystring` to stringify and parse + querystrings, otherwise use `qs` (default: `false`). Set this option to + `true` if you need arrays to be serialized as `foo=bar&foo=baz` instead of the + default `foo[0]=bar&foo[1]=baz`. + +--- + +- `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer`, `String` or `ReadStream`. If `json` is `true`, then `body` must be a JSON-serializable object. +- `form` - when passed an object or a querystring, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded` header. When passed no options, a `FormData` instance is returned (and is piped to request). See "Forms" section above. +- `formData` - data to pass for a `multipart/form-data` request. See + [Forms](#forms) section above. +- `multipart` - array of objects which contain their own headers and `body` + attributes. Sends a `multipart/related` request. See [Forms](#forms) section + above. + - Alternatively you can pass in an object `{chunked: false, data: []}` where + `chunked` is used to specify whether the request is sent in + [chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) + In non-chunked requests, data items with body streams are not allowed. +- `preambleCRLF` - append a newline/CRLF before the boundary of your `multipart/form-data` request. +- `postambleCRLF` - append a newline/CRLF at the end of the boundary of your `multipart/form-data` request. +- `json` - sets `body` to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as JSON. +- `jsonReviver` - a [reviver function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) that will be passed to `JSON.parse()` when parsing a JSON response body. +- `jsonReplacer` - a [replacer function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) that will be passed to `JSON.stringify()` when stringifying a JSON request body. + +--- + +- `auth` - a hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional). See documentation above. +- `oauth` - options for OAuth HMAC-SHA1 signing. See documentation above. +- `hawk` - options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example). +- `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`, and optionally `session` (note that this only works for services that require session as part of the canonical string). Also requires the property `bucket`, unless you’re specifying your `bucket` as part of the path, or the request doesn’t use a bucket (i.e. GET Services). If you want to use AWS sign version 4 use the parameter `sign_version` with value `4` otherwise the default is version 2. If you are using SigV4, you can also include a `service` property that specifies the service name. **Note:** you need to `npm install aws4` first. +- `httpSignature` - options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options. + +--- + +- `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`). This property can also be implemented as function which gets `response` object as a single argument and should return `true` if redirects should continue or `false` otherwise. +- `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`) +- `followOriginalHttpMethod` - by default we redirect to HTTP method GET. you can enable this property to redirect to the original HTTP method (default: `false`) +- `maxRedirects` - the maximum number of redirects to follow (default: `10`) +- `removeRefererHeader` - removes the referer header when a redirect happens (default: `false`). **Note:** if true, referer header set in the initial request is preserved during redirect chain. + +--- + +- `encoding` - encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`. Anything else **(including the default value of `undefined`)** will be passed as the [encoding](http://nodejs.org/api/buffer.html#buffer_buffer) parameter to `toString()` (meaning this is effectively `utf8` by default). (**Note:** if you expect binary data, you should set `encoding: null`.) +- `gzip` - if `true`, add an `Accept-Encoding` header to request compressed content encodings from the server (if not already present) and decode supported content encodings in the response. **Note:** Automatic decoding of the response content is performed on the body data returned through `request` (both through the `request` stream and passed to the callback function) but is not performed on the `response` stream (available from the `response` event) which is the unmodified `http.IncomingMessage` object which may contain compressed data. See example below. +- `jar` - if `true`, remember cookies for future use (or define your custom cookie jar; see examples section) + +--- + +- `agent` - `http(s).Agent` instance to use +- `agentClass` - alternatively specify your agent's class name +- `agentOptions` - and pass its options. **Note:** for HTTPS see [tls API doc for TLS/SSL options](http://nodejs.org/api/tls.html#tls_tls_connect_options_callback) and the [documentation above](#using-optionsagentoptions). +- `forever` - set to `true` to use the [forever-agent](https://github.com/request/forever-agent) **Note:** Defaults to `http(s).Agent({keepAlive:true})` in node 0.12+ +- `pool` - an object describing which agents to use for the request. If this option is omitted the request will use the global agent (as long as your options allow for it). Otherwise, request will search the pool for your custom agent. If no custom agent is found, a new agent will be created and added to the pool. **Note:** `pool` is used only when the `agent` option is not specified. + - A `maxSockets` property can also be provided on the `pool` object to set the max number of sockets for all agents created (ex: `pool: {maxSockets: Infinity}`). + - Note that if you are sending multiple requests in a loop and creating + multiple new `pool` objects, `maxSockets` will not work as intended. To + work around this, either use [`request.defaults`](#requestdefaultsoptions) + with your pool options or create the pool object with the `maxSockets` + property outside of the loop. +- `timeout` - integer containing number of milliseconds, controls two timeouts. + - **Read timeout**: Time to wait for a server to send response headers (and start the response body) before aborting the request. + - **Connection timeout**: Sets the socket to timeout after `timeout` milliseconds of inactivity. Note that increasing the timeout beyond the OS-wide TCP connection timeout will not have any effect ([the default in Linux can be anywhere from 20-120 seconds][linux-timeout]) + +[linux-timeout]: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout + +--- + +- `localAddress` - local interface to bind for network connections. +- `proxy` - an HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`) +- `strictSSL` - if `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option. +- `tunnel` - controls the behavior of + [HTTP `CONNECT` tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_tunneling) + as follows: + - `undefined` (default) - `true` if the destination is `https`, `false` otherwise + - `true` - always tunnel to the destination by making a `CONNECT` request to + the proxy + - `false` - request the destination as a `GET` request. +- `proxyHeaderWhiteList` - a whitelist of headers to send to a + tunneling proxy. +- `proxyHeaderExclusiveList` - a whitelist of headers to send + exclusively to a tunneling proxy and not to destination. + +--- + +- `time` - if `true`, the request-response cycle (including all redirects) is timed at millisecond resolution. When set, the following properties are added to the response object: + - `elapsedTime` Duration of the entire request/response in milliseconds (*deprecated*). + - `responseStartTime` Timestamp when the response began (in Unix Epoch milliseconds) (*deprecated*). + - `timingStart` Timestamp of the start of the request (in Unix Epoch milliseconds). + - `timings` Contains event timestamps in millisecond resolution relative to `timingStart`. If there were redirects, the properties reflect the timings of the final request in the redirect chain: + - `socket` Relative timestamp when the [`http`](https://nodejs.org/api/http.html#http_event_socket) module's `socket` event fires. This happens when the socket is assigned to the request. + - `lookup` Relative timestamp when the [`net`](https://nodejs.org/api/net.html#net_event_lookup) module's `lookup` event fires. This happens when the DNS has been resolved. + - `connect`: Relative timestamp when the [`net`](https://nodejs.org/api/net.html#net_event_connect) module's `connect` event fires. This happens when the server acknowledges the TCP connection. + - `response`: Relative timestamp when the [`http`](https://nodejs.org/api/http.html#http_event_response) module's `response` event fires. This happens when the first bytes are received from the server. + - `end`: Relative timestamp when the last bytes of the response are received. + - `timingPhases` Contains the durations of each request phase. If there were redirects, the properties reflect the timings of the final request in the redirect chain: + - `wait`: Duration of socket initialization (`timings.socket`) + - `dns`: Duration of DNS lookup (`timings.lookup` - `timings.socket`) + - `tcp`: Duration of TCP connection (`timings.connect` - `timings.socket`) + - `firstByte`: Duration of HTTP server response (`timings.response` - `timings.connect`) + - `download`: Duration of HTTP download (`timings.end` - `timings.response`) + - `total`: Duration entire HTTP round-trip (`timings.end`) + +- `har` - a [HAR 1.2 Request Object](http://www.softwareishard.com/blog/har-12-spec/#request), will be processed from HAR format into options overwriting matching values *(see the [HAR 1.2 section](#support-for-har-12) for details)* +- `callback` - alternatively pass the request's callback in the options object + +The callback argument gets 3 arguments: + +1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object) +2. An [`http.IncomingMessage`](https://nodejs.org/api/http.html#http_class_http_incomingmessage) object (Response object) +3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied) + +[back to top](#table-of-contents) + + +--- + +## Convenience methods + +There are also shorthand methods for different HTTP METHODs and some other conveniences. + + +### request.defaults(options) + +This method **returns a wrapper** around the normal request API that defaults +to whatever options you pass to it. + +**Note:** `request.defaults()` **does not** modify the global request API; +instead, it **returns a wrapper** that has your default settings applied to it. + +**Note:** You can call `.defaults()` on the wrapper that is returned from +`request.defaults` to add/override defaults that were previously defaulted. + +For example: +```js +//requests using baseRequest() will set the 'x-token' header +const baseRequest = request.defaults({ + headers: {'x-token': 'my-token'} +}) + +//requests using specialRequest() will include the 'x-token' header set in +//baseRequest and will also include the 'special' header +const specialRequest = baseRequest.defaults({ + headers: {special: 'special value'} +}) +``` + +### request.METHOD() + +These HTTP method convenience functions act just like `request()` but with a default method already set for you: + +- *request.get()*: Defaults to `method: "GET"`. +- *request.post()*: Defaults to `method: "POST"`. +- *request.put()*: Defaults to `method: "PUT"`. +- *request.patch()*: Defaults to `method: "PATCH"`. +- *request.del() / request.delete()*: Defaults to `method: "DELETE"`. +- *request.head()*: Defaults to `method: "HEAD"`. +- *request.options()*: Defaults to `method: "OPTIONS"`. + +### request.cookie() + +Function that creates a new cookie. + +```js +request.cookie('key1=value1') +``` +### request.jar() + +Function that creates a new cookie jar. + +```js +request.jar() +``` + +### response.caseless.get('header-name') + +Function that returns the specified response header field using a [case-insensitive match](https://tools.ietf.org/html/rfc7230#section-3.2) + +```js +request('http://www.google.com', function (error, response, body) { + // print the Content-Type header even if the server returned it as 'content-type' (lowercase) + console.log('Content-Type is:', response.caseless.get('Content-Type')); +}); +``` + +[back to top](#table-of-contents) + + +--- + + +## Debugging + +There are at least three ways to debug the operation of `request`: + +1. Launch the node process like `NODE_DEBUG=request node script.js` + (`lib,request,otherlib` works too). + +2. Set `require('request').debug = true` at any time (this does the same thing + as #1). + +3. Use the [request-debug module](https://github.com/request/request-debug) to + view request and response headers and bodies. + +[back to top](#table-of-contents) + + +--- + +## Timeouts + +Most requests to external servers should have a timeout attached, in case the +server is not responding in a timely manner. Without a timeout, your code may +have a socket open/consume resources for minutes or more. + +There are two main types of timeouts: **connection timeouts** and **read +timeouts**. A connect timeout occurs if the timeout is hit while your client is +attempting to establish a connection to a remote machine (corresponding to the +[connect() call][connect] on the socket). A read timeout occurs any time the +server is too slow to send back a part of the response. + +These two situations have widely different implications for what went wrong +with the request, so it's useful to be able to distinguish them. You can detect +timeout errors by checking `err.code` for an 'ETIMEDOUT' value. Further, you +can detect whether the timeout was a connection timeout by checking if the +`err.connect` property is set to `true`. + +```js +request.get('http://10.255.255.1', {timeout: 1500}, function(err) { + console.log(err.code === 'ETIMEDOUT'); + // Set to `true` if the timeout was a connection timeout, `false` or + // `undefined` otherwise. + console.log(err.connect === true); + process.exit(0); +}); +``` + +[connect]: http://linux.die.net/man/2/connect + +## Examples: + +```js + const request = require('request') + , rand = Math.floor(Math.random()*100000000).toString() + ; + request( + { method: 'PUT' + , uri: 'http://mikeal.iriscouch.com/testjs/' + rand + , multipart: + [ { 'content-type': 'application/json' + , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + } + , { body: 'I am an attachment' } + ] + } + , function (error, response, body) { + if(response.statusCode == 201){ + console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) + } else { + console.log('error: '+ response.statusCode) + console.log(body) + } + } + ) +``` + +For backwards-compatibility, response compression is not supported by default. +To accept gzip-compressed responses, set the `gzip` option to `true`. Note +that the body data passed through `request` is automatically decompressed +while the response object is unmodified and will contain compressed data if +the server sent a compressed response. + +```js + const request = require('request') + request( + { method: 'GET' + , uri: 'http://www.google.com' + , gzip: true + } + , function (error, response, body) { + // body is the decompressed response body + console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity')) + console.log('the decoded data is: ' + body) + } + ) + .on('data', function(data) { + // decompressed data as it is received + console.log('decoded chunk: ' + data) + }) + .on('response', function(response) { + // unmodified http.IncomingMessage object + response.on('data', function(data) { + // compressed data as it is received + console.log('received ' + data.length + ' bytes of compressed data') + }) + }) +``` + +Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`). + +```js +const request = request.defaults({jar: true}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +To use a custom cookie jar (instead of `request`’s global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`) + +```js +const j = request.jar() +const request = request.defaults({jar:j}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +OR + +```js +const j = request.jar(); +const cookie = request.cookie('key1=value1'); +const url = 'http://www.google.com'; +j.setCookie(cookie, url); +request({url: url, jar: j}, function () { + request('http://images.google.com') +}) +``` + +To use a custom cookie store (such as a +[`FileCookieStore`](https://github.com/mitsuru/tough-cookie-filestore) +which supports saving to and restoring from JSON files), pass it as a parameter +to `request.jar()`: + +```js +const FileCookieStore = require('tough-cookie-filestore'); +// NOTE - currently the 'cookies.json' file must already exist! +const j = request.jar(new FileCookieStore('cookies.json')); +request = request.defaults({ jar : j }) +request('http://www.google.com', function() { + request('http://images.google.com') +}) +``` + +The cookie store must be a +[`tough-cookie`](https://github.com/SalesforceEng/tough-cookie) +store and it must support synchronous operations; see the +[`CookieStore` API docs](https://github.com/SalesforceEng/tough-cookie#api) +for details. + +To inspect your cookie jar after a request: + +```js +const j = request.jar() +request({url: 'http://www.google.com', jar: j}, function () { + const cookie_string = j.getCookieString(url); // "key1=value1; key2=value2; ..." + const cookies = j.getCookies(url); + // [{key: 'key1', value: 'value1', domain: "www.google.com", ...}, ...] +}) +``` + +[back to top](#table-of-contents) diff --git a/packages/字体精简工具/node_modules/request/index.js b/packages/字体精简工具/node_modules/request/index.js new file mode 100644 index 0000000..d50f991 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/index.js @@ -0,0 +1,155 @@ +// Copyright 2010-2012 Mikeal Rogers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict' + +var extend = require('extend') +var cookies = require('./lib/cookies') +var helpers = require('./lib/helpers') + +var paramsHaveRequestBody = helpers.paramsHaveRequestBody + +// organize params for patch, post, put, head, del +function initParams (uri, options, callback) { + if (typeof options === 'function') { + callback = options + } + + var params = {} + if (options !== null && typeof options === 'object') { + extend(params, options, {uri: uri}) + } else if (typeof uri === 'string') { + extend(params, {uri: uri}) + } else { + extend(params, uri) + } + + params.callback = callback || params.callback + return params +} + +function request (uri, options, callback) { + if (typeof uri === 'undefined') { + throw new Error('undefined is not a valid uri or options object.') + } + + var params = initParams(uri, options, callback) + + if (params.method === 'HEAD' && paramsHaveRequestBody(params)) { + throw new Error('HTTP HEAD requests MUST NOT include a request body.') + } + + return new request.Request(params) +} + +function verbFunc (verb) { + var method = verb.toUpperCase() + return function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.method = method + return request(params, params.callback) + } +} + +// define like this to please codeintel/intellisense IDEs +request.get = verbFunc('get') +request.head = verbFunc('head') +request.options = verbFunc('options') +request.post = verbFunc('post') +request.put = verbFunc('put') +request.patch = verbFunc('patch') +request.del = verbFunc('delete') +request['delete'] = verbFunc('delete') + +request.jar = function (store) { + return cookies.jar(store) +} + +request.cookie = function (str) { + return cookies.parse(str) +} + +function wrapRequestMethod (method, options, requester, verb) { + return function (uri, opts, callback) { + var params = initParams(uri, opts, callback) + + var target = {} + extend(true, target, options, params) + + target.pool = params.pool || options.pool + + if (verb) { + target.method = verb.toUpperCase() + } + + if (typeof requester === 'function') { + method = requester + } + + return method(target, target.callback) + } +} + +request.defaults = function (options, requester) { + var self = this + + options = options || {} + + if (typeof options === 'function') { + requester = options + options = {} + } + + var defaults = wrapRequestMethod(self, options, requester) + + var verbs = ['get', 'head', 'post', 'put', 'patch', 'del', 'delete'] + verbs.forEach(function (verb) { + defaults[verb] = wrapRequestMethod(self[verb], options, requester, verb) + }) + + defaults.cookie = wrapRequestMethod(self.cookie, options, requester) + defaults.jar = self.jar + defaults.defaults = self.defaults + return defaults +} + +request.forever = function (agentOptions, optionsArg) { + var options = {} + if (optionsArg) { + extend(options, optionsArg) + } + if (agentOptions) { + options.agentOptions = agentOptions + } + + options.forever = true + return request.defaults(options) +} + +// Exports + +module.exports = request +request.Request = require('./request') +request.initParams = initParams + +// Backwards compatibility for request.debug +Object.defineProperty(request, 'debug', { + enumerable: true, + get: function () { + return request.Request.debug + }, + set: function (debug) { + request.Request.debug = debug + } +}) diff --git a/packages/字体精简工具/node_modules/request/lib/auth.js b/packages/字体精简工具/node_modules/request/lib/auth.js new file mode 100644 index 0000000..02f2038 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/auth.js @@ -0,0 +1,167 @@ +'use strict' + +var caseless = require('caseless') +var uuid = require('uuid/v4') +var helpers = require('./helpers') + +var md5 = helpers.md5 +var toBase64 = helpers.toBase64 + +function Auth (request) { + // define all public properties here + this.request = request + this.hasAuth = false + this.sentAuth = false + this.bearerToken = null + this.user = null + this.pass = null +} + +Auth.prototype.basic = function (user, pass, sendImmediately) { + var self = this + if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) { + self.request.emit('error', new Error('auth() received invalid user or password')) + } + self.user = user + self.pass = pass + self.hasAuth = true + var header = user + ':' + (pass || '') + if (sendImmediately || typeof sendImmediately === 'undefined') { + var authHeader = 'Basic ' + toBase64(header) + self.sentAuth = true + return authHeader + } +} + +Auth.prototype.bearer = function (bearer, sendImmediately) { + var self = this + self.bearerToken = bearer + self.hasAuth = true + if (sendImmediately || typeof sendImmediately === 'undefined') { + if (typeof bearer === 'function') { + bearer = bearer() + } + var authHeader = 'Bearer ' + (bearer || '') + self.sentAuth = true + return authHeader + } +} + +Auth.prototype.digest = function (method, path, authHeader) { + // TODO: More complete implementation of RFC 2617. + // - handle challenge.domain + // - support qop="auth-int" only + // - handle Authentication-Info (not necessarily?) + // - check challenge.stale (not necessarily?) + // - increase nc (not necessarily?) + // For reference: + // http://tools.ietf.org/html/rfc2617#section-3 + // https://github.com/bagder/curl/blob/master/lib/http_digest.c + + var self = this + + var challenge = {} + var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi + while (true) { + var match = re.exec(authHeader) + if (!match) { + break + } + challenge[match[1]] = match[2] || match[3] + } + + /** + * RFC 2617: handle both MD5 and MD5-sess algorithms. + * + * If the algorithm directive's value is "MD5" or unspecified, then HA1 is + * HA1=MD5(username:realm:password) + * If the algorithm directive's value is "MD5-sess", then HA1 is + * HA1=MD5(MD5(username:realm:password):nonce:cnonce) + */ + var ha1Compute = function (algorithm, user, realm, pass, nonce, cnonce) { + var ha1 = md5(user + ':' + realm + ':' + pass) + if (algorithm && algorithm.toLowerCase() === 'md5-sess') { + return md5(ha1 + ':' + nonce + ':' + cnonce) + } else { + return ha1 + } + } + + var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth' + var nc = qop && '00000001' + var cnonce = qop && uuid().replace(/-/g, '') + var ha1 = ha1Compute(challenge.algorithm, self.user, challenge.realm, self.pass, challenge.nonce, cnonce) + var ha2 = md5(method + ':' + path) + var digestResponse = qop + ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) + : md5(ha1 + ':' + challenge.nonce + ':' + ha2) + var authValues = { + username: self.user, + realm: challenge.realm, + nonce: challenge.nonce, + uri: path, + qop: qop, + response: digestResponse, + nc: nc, + cnonce: cnonce, + algorithm: challenge.algorithm, + opaque: challenge.opaque + } + + authHeader = [] + for (var k in authValues) { + if (authValues[k]) { + if (k === 'qop' || k === 'nc' || k === 'algorithm') { + authHeader.push(k + '=' + authValues[k]) + } else { + authHeader.push(k + '="' + authValues[k] + '"') + } + } + } + authHeader = 'Digest ' + authHeader.join(', ') + self.sentAuth = true + return authHeader +} + +Auth.prototype.onRequest = function (user, pass, sendImmediately, bearer) { + var self = this + var request = self.request + + var authHeader + if (bearer === undefined && user === undefined) { + self.request.emit('error', new Error('no auth mechanism defined')) + } else if (bearer !== undefined) { + authHeader = self.bearer(bearer, sendImmediately) + } else { + authHeader = self.basic(user, pass, sendImmediately) + } + if (authHeader) { + request.setHeader('authorization', authHeader) + } +} + +Auth.prototype.onResponse = function (response) { + var self = this + var request = self.request + + if (!self.hasAuth || self.sentAuth) { return null } + + var c = caseless(response.headers) + + var authHeader = c.get('www-authenticate') + var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase() + request.debug('reauth', authVerb) + + switch (authVerb) { + case 'basic': + return self.basic(self.user, self.pass, true) + + case 'bearer': + return self.bearer(self.bearerToken, true) + + case 'digest': + return self.digest(request.method, request.path, authHeader) + } +} + +exports.Auth = Auth diff --git a/packages/字体精简工具/node_modules/request/lib/cookies.js b/packages/字体精简工具/node_modules/request/lib/cookies.js new file mode 100644 index 0000000..bd5d46b --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/cookies.js @@ -0,0 +1,38 @@ +'use strict' + +var tough = require('tough-cookie') + +var Cookie = tough.Cookie +var CookieJar = tough.CookieJar + +exports.parse = function (str) { + if (str && str.uri) { + str = str.uri + } + if (typeof str !== 'string') { + throw new Error('The cookie function only accepts STRING as param') + } + return Cookie.parse(str, {loose: true}) +} + +// Adapt the sometimes-Async api of tough.CookieJar to our requirements +function RequestJar (store) { + var self = this + self._jar = new CookieJar(store, {looseMode: true}) +} +RequestJar.prototype.setCookie = function (cookieOrStr, uri, options) { + var self = this + return self._jar.setCookieSync(cookieOrStr, uri, options || {}) +} +RequestJar.prototype.getCookieString = function (uri) { + var self = this + return self._jar.getCookieStringSync(uri) +} +RequestJar.prototype.getCookies = function (uri) { + var self = this + return self._jar.getCookiesSync(uri) +} + +exports.jar = function (store) { + return new RequestJar(store) +} diff --git a/packages/字体精简工具/node_modules/request/lib/getProxyFromURI.js b/packages/字体精简工具/node_modules/request/lib/getProxyFromURI.js new file mode 100644 index 0000000..0b9b18e --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/getProxyFromURI.js @@ -0,0 +1,79 @@ +'use strict' + +function formatHostname (hostname) { + // canonicalize the hostname, so that 'oogle.com' won't match 'google.com' + return hostname.replace(/^\.*/, '.').toLowerCase() +} + +function parseNoProxyZone (zone) { + zone = zone.trim().toLowerCase() + + var zoneParts = zone.split(':', 2) + var zoneHost = formatHostname(zoneParts[0]) + var zonePort = zoneParts[1] + var hasPort = zone.indexOf(':') > -1 + + return {hostname: zoneHost, port: zonePort, hasPort: hasPort} +} + +function uriInNoProxy (uri, noProxy) { + var port = uri.port || (uri.protocol === 'https:' ? '443' : '80') + var hostname = formatHostname(uri.hostname) + var noProxyList = noProxy.split(',') + + // iterate through the noProxyList until it finds a match. + return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) { + var isMatchedAt = hostname.indexOf(noProxyZone.hostname) + var hostnameMatched = ( + isMatchedAt > -1 && + (isMatchedAt === hostname.length - noProxyZone.hostname.length) + ) + + if (noProxyZone.hasPort) { + return (port === noProxyZone.port) && hostnameMatched + } + + return hostnameMatched + }) +} + +function getProxyFromURI (uri) { + // Decide the proper request proxy to use based on the request URI object and the + // environmental variables (NO_PROXY, HTTP_PROXY, etc.) + // respect NO_PROXY environment variables (see: https://lynx.invisible-island.net/lynx2.8.7/breakout/lynx_help/keystrokes/environments.html) + + var noProxy = process.env.NO_PROXY || process.env.no_proxy || '' + + // if the noProxy is a wildcard then return null + + if (noProxy === '*') { + return null + } + + // if the noProxy is not empty and the uri is found return null + + if (noProxy !== '' && uriInNoProxy(uri, noProxy)) { + return null + } + + // Check for HTTP or HTTPS Proxy in environment Else default to null + + if (uri.protocol === 'http:') { + return process.env.HTTP_PROXY || + process.env.http_proxy || null + } + + if (uri.protocol === 'https:') { + return process.env.HTTPS_PROXY || + process.env.https_proxy || + process.env.HTTP_PROXY || + process.env.http_proxy || null + } + + // if none of that works, return null + // (What uri protocol are you using then?) + + return null +} + +module.exports = getProxyFromURI diff --git a/packages/字体精简工具/node_modules/request/lib/har.js b/packages/字体精简工具/node_modules/request/lib/har.js new file mode 100644 index 0000000..0dedee4 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/har.js @@ -0,0 +1,205 @@ +'use strict' + +var fs = require('fs') +var qs = require('querystring') +var validate = require('har-validator') +var extend = require('extend') + +function Har (request) { + this.request = request +} + +Har.prototype.reducer = function (obj, pair) { + // new property ? + if (obj[pair.name] === undefined) { + obj[pair.name] = pair.value + return obj + } + + // existing? convert to array + var arr = [ + obj[pair.name], + pair.value + ] + + obj[pair.name] = arr + + return obj +} + +Har.prototype.prep = function (data) { + // construct utility properties + data.queryObj = {} + data.headersObj = {} + data.postData.jsonObj = false + data.postData.paramsObj = false + + // construct query objects + if (data.queryString && data.queryString.length) { + data.queryObj = data.queryString.reduce(this.reducer, {}) + } + + // construct headers objects + if (data.headers && data.headers.length) { + // loweCase header keys + data.headersObj = data.headers.reduceRight(function (headers, header) { + headers[header.name] = header.value + return headers + }, {}) + } + + // construct Cookie header + if (data.cookies && data.cookies.length) { + var cookies = data.cookies.map(function (cookie) { + return cookie.name + '=' + cookie.value + }) + + if (cookies.length) { + data.headersObj.cookie = cookies.join('; ') + } + } + + // prep body + function some (arr) { + return arr.some(function (type) { + return data.postData.mimeType.indexOf(type) === 0 + }) + } + + if (some([ + 'multipart/mixed', + 'multipart/related', + 'multipart/form-data', + 'multipart/alternative'])) { + // reset values + data.postData.mimeType = 'multipart/form-data' + } else if (some([ + 'application/x-www-form-urlencoded'])) { + if (!data.postData.params) { + data.postData.text = '' + } else { + data.postData.paramsObj = data.postData.params.reduce(this.reducer, {}) + + // always overwrite + data.postData.text = qs.stringify(data.postData.paramsObj) + } + } else if (some([ + 'text/json', + 'text/x-json', + 'application/json', + 'application/x-json'])) { + data.postData.mimeType = 'application/json' + + if (data.postData.text) { + try { + data.postData.jsonObj = JSON.parse(data.postData.text) + } catch (e) { + this.request.debug(e) + + // force back to text/plain + data.postData.mimeType = 'text/plain' + } + } + } + + return data +} + +Har.prototype.options = function (options) { + // skip if no har property defined + if (!options.har) { + return options + } + + var har = {} + extend(har, options.har) + + // only process the first entry + if (har.log && har.log.entries) { + har = har.log.entries[0] + } + + // add optional properties to make validation successful + har.url = har.url || options.url || options.uri || options.baseUrl || '/' + har.httpVersion = har.httpVersion || 'HTTP/1.1' + har.queryString = har.queryString || [] + har.headers = har.headers || [] + har.cookies = har.cookies || [] + har.postData = har.postData || {} + har.postData.mimeType = har.postData.mimeType || 'application/octet-stream' + + har.bodySize = 0 + har.headersSize = 0 + har.postData.size = 0 + + if (!validate.request(har)) { + return options + } + + // clean up and get some utility properties + var req = this.prep(har) + + // construct new options + if (req.url) { + options.url = req.url + } + + if (req.method) { + options.method = req.method + } + + if (Object.keys(req.queryObj).length) { + options.qs = req.queryObj + } + + if (Object.keys(req.headersObj).length) { + options.headers = req.headersObj + } + + function test (type) { + return req.postData.mimeType.indexOf(type) === 0 + } + if (test('application/x-www-form-urlencoded')) { + options.form = req.postData.paramsObj + } else if (test('application/json')) { + if (req.postData.jsonObj) { + options.body = req.postData.jsonObj + options.json = true + } + } else if (test('multipart/form-data')) { + options.formData = {} + + req.postData.params.forEach(function (param) { + var attachment = {} + + if (!param.fileName && !param.contentType) { + options.formData[param.name] = param.value + return + } + + // attempt to read from disk! + if (param.fileName && !param.value) { + attachment.value = fs.createReadStream(param.fileName) + } else if (param.value) { + attachment.value = param.value + } + + if (param.fileName) { + attachment.options = { + filename: param.fileName, + contentType: param.contentType ? param.contentType : null + } + } + + options.formData[param.name] = attachment + }) + } else { + if (req.postData.text) { + options.body = req.postData.text + } + } + + return options +} + +exports.Har = Har diff --git a/packages/字体精简工具/node_modules/request/lib/hawk.js b/packages/字体精简工具/node_modules/request/lib/hawk.js new file mode 100644 index 0000000..de48a98 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/hawk.js @@ -0,0 +1,89 @@ +'use strict' + +var crypto = require('crypto') + +function randomString (size) { + var bits = (size + 1) * 6 + var buffer = crypto.randomBytes(Math.ceil(bits / 8)) + var string = buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') + return string.slice(0, size) +} + +function calculatePayloadHash (payload, algorithm, contentType) { + var hash = crypto.createHash(algorithm) + hash.update('hawk.1.payload\n') + hash.update((contentType ? contentType.split(';')[0].trim().toLowerCase() : '') + '\n') + hash.update(payload || '') + hash.update('\n') + return hash.digest('base64') +} + +exports.calculateMac = function (credentials, opts) { + var normalized = 'hawk.1.header\n' + + opts.ts + '\n' + + opts.nonce + '\n' + + (opts.method || '').toUpperCase() + '\n' + + opts.resource + '\n' + + opts.host.toLowerCase() + '\n' + + opts.port + '\n' + + (opts.hash || '') + '\n' + + if (opts.ext) { + normalized = normalized + opts.ext.replace('\\', '\\\\').replace('\n', '\\n') + } + + normalized = normalized + '\n' + + if (opts.app) { + normalized = normalized + opts.app + '\n' + (opts.dlg || '') + '\n' + } + + var hmac = crypto.createHmac(credentials.algorithm, credentials.key).update(normalized) + var digest = hmac.digest('base64') + return digest +} + +exports.header = function (uri, method, opts) { + var timestamp = opts.timestamp || Math.floor((Date.now() + (opts.localtimeOffsetMsec || 0)) / 1000) + var credentials = opts.credentials + if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) { + return '' + } + + if (['sha1', 'sha256'].indexOf(credentials.algorithm) === -1) { + return '' + } + + var artifacts = { + ts: timestamp, + nonce: opts.nonce || randomString(6), + method: method, + resource: uri.pathname + (uri.search || ''), + host: uri.hostname, + port: uri.port || (uri.protocol === 'http:' ? 80 : 443), + hash: opts.hash, + ext: opts.ext, + app: opts.app, + dlg: opts.dlg + } + + if (!artifacts.hash && (opts.payload || opts.payload === '')) { + artifacts.hash = calculatePayloadHash(opts.payload, credentials.algorithm, opts.contentType) + } + + var mac = exports.calculateMac(credentials, artifacts) + + var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== '' + var header = 'Hawk id="' + credentials.id + + '", ts="' + artifacts.ts + + '", nonce="' + artifacts.nonce + + (artifacts.hash ? '", hash="' + artifacts.hash : '') + + (hasExt ? '", ext="' + artifacts.ext.replace(/\\/g, '\\\\').replace(/"/g, '\\"') : '') + + '", mac="' + mac + '"' + + if (artifacts.app) { + header = header + ', app="' + artifacts.app + (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"' + } + + return header +} diff --git a/packages/字体精简工具/node_modules/request/lib/helpers.js b/packages/字体精简工具/node_modules/request/lib/helpers.js new file mode 100644 index 0000000..8b2a7e6 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/helpers.js @@ -0,0 +1,66 @@ +'use strict' + +var jsonSafeStringify = require('json-stringify-safe') +var crypto = require('crypto') +var Buffer = require('safe-buffer').Buffer + +var defer = typeof setImmediate === 'undefined' + ? process.nextTick + : setImmediate + +function paramsHaveRequestBody (params) { + return ( + params.body || + params.requestBodyStream || + (params.json && typeof params.json !== 'boolean') || + params.multipart + ) +} + +function safeStringify (obj, replacer) { + var ret + try { + ret = JSON.stringify(obj, replacer) + } catch (e) { + ret = jsonSafeStringify(obj, replacer) + } + return ret +} + +function md5 (str) { + return crypto.createHash('md5').update(str).digest('hex') +} + +function isReadStream (rs) { + return rs.readable && rs.path && rs.mode +} + +function toBase64 (str) { + return Buffer.from(str || '', 'utf8').toString('base64') +} + +function copy (obj) { + var o = {} + Object.keys(obj).forEach(function (i) { + o[i] = obj[i] + }) + return o +} + +function version () { + var numbers = process.version.replace('v', '').split('.') + return { + major: parseInt(numbers[0], 10), + minor: parseInt(numbers[1], 10), + patch: parseInt(numbers[2], 10) + } +} + +exports.paramsHaveRequestBody = paramsHaveRequestBody +exports.safeStringify = safeStringify +exports.md5 = md5 +exports.isReadStream = isReadStream +exports.toBase64 = toBase64 +exports.copy = copy +exports.version = version +exports.defer = defer diff --git a/packages/字体精简工具/node_modules/request/lib/multipart.js b/packages/字体精简工具/node_modules/request/lib/multipart.js new file mode 100644 index 0000000..6a009bc --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/multipart.js @@ -0,0 +1,112 @@ +'use strict' + +var uuid = require('uuid/v4') +var CombinedStream = require('combined-stream') +var isstream = require('isstream') +var Buffer = require('safe-buffer').Buffer + +function Multipart (request) { + this.request = request + this.boundary = uuid() + this.chunked = false + this.body = null +} + +Multipart.prototype.isChunked = function (options) { + var self = this + var chunked = false + var parts = options.data || options + + if (!parts.forEach) { + self.request.emit('error', new Error('Argument error, options.multipart.')) + } + + if (options.chunked !== undefined) { + chunked = options.chunked + } + + if (self.request.getHeader('transfer-encoding') === 'chunked') { + chunked = true + } + + if (!chunked) { + parts.forEach(function (part) { + if (typeof part.body === 'undefined') { + self.request.emit('error', new Error('Body attribute missing in multipart.')) + } + if (isstream(part.body)) { + chunked = true + } + }) + } + + return chunked +} + +Multipart.prototype.setHeaders = function (chunked) { + var self = this + + if (chunked && !self.request.hasHeader('transfer-encoding')) { + self.request.setHeader('transfer-encoding', 'chunked') + } + + var header = self.request.getHeader('content-type') + + if (!header || header.indexOf('multipart') === -1) { + self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary) + } else { + if (header.indexOf('boundary') !== -1) { + self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1') + } else { + self.request.setHeader('content-type', header + '; boundary=' + self.boundary) + } + } +} + +Multipart.prototype.build = function (parts, chunked) { + var self = this + var body = chunked ? new CombinedStream() : [] + + function add (part) { + if (typeof part === 'number') { + part = part.toString() + } + return chunked ? body.append(part) : body.push(Buffer.from(part)) + } + + if (self.request.preambleCRLF) { + add('\r\n') + } + + parts.forEach(function (part) { + var preamble = '--' + self.boundary + '\r\n' + Object.keys(part).forEach(function (key) { + if (key === 'body') { return } + preamble += key + ': ' + part[key] + '\r\n' + }) + preamble += '\r\n' + add(preamble) + add(part.body) + add('\r\n') + }) + add('--' + self.boundary + '--') + + if (self.request.postambleCRLF) { + add('\r\n') + } + + return body +} + +Multipart.prototype.onRequest = function (options) { + var self = this + + var chunked = self.isChunked(options) + var parts = options.data || options + + self.setHeaders(chunked) + self.chunked = chunked + self.body = self.build(parts, chunked) +} + +exports.Multipart = Multipart diff --git a/packages/字体精简工具/node_modules/request/lib/oauth.js b/packages/字体精简工具/node_modules/request/lib/oauth.js new file mode 100644 index 0000000..96de72b --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/oauth.js @@ -0,0 +1,148 @@ +'use strict' + +var url = require('url') +var qs = require('qs') +var caseless = require('caseless') +var uuid = require('uuid/v4') +var oauth = require('oauth-sign') +var crypto = require('crypto') +var Buffer = require('safe-buffer').Buffer + +function OAuth (request) { + this.request = request + this.params = null +} + +OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) { + var oa = {} + for (var i in _oauth) { + oa['oauth_' + i] = _oauth[i] + } + if (!oa.oauth_version) { + oa.oauth_version = '1.0' + } + if (!oa.oauth_timestamp) { + oa.oauth_timestamp = Math.floor(Date.now() / 1000).toString() + } + if (!oa.oauth_nonce) { + oa.oauth_nonce = uuid().replace(/-/g, '') + } + if (!oa.oauth_signature_method) { + oa.oauth_signature_method = 'HMAC-SHA1' + } + + var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key // eslint-disable-line camelcase + delete oa.oauth_consumer_secret + delete oa.oauth_private_key + + var token_secret = oa.oauth_token_secret // eslint-disable-line camelcase + delete oa.oauth_token_secret + + var realm = oa.oauth_realm + delete oa.oauth_realm + delete oa.oauth_transport_method + + var baseurl = uri.protocol + '//' + uri.host + uri.pathname + var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&')) + + oa.oauth_signature = oauth.sign( + oa.oauth_signature_method, + method, + baseurl, + params, + consumer_secret_or_private_key, // eslint-disable-line camelcase + token_secret // eslint-disable-line camelcase + ) + + if (realm) { + oa.realm = realm + } + + return oa +} + +OAuth.prototype.buildBodyHash = function (_oauth, body) { + if (['HMAC-SHA1', 'RSA-SHA1'].indexOf(_oauth.signature_method || 'HMAC-SHA1') < 0) { + this.request.emit('error', new Error('oauth: ' + _oauth.signature_method + + ' signature_method not supported with body_hash signing.')) + } + + var shasum = crypto.createHash('sha1') + shasum.update(body || '') + var sha1 = shasum.digest('hex') + + return Buffer.from(sha1, 'hex').toString('base64') +} + +OAuth.prototype.concatParams = function (oa, sep, wrap) { + wrap = wrap || '' + + var params = Object.keys(oa).filter(function (i) { + return i !== 'realm' && i !== 'oauth_signature' + }).sort() + + if (oa.realm) { + params.splice(0, 0, 'realm') + } + params.push('oauth_signature') + + return params.map(function (i) { + return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap + }).join(sep) +} + +OAuth.prototype.onRequest = function (_oauth) { + var self = this + self.params = _oauth + + var uri = self.request.uri || {} + var method = self.request.method || '' + var headers = caseless(self.request.headers) + var body = self.request.body || '' + var qsLib = self.request.qsLib || qs + + var form + var query + var contentType = headers.get('content-type') || '' + var formContentType = 'application/x-www-form-urlencoded' + var transport = _oauth.transport_method || 'header' + + if (contentType.slice(0, formContentType.length) === formContentType) { + contentType = formContentType + form = body + } + if (uri.query) { + query = uri.query + } + if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) { + self.request.emit('error', new Error('oauth: transport_method of body requires POST ' + + 'and content-type ' + formContentType)) + } + + if (!form && typeof _oauth.body_hash === 'boolean') { + _oauth.body_hash = self.buildBodyHash(_oauth, self.request.body.toString()) + } + + var oa = self.buildParams(_oauth, uri, method, query, form, qsLib) + + switch (transport) { + case 'header': + self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '"')) + break + + case 'query': + var href = self.request.uri.href += (query ? '&' : '?') + self.concatParams(oa, '&') + self.request.uri = url.parse(href) + self.request.path = self.request.uri.path + break + + case 'body': + self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&') + break + + default: + self.request.emit('error', new Error('oauth: transport_method invalid')) + } +} + +exports.OAuth = OAuth diff --git a/packages/字体精简工具/node_modules/request/lib/querystring.js b/packages/字体精简工具/node_modules/request/lib/querystring.js new file mode 100644 index 0000000..4a32cd1 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/querystring.js @@ -0,0 +1,50 @@ +'use strict' + +var qs = require('qs') +var querystring = require('querystring') + +function Querystring (request) { + this.request = request + this.lib = null + this.useQuerystring = null + this.parseOptions = null + this.stringifyOptions = null +} + +Querystring.prototype.init = function (options) { + if (this.lib) { return } + + this.useQuerystring = options.useQuerystring + this.lib = (this.useQuerystring ? querystring : qs) + + this.parseOptions = options.qsParseOptions || {} + this.stringifyOptions = options.qsStringifyOptions || {} +} + +Querystring.prototype.stringify = function (obj) { + return (this.useQuerystring) + ? this.rfc3986(this.lib.stringify(obj, + this.stringifyOptions.sep || null, + this.stringifyOptions.eq || null, + this.stringifyOptions)) + : this.lib.stringify(obj, this.stringifyOptions) +} + +Querystring.prototype.parse = function (str) { + return (this.useQuerystring) + ? this.lib.parse(str, + this.parseOptions.sep || null, + this.parseOptions.eq || null, + this.parseOptions) + : this.lib.parse(str, this.parseOptions) +} + +Querystring.prototype.rfc3986 = function (str) { + return str.replace(/[!'()*]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) +} + +Querystring.prototype.unescape = querystring.unescape + +exports.Querystring = Querystring diff --git a/packages/字体精简工具/node_modules/request/lib/redirect.js b/packages/字体精简工具/node_modules/request/lib/redirect.js new file mode 100644 index 0000000..b9150e7 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/redirect.js @@ -0,0 +1,154 @@ +'use strict' + +var url = require('url') +var isUrl = /^https?:/ + +function Redirect (request) { + this.request = request + this.followRedirect = true + this.followRedirects = true + this.followAllRedirects = false + this.followOriginalHttpMethod = false + this.allowRedirect = function () { return true } + this.maxRedirects = 10 + this.redirects = [] + this.redirectsFollowed = 0 + this.removeRefererHeader = false +} + +Redirect.prototype.onRequest = function (options) { + var self = this + + if (options.maxRedirects !== undefined) { + self.maxRedirects = options.maxRedirects + } + if (typeof options.followRedirect === 'function') { + self.allowRedirect = options.followRedirect + } + if (options.followRedirect !== undefined) { + self.followRedirects = !!options.followRedirect + } + if (options.followAllRedirects !== undefined) { + self.followAllRedirects = options.followAllRedirects + } + if (self.followRedirects || self.followAllRedirects) { + self.redirects = self.redirects || [] + } + if (options.removeRefererHeader !== undefined) { + self.removeRefererHeader = options.removeRefererHeader + } + if (options.followOriginalHttpMethod !== undefined) { + self.followOriginalHttpMethod = options.followOriginalHttpMethod + } +} + +Redirect.prototype.redirectTo = function (response) { + var self = this + var request = self.request + + var redirectTo = null + if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) { + var location = response.caseless.get('location') + request.debug('redirect', location) + + if (self.followAllRedirects) { + redirectTo = location + } else if (self.followRedirects) { + switch (request.method) { + case 'PATCH': + case 'PUT': + case 'POST': + case 'DELETE': + // Do not follow redirects + break + default: + redirectTo = location + break + } + } + } else if (response.statusCode === 401) { + var authHeader = request._auth.onResponse(response) + if (authHeader) { + request.setHeader('authorization', authHeader) + redirectTo = request.uri + } + } + return redirectTo +} + +Redirect.prototype.onResponse = function (response) { + var self = this + var request = self.request + + var redirectTo = self.redirectTo(response) + if (!redirectTo || !self.allowRedirect.call(request, response)) { + return false + } + + request.debug('redirect to', redirectTo) + + // ignore any potential response body. it cannot possibly be useful + // to us at this point. + // response.resume should be defined, but check anyway before calling. Workaround for browserify. + if (response.resume) { + response.resume() + } + + if (self.redirectsFollowed >= self.maxRedirects) { + request.emit('error', new Error('Exceeded maxRedirects. Probably stuck in a redirect loop ' + request.uri.href)) + return false + } + self.redirectsFollowed += 1 + + if (!isUrl.test(redirectTo)) { + redirectTo = url.resolve(request.uri.href, redirectTo) + } + + var uriPrev = request.uri + request.uri = url.parse(redirectTo) + + // handle the case where we change protocol from https to http or vice versa + if (request.uri.protocol !== uriPrev.protocol) { + delete request.agent + } + + self.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo }) + + if (self.followAllRedirects && request.method !== 'HEAD' && + response.statusCode !== 401 && response.statusCode !== 307) { + request.method = self.followOriginalHttpMethod ? request.method : 'GET' + } + // request.method = 'GET' // Force all redirects to use GET || commented out fixes #215 + delete request.src + delete request.req + delete request._started + if (response.statusCode !== 401 && response.statusCode !== 307) { + // Remove parameters from the previous response, unless this is the second request + // for a server that requires digest authentication. + delete request.body + delete request._form + if (request.headers) { + request.removeHeader('host') + request.removeHeader('content-type') + request.removeHeader('content-length') + if (request.uri.hostname !== request.originalHost.split(':')[0]) { + // Remove authorization if changing hostnames (but not if just + // changing ports or protocols). This matches the behavior of curl: + // https://github.com/bagder/curl/blob/6beb0eee/lib/http.c#L710 + request.removeHeader('authorization') + } + } + } + + if (!self.removeRefererHeader) { + request.setHeader('referer', uriPrev.href) + } + + request.emit('redirect') + + request.init() + + return true +} + +exports.Redirect = Redirect diff --git a/packages/字体精简工具/node_modules/request/lib/tunnel.js b/packages/字体精简工具/node_modules/request/lib/tunnel.js new file mode 100644 index 0000000..4479003 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/lib/tunnel.js @@ -0,0 +1,175 @@ +'use strict' + +var url = require('url') +var tunnel = require('tunnel-agent') + +var defaultProxyHeaderWhiteList = [ + 'accept', + 'accept-charset', + 'accept-encoding', + 'accept-language', + 'accept-ranges', + 'cache-control', + 'content-encoding', + 'content-language', + 'content-location', + 'content-md5', + 'content-range', + 'content-type', + 'connection', + 'date', + 'expect', + 'max-forwards', + 'pragma', + 'referer', + 'te', + 'user-agent', + 'via' +] + +var defaultProxyHeaderExclusiveList = [ + 'proxy-authorization' +] + +function constructProxyHost (uriObject) { + var port = uriObject.port + var protocol = uriObject.protocol + var proxyHost = uriObject.hostname + ':' + + if (port) { + proxyHost += port + } else if (protocol === 'https:') { + proxyHost += '443' + } else { + proxyHost += '80' + } + + return proxyHost +} + +function constructProxyHeaderWhiteList (headers, proxyHeaderWhiteList) { + var whiteList = proxyHeaderWhiteList + .reduce(function (set, header) { + set[header.toLowerCase()] = true + return set + }, {}) + + return Object.keys(headers) + .filter(function (header) { + return whiteList[header.toLowerCase()] + }) + .reduce(function (set, header) { + set[header] = headers[header] + return set + }, {}) +} + +function constructTunnelOptions (request, proxyHeaders) { + var proxy = request.proxy + + var tunnelOptions = { + proxy: { + host: proxy.hostname, + port: +proxy.port, + proxyAuth: proxy.auth, + headers: proxyHeaders + }, + headers: request.headers, + ca: request.ca, + cert: request.cert, + key: request.key, + passphrase: request.passphrase, + pfx: request.pfx, + ciphers: request.ciphers, + rejectUnauthorized: request.rejectUnauthorized, + secureOptions: request.secureOptions, + secureProtocol: request.secureProtocol + } + + return tunnelOptions +} + +function constructTunnelFnName (uri, proxy) { + var uriProtocol = (uri.protocol === 'https:' ? 'https' : 'http') + var proxyProtocol = (proxy.protocol === 'https:' ? 'Https' : 'Http') + return [uriProtocol, proxyProtocol].join('Over') +} + +function getTunnelFn (request) { + var uri = request.uri + var proxy = request.proxy + var tunnelFnName = constructTunnelFnName(uri, proxy) + return tunnel[tunnelFnName] +} + +function Tunnel (request) { + this.request = request + this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList + this.proxyHeaderExclusiveList = [] + if (typeof request.tunnel !== 'undefined') { + this.tunnelOverride = request.tunnel + } +} + +Tunnel.prototype.isEnabled = function () { + var self = this + var request = self.request + // Tunnel HTTPS by default. Allow the user to override this setting. + + // If self.tunnelOverride is set (the user specified a value), use it. + if (typeof self.tunnelOverride !== 'undefined') { + return self.tunnelOverride + } + + // If the destination is HTTPS, tunnel. + if (request.uri.protocol === 'https:') { + return true + } + + // Otherwise, do not use tunnel. + return false +} + +Tunnel.prototype.setup = function (options) { + var self = this + var request = self.request + + options = options || {} + + if (typeof request.proxy === 'string') { + request.proxy = url.parse(request.proxy) + } + + if (!request.proxy || !request.tunnel) { + return false + } + + // Setup Proxy Header Exclusive List and White List + if (options.proxyHeaderWhiteList) { + self.proxyHeaderWhiteList = options.proxyHeaderWhiteList + } + if (options.proxyHeaderExclusiveList) { + self.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList + } + + var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList) + var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList) + + // Setup Proxy Headers and Proxy Headers Host + // Only send the Proxy White Listed Header names + var proxyHeaders = constructProxyHeaderWhiteList(request.headers, proxyHeaderWhiteList) + proxyHeaders.host = constructProxyHost(request.uri) + + proxyHeaderExclusiveList.forEach(request.removeHeader, request) + + // Set Agent from Tunnel Data + var tunnelFn = getTunnelFn(request) + var tunnelOptions = constructTunnelOptions(request, proxyHeaders) + request.agent = tunnelFn(tunnelOptions) + + return true +} + +Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList +Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList +exports.Tunnel = Tunnel diff --git a/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid b/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid new file mode 100644 index 0000000..9af3844 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid @@ -0,0 +1,15 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../uuid/bin/uuid" "$@" + ret=$? +else + node "$basedir/../uuid/bin/uuid" "$@" + ret=$? +fi +exit $ret diff --git a/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid.cmd b/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid.cmd new file mode 100644 index 0000000..8154f4e --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid.cmd @@ -0,0 +1,17 @@ +@ECHO off +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +"%_prog%" "%dp0%\..\uuid\bin\uuid" %* +ENDLOCAL +EXIT /b %errorlevel% +:find_dp0 +SET dp0=%~dp0 +EXIT /b diff --git a/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid.ps1 b/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid.ps1 new file mode 100644 index 0000000..3fcb264 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/.bin/uuid.ps1 @@ -0,0 +1,18 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + & "$basedir/node$exe" "$basedir/../uuid/bin/uuid" $args + $ret=$LASTEXITCODE +} else { + & "node$exe" "$basedir/../uuid/bin/uuid" $args + $ret=$LASTEXITCODE +} +exit $ret diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/AUTHORS b/packages/字体精简工具/node_modules/request/node_modules/uuid/AUTHORS new file mode 100644 index 0000000..5a10523 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/AUTHORS @@ -0,0 +1,5 @@ +Robert Kieffer +Christoph Tavan +AJ ONeal +Vincent Voyer +Roman Shtylman diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/CHANGELOG.md b/packages/字体精简工具/node_modules/request/node_modules/uuid/CHANGELOG.md new file mode 100644 index 0000000..f811b8a --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/CHANGELOG.md @@ -0,0 +1,119 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [3.4.0](https://github.com/uuidjs/uuid/compare/v3.3.3...v3.4.0) (2020-01-16) + + +### Features + +* rename repository to github:uuidjs/uuid ([#351](https://github.com/uuidjs/uuid/issues/351)) ([e2d7314](https://github.com/uuidjs/uuid/commit/e2d7314)), closes [#338](https://github.com/uuidjs/uuid/issues/338) + +### [3.3.3](https://github.com/uuidjs/uuid/compare/v3.3.2...v3.3.3) (2019-08-19) + + +## [3.3.2](https://github.com/uuidjs/uuid/compare/v3.3.1...v3.3.2) (2018-06-28) + + +### Bug Fixes + +* typo ([305d877](https://github.com/uuidjs/uuid/commit/305d877)) + + + + +## [3.3.1](https://github.com/uuidjs/uuid/compare/v3.3.0...v3.3.1) (2018-06-28) + + +### Bug Fixes + +* fix [#284](https://github.com/uuidjs/uuid/issues/284) by setting function name in try-catch ([f2a60f2](https://github.com/uuidjs/uuid/commit/f2a60f2)) + + + + +# [3.3.0](https://github.com/uuidjs/uuid/compare/v3.2.1...v3.3.0) (2018-06-22) + + +### Bug Fixes + +* assignment to readonly property to allow running in strict mode ([#270](https://github.com/uuidjs/uuid/issues/270)) ([d062fdc](https://github.com/uuidjs/uuid/commit/d062fdc)) +* fix [#229](https://github.com/uuidjs/uuid/issues/229) ([c9684d4](https://github.com/uuidjs/uuid/commit/c9684d4)) +* Get correct version of IE11 crypto ([#274](https://github.com/uuidjs/uuid/issues/274)) ([153d331](https://github.com/uuidjs/uuid/commit/153d331)) +* mem issue when generating uuid ([#267](https://github.com/uuidjs/uuid/issues/267)) ([c47702c](https://github.com/uuidjs/uuid/commit/c47702c)) + +### Features + +* enforce Conventional Commit style commit messages ([#282](https://github.com/uuidjs/uuid/issues/282)) ([cc9a182](https://github.com/uuidjs/uuid/commit/cc9a182)) + + + +## [3.2.1](https://github.com/uuidjs/uuid/compare/v3.2.0...v3.2.1) (2018-01-16) + + +### Bug Fixes + +* use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b)) + + + + +# [3.2.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.2.0) (2018-01-16) + + +### Bug Fixes + +* remove mistakenly added typescript dependency, rollback version (standard-version will auto-increment) ([09fa824](https://github.com/uuidjs/uuid/commit/09fa824)) +* use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b)) + + +### Features + +* Add v3 Support ([#217](https://github.com/uuidjs/uuid/issues/217)) ([d94f726](https://github.com/uuidjs/uuid/commit/d94f726)) + + +# [3.1.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.0.1) (2017-06-17) + +### Bug Fixes + +* (fix) Add .npmignore file to exclude test/ and other non-essential files from packing. (#183) +* Fix typo (#178) +* Simple typo fix (#165) + +### Features +* v5 support in CLI (#197) +* V5 support (#188) + + +# 3.0.1 (2016-11-28) + +* split uuid versions into separate files + + +# 3.0.0 (2016-11-17) + +* remove .parse and .unparse + + +# 2.0.0 + +* Removed uuid.BufferClass + + +# 1.4.0 + +* Improved module context detection +* Removed public RNG functions + + +# 1.3.2 + +* Improve tests and handling of v1() options (Issue #24) +* Expose RNG option to allow for perf testing with different generators + + +# 1.3.0 + +* Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)! +* Support for node.js crypto API +* De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/LICENSE.md b/packages/字体精简工具/node_modules/request/node_modules/uuid/LICENSE.md new file mode 100644 index 0000000..8c84e39 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/README.md b/packages/字体精简工具/node_modules/request/node_modules/uuid/README.md new file mode 100644 index 0000000..1752e47 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/README.md @@ -0,0 +1,276 @@ + + +# uuid [![Build Status](https://secure.travis-ci.org/kelektiv/node-uuid.svg?branch=master)](http://travis-ci.org/kelektiv/node-uuid) # + +Simple, fast generation of [RFC4122](http://www.ietf.org/rfc/rfc4122.txt) UUIDS. + +Features: + +* Support for version 1, 3, 4 and 5 UUIDs +* Cross-platform +* Uses cryptographically-strong random number APIs (when available) +* Zero-dependency, small footprint (... but not [this small](https://gist.github.com/982883)) + +[**Deprecation warning**: The use of `require('uuid')` is deprecated and will not be +supported after version 3.x of this module. Instead, use `require('uuid/[v1|v3|v4|v5]')` as shown in the examples below.] + +## Quickstart - CommonJS (Recommended) + +```shell +npm install uuid +``` + +Then generate your uuid version of choice ... + +Version 1 (timestamp): + +```javascript +const uuidv1 = require('uuid/v1'); +uuidv1(); // ⇨ '2c5ea4c0-4067-11e9-8bad-9b1deb4d3b7d' + +``` + +Version 3 (namespace): + +```javascript +const uuidv3 = require('uuid/v3'); + +// ... using predefined DNS namespace (for domain names) +uuidv3('hello.example.com', uuidv3.DNS); // ⇨ '9125a8dc-52ee-365b-a5aa-81b0b3681cf6' + +// ... using predefined URL namespace (for, well, URLs) +uuidv3('http://example.com/hello', uuidv3.URL); // ⇨ 'c6235813-3ba4-3801-ae84-e0a6ebb7d138' + +// ... using a custom namespace +// +// Note: Custom namespaces should be a UUID string specific to your application! +// E.g. the one here was generated using this modules `uuid` CLI. +const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341'; +uuidv3('Hello, World!', MY_NAMESPACE); // ⇨ 'e8b5a51d-11c8-3310-a6ab-367563f20686' + +``` + +Version 4 (random): + +```javascript +const uuidv4 = require('uuid/v4'); +uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed' + +``` + +Version 5 (namespace): + +```javascript +const uuidv5 = require('uuid/v5'); + +// ... using predefined DNS namespace (for domain names) +uuidv5('hello.example.com', uuidv5.DNS); // ⇨ 'fdda765f-fc57-5604-a269-52a7df8164ec' + +// ... using predefined URL namespace (for, well, URLs) +uuidv5('http://example.com/hello', uuidv5.URL); // ⇨ '3bbcee75-cecc-5b56-8031-b6641c1ed1f1' + +// ... using a custom namespace +// +// Note: Custom namespaces should be a UUID string specific to your application! +// E.g. the one here was generated using this modules `uuid` CLI. +const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341'; +uuidv5('Hello, World!', MY_NAMESPACE); // ⇨ '630eb68f-e0fa-5ecc-887a-7c7a62614681' + +``` + +## API + +### Version 1 + +```javascript +const uuidv1 = require('uuid/v1'); + +// Incantations +uuidv1(); +uuidv1(options); +uuidv1(options, buffer, offset); +``` + +Generate and return a RFC4122 v1 (timestamp-based) UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + + * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID. See note 1. + * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence. Default: An internally maintained clockseq is used. + * `msecs` - (Number) Time in milliseconds since unix Epoch. Default: The current time is used. + * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2. + +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Note: The default [node id](https://tools.ietf.org/html/rfc4122#section-4.1.6) (the last 12 digits in the UUID) is generated once, randomly, on process startup, and then remains unchanged for the duration of the process. + +Example: Generate string UUID with fully-specified options + +```javascript +const v1options = { + node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab], + clockseq: 0x1234, + msecs: new Date('2011-11-01').getTime(), + nsecs: 5678 +}; +uuidv1(v1options); // ⇨ '710b962e-041c-11e1-9234-0123456789ab' + +``` + +Example: In-place generation of two binary IDs + +```javascript +// Generate two ids in an array +const arr = new Array(); +uuidv1(null, arr, 0); // ⇨ + // [ + // 44, 94, 164, 192, 64, 103, + // 17, 233, 146, 52, 155, 29, + // 235, 77, 59, 125 + // ] +uuidv1(null, arr, 16); // ⇨ + // [ + // 44, 94, 164, 192, 64, 103, 17, 233, + // 146, 52, 155, 29, 235, 77, 59, 125, + // 44, 94, 164, 193, 64, 103, 17, 233, + // 146, 52, 155, 29, 235, 77, 59, 125 + // ] + +``` + +### Version 3 + +```javascript +const uuidv3 = require('uuid/v3'); + +// Incantations +uuidv3(name, namespace); +uuidv3(name, namespace, buffer); +uuidv3(name, namespace, buffer, offset); +``` + +Generate and return a RFC4122 v3 UUID. + +* `name` - (String | Array[]) "name" to create UUID with +* `namespace` - (String | Array[]) "namespace" UUID either as a String or Array[16] of byte values +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. Default = 0 + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: + +```javascript +uuidv3('hello world', MY_NAMESPACE); // ⇨ '042ffd34-d989-321c-ad06-f60826172424' + +``` + +### Version 4 + +```javascript +const uuidv4 = require('uuid/v4') + +// Incantations +uuidv4(); +uuidv4(options); +uuidv4(options, buffer, offset); +``` + +Generate and return a RFC4122 v4 UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values + * `rng` - (Function) Random # generator function that returns an Array[16] of byte values (0-255) +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: Generate string UUID with predefined `random` values + +```javascript +const v4options = { + random: [ + 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea, + 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36 + ] +}; +uuidv4(v4options); // ⇨ '109156be-c4fb-41ea-b1b4-efe1671c5836' + +``` + +Example: Generate two IDs in a single buffer + +```javascript +const buffer = new Array(); +uuidv4(null, buffer, 0); // ⇨ + // [ + // 155, 29, 235, 77, 59, + // 125, 75, 173, 155, 221, + // 43, 13, 123, 61, 203, + // 109 + // ] +uuidv4(null, buffer, 16); // ⇨ + // [ + // 155, 29, 235, 77, 59, 125, 75, 173, + // 155, 221, 43, 13, 123, 61, 203, 109, + // 27, 157, 107, 205, 187, 253, 75, 45, + // 155, 93, 171, 141, 251, 189, 75, 237 + // ] + +``` + +### Version 5 + +```javascript +const uuidv5 = require('uuid/v5'); + +// Incantations +uuidv5(name, namespace); +uuidv5(name, namespace, buffer); +uuidv5(name, namespace, buffer, offset); +``` + +Generate and return a RFC4122 v5 UUID. + +* `name` - (String | Array[]) "name" to create UUID with +* `namespace` - (String | Array[]) "namespace" UUID either as a String or Array[16] of byte values +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. Default = 0 + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: + +```javascript +uuidv5('hello world', MY_NAMESPACE); // ⇨ '9f282611-e0fd-5650-8953-89c8e342da0b' + +``` + +## Command Line + +UUIDs can be generated from the command line with the `uuid` command. + +```shell +$ uuid +ddeb27fb-d9a0-4624-be4d-4615062daed4 + +$ uuid v1 +02d37060-d446-11e7-a9fa-7bdae751ebe1 +``` + +Type `uuid --help` for usage details + +## Testing + +```shell +npm test +``` + +---- +Markdown generated from [README_js.md](README_js.md) by [![RunMD Logo](http://i.imgur.com/h0FVyzU.png)](https://github.com/broofa/runmd) \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/bin/uuid b/packages/字体精简工具/node_modules/request/node_modules/uuid/bin/uuid new file mode 100644 index 0000000..502626e --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/bin/uuid @@ -0,0 +1,65 @@ +#!/usr/bin/env node +var assert = require('assert'); + +function usage() { + console.log('Usage:'); + console.log(' uuid'); + console.log(' uuid v1'); + console.log(' uuid v3 '); + console.log(' uuid v4'); + console.log(' uuid v5 '); + console.log(' uuid --help'); + console.log('\nNote: may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122'); +} + +var args = process.argv.slice(2); + +if (args.indexOf('--help') >= 0) { + usage(); + process.exit(0); +} +var version = args.shift() || 'v4'; + +switch (version) { + case 'v1': + var uuidV1 = require('../v1'); + console.log(uuidV1()); + break; + + case 'v3': + var uuidV3 = require('../v3'); + + var name = args.shift(); + var namespace = args.shift(); + assert(name != null, 'v3 name not specified'); + assert(namespace != null, 'v3 namespace not specified'); + + if (namespace == 'URL') namespace = uuidV3.URL; + if (namespace == 'DNS') namespace = uuidV3.DNS; + + console.log(uuidV3(name, namespace)); + break; + + case 'v4': + var uuidV4 = require('../v4'); + console.log(uuidV4()); + break; + + case 'v5': + var uuidV5 = require('../v5'); + + var name = args.shift(); + var namespace = args.shift(); + assert(name != null, 'v5 name not specified'); + assert(namespace != null, 'v5 namespace not specified'); + + if (namespace == 'URL') namespace = uuidV5.URL; + if (namespace == 'DNS') namespace = uuidV5.DNS; + + console.log(uuidV5(name, namespace)); + break; + + default: + usage(); + process.exit(1); +} diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/index.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/index.js new file mode 100644 index 0000000..e96791a --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/index.js @@ -0,0 +1,8 @@ +var v1 = require('./v1'); +var v4 = require('./v4'); + +var uuid = v4; +uuid.v1 = v1; +uuid.v4 = v4; + +module.exports = uuid; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/bytesToUuid.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/bytesToUuid.js new file mode 100644 index 0000000..24b6041 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/bytesToUuid.js @@ -0,0 +1,26 @@ +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ +var byteToHex = []; +for (var i = 0; i < 256; ++i) { + byteToHex[i] = (i + 0x100).toString(16).substr(1); +} + +function bytesToUuid(buf, offset) { + var i = offset || 0; + var bth = byteToHex; + // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4 + return ([ + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], '-', + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]], + bth[buf[i++]], bth[buf[i++]] + ]).join(''); +} + +module.exports = bytesToUuid; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/md5-browser.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/md5-browser.js new file mode 100644 index 0000000..9b3b6c7 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/md5-browser.js @@ -0,0 +1,216 @@ +/* + * Browser-compatible JavaScript MD5 + * + * Modification of JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +'use strict'; + +function md5(bytes) { + if (typeof(bytes) == 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + bytes = new Array(msg.length); + for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i); + } + + return md5ToHexEncodedArray( + wordsToMd5( + bytesToWords(bytes) + , bytes.length * 8) + ); +} + + +/* +* Convert an array of little-endian words to an array of bytes +*/ +function md5ToHexEncodedArray(input) { + var i; + var x; + var output = []; + var length32 = input.length * 32; + var hexTab = '0123456789abcdef'; + var hex; + + for (i = 0; i < length32; i += 8) { + x = (input[i >> 5] >>> (i % 32)) & 0xFF; + + hex = parseInt(hexTab.charAt((x >>> 4) & 0x0F) + hexTab.charAt(x & 0x0F), 16); + + output.push(hex); + } + return output; +} + +/* +* Calculate the MD5 of an array of little-endian words, and a bit length. +*/ +function wordsToMd5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var i; + var olda; + var oldb; + var oldc; + var oldd; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + + var d = 271733878; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + return [a, b, c, d]; +} + +/* +* Convert an array bytes to an array of little-endian words +* Characters >255 have their high-byte silently ignored. +*/ +function bytesToWords(input) { + var i; + var output = []; + output[(input.length >> 2) - 1] = undefined; + for (i = 0; i < output.length; i += 1) { + output[i] = 0; + } + var length8 = input.length * 8; + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input[(i / 8)] & 0xFF) << (i % 32); + } + + return output; +} + +/* +* Add integers, wrapping at 2^32. This uses 16-bit operations internally +* to work around bugs in some JS interpreters. +*/ +function safeAdd(x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* +* Bitwise rotate a 32-bit number to the left. +*/ +function bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* +* These functions implement the four basic operations the algorithm uses. +*/ +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} +function md5ff(a, b, c, d, x, s, t) { + return md5cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5gg(a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +module.exports = md5; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/md5.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/md5.js new file mode 100644 index 0000000..7044b87 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/md5.js @@ -0,0 +1,25 @@ +'use strict'; + +var crypto = require('crypto'); + +function md5(bytes) { + if (typeof Buffer.from === 'function') { + // Modern Buffer API + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + } else { + // Pre-v4 Buffer API + if (Array.isArray(bytes)) { + bytes = new Buffer(bytes); + } else if (typeof bytes === 'string') { + bytes = new Buffer(bytes, 'utf8'); + } + } + + return crypto.createHash('md5').update(bytes).digest(); +} + +module.exports = md5; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/rng-browser.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/rng-browser.js new file mode 100644 index 0000000..6361fb8 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/rng-browser.js @@ -0,0 +1,34 @@ +// Unique ID creation requires a high quality random # generator. In the +// browser this is a little complicated due to unknown quality of Math.random() +// and inconsistent support for the `crypto` API. We do the best we can via +// feature-detection + +// getRandomValues needs to be invoked in a context where "this" is a Crypto +// implementation. Also, find the complete implementation of crypto on IE11. +var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) || + (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto)); + +if (getRandomValues) { + // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto + var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef + + module.exports = function whatwgRNG() { + getRandomValues(rnds8); + return rnds8; + }; +} else { + // Math.random()-based (RNG) + // + // If all else fails, use Math.random(). It's fast, but is of unspecified + // quality. + var rnds = new Array(16); + + module.exports = function mathRNG() { + for (var i = 0, r; i < 16; i++) { + if ((i & 0x03) === 0) r = Math.random() * 0x100000000; + rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return rnds; + }; +} diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/rng.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/rng.js new file mode 100644 index 0000000..58f0dc9 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/rng.js @@ -0,0 +1,8 @@ +// Unique ID creation requires a high quality random # generator. In node.js +// this is pretty straight-forward - we use the crypto API. + +var crypto = require('crypto'); + +module.exports = function nodeRNG() { + return crypto.randomBytes(16); +}; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/sha1-browser.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/sha1-browser.js new file mode 100644 index 0000000..5758ed7 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/sha1-browser.js @@ -0,0 +1,89 @@ +// Adapted from Chris Veness' SHA1 code at +// http://www.movable-type.co.uk/scripts/sha1.html +'use strict'; + +function f(s, x, y, z) { + switch (s) { + case 0: return (x & y) ^ (~x & z); + case 1: return x ^ y ^ z; + case 2: return (x & y) ^ (x & z) ^ (y & z); + case 3: return x ^ y ^ z; + } +} + +function ROTL(x, n) { + return (x << n) | (x>>> (32 - n)); +} + +function sha1(bytes) { + var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + + if (typeof(bytes) == 'string') { + var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape + bytes = new Array(msg.length); + for (var i = 0; i < msg.length; i++) bytes[i] = msg.charCodeAt(i); + } + + bytes.push(0x80); + + var l = bytes.length/4 + 2; + var N = Math.ceil(l/16); + var M = new Array(N); + + for (var i=0; i>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + + H[0] = (H[0] + a) >>> 0; + H[1] = (H[1] + b) >>> 0; + H[2] = (H[2] + c) >>> 0; + H[3] = (H[3] + d) >>> 0; + H[4] = (H[4] + e) >>> 0; + } + + return [ + H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, + H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, + H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, + H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, + H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff + ]; +} + +module.exports = sha1; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/sha1.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/sha1.js new file mode 100644 index 0000000..0b54b25 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/sha1.js @@ -0,0 +1,25 @@ +'use strict'; + +var crypto = require('crypto'); + +function sha1(bytes) { + if (typeof Buffer.from === 'function') { + // Modern Buffer API + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + } else { + // Pre-v4 Buffer API + if (Array.isArray(bytes)) { + bytes = new Buffer(bytes); + } else if (typeof bytes === 'string') { + bytes = new Buffer(bytes, 'utf8'); + } + } + + return crypto.createHash('sha1').update(bytes).digest(); +} + +module.exports = sha1; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/v35.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/v35.js new file mode 100644 index 0000000..8b066cc --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/lib/v35.js @@ -0,0 +1,57 @@ +var bytesToUuid = require('./bytesToUuid'); + +function uuidToBytes(uuid) { + // Note: We assume we're being passed a valid uuid string + var bytes = []; + uuid.replace(/[a-fA-F0-9]{2}/g, function(hex) { + bytes.push(parseInt(hex, 16)); + }); + + return bytes; +} + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + var bytes = new Array(str.length); + for (var i = 0; i < str.length; i++) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} + +module.exports = function(name, version, hashfunc) { + var generateUUID = function(value, namespace, buf, offset) { + var off = buf && offset || 0; + + if (typeof(value) == 'string') value = stringToBytes(value); + if (typeof(namespace) == 'string') namespace = uuidToBytes(namespace); + + if (!Array.isArray(value)) throw TypeError('value must be an array of bytes'); + if (!Array.isArray(namespace) || namespace.length !== 16) throw TypeError('namespace must be uuid string or an Array of 16 byte values'); + + // Per 4.3 + var bytes = hashfunc(namespace.concat(value)); + bytes[6] = (bytes[6] & 0x0f) | version; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + + if (buf) { + for (var idx = 0; idx < 16; ++idx) { + buf[off+idx] = bytes[idx]; + } + } + + return buf || bytesToUuid(bytes); + }; + + // Function#name is not settable on some platforms (#270) + try { + generateUUID.name = name; + } catch (err) { + } + + // Pre-defined namespaces, per Appendix C + generateUUID.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; + generateUUID.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; + + return generateUUID; +}; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/package.json b/packages/字体精简工具/node_modules/request/node_modules/uuid/package.json new file mode 100644 index 0000000..f3c6601 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/package.json @@ -0,0 +1,100 @@ +{ + "_from": "uuid@^3.3.2", + "_id": "uuid@3.4.0", + "_inBundle": false, + "_integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", + "_location": "/request/uuid", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "uuid@^3.3.2", + "name": "uuid", + "escapedName": "uuid", + "rawSpec": "^3.3.2", + "saveSpec": null, + "fetchSpec": "^3.3.2" + }, + "_requiredBy": [ + "/request" + ], + "_resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz", + "_shasum": "b23e4358afa8a202fe7a100af1f5f883f02007ee", + "_spec": "uuid@^3.3.2", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\request", + "bin": { + "uuid": "./bin/uuid" + }, + "browser": { + "./lib/rng.js": "./lib/rng-browser.js", + "./lib/sha1.js": "./lib/sha1-browser.js", + "./lib/md5.js": "./lib/md5-browser.js" + }, + "bugs": { + "url": "https://github.com/uuidjs/uuid/issues" + }, + "bundleDependencies": false, + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "contributors": [ + { + "name": "Robert Kieffer", + "email": "robert@broofa.com" + }, + { + "name": "Christoph Tavan", + "email": "dev@tavan.de" + }, + { + "name": "AJ ONeal", + "email": "coolaj86@gmail.com" + }, + { + "name": "Vincent Voyer", + "email": "vincent@zeroload.net" + }, + { + "name": "Roman Shtylman", + "email": "shtylman@gmail.com" + } + ], + "deprecated": false, + "description": "RFC4122 (v1, v4, and v5) UUIDs", + "devDependencies": { + "@commitlint/cli": "~8.2.0", + "@commitlint/config-conventional": "~8.2.0", + "eslint": "~6.4.0", + "husky": "~3.0.5", + "mocha": "6.2.0", + "runmd": "1.2.1", + "standard-version": "7.0.0" + }, + "homepage": "https://github.com/uuidjs/uuid#readme", + "husky": { + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + }, + "keywords": [ + "uuid", + "guid", + "rfc4122" + ], + "license": "MIT", + "name": "uuid", + "repository": { + "type": "git", + "url": "git+https://github.com/uuidjs/uuid.git" + }, + "scripts": { + "lint": "eslint .", + "md": "runmd --watch --output=README.md README_js.md", + "prepare": "runmd --output=README.md README_js.md", + "release": "standard-version", + "test": "npm run lint && mocha test/test.js" + }, + "version": "3.4.0" +} diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/v1.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/v1.js new file mode 100644 index 0000000..8c245de --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/v1.js @@ -0,0 +1,109 @@ +var rng = require('./lib/rng'); +var bytesToUuid = require('./lib/bytesToUuid'); + +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +var _nodeId; +var _clockseq; + +// Previous uuid creation time +var _lastMSecs = 0; +var _lastNSecs = 0; + +// See https://github.com/uuidjs/uuid for API details +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + + options = options || {}; + var node = options.node || _nodeId; + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; + + // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + if (node == null || clockseq == null) { + var seedBytes = rng(); + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [ + seedBytes[0] | 0x01, + seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5] + ]; + } + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } + + // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime(); + + // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; + + // Time since last uuid creation (in msecs) + var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; + + // Per 4.2.1.2, Bump clockseq on clock regression + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } + + // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } + + // Per 4.2.1.2 Throw error if too many uuids are requested + if (nsecs >= 10000) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + + // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + msecs += 12219292800000; + + // `time_low` + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; + + // `time_mid` + var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; + + // `time_high_and_version` + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + b[i++] = tmh >>> 16 & 0xff; + + // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + b[i++] = clockseq >>> 8 | 0x80; + + // `clock_seq_low` + b[i++] = clockseq & 0xff; + + // `node` + for (var n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf ? buf : bytesToUuid(b); +} + +module.exports = v1; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/v3.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/v3.js new file mode 100644 index 0000000..ee7e14c --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/v3.js @@ -0,0 +1,4 @@ +var v35 = require('./lib/v35.js'); +var md5 = require('./lib/md5'); + +module.exports = v35('v3', 0x30, md5); \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/v4.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/v4.js new file mode 100644 index 0000000..1f07be1 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/v4.js @@ -0,0 +1,29 @@ +var rng = require('./lib/rng'); +var bytesToUuid = require('./lib/bytesToUuid'); + +function v4(options, buf, offset) { + var i = buf && offset || 0; + + if (typeof(options) == 'string') { + buf = options === 'binary' ? new Array(16) : null; + options = null; + } + options = options || {}; + + var rnds = options.random || (options.rng || rng)(); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + + // Copy bytes to buffer, if provided + if (buf) { + for (var ii = 0; ii < 16; ++ii) { + buf[i + ii] = rnds[ii]; + } + } + + return buf || bytesToUuid(rnds); +} + +module.exports = v4; diff --git a/packages/字体精简工具/node_modules/request/node_modules/uuid/v5.js b/packages/字体精简工具/node_modules/request/node_modules/uuid/v5.js new file mode 100644 index 0000000..4945baf --- /dev/null +++ b/packages/字体精简工具/node_modules/request/node_modules/uuid/v5.js @@ -0,0 +1,3 @@ +var v35 = require('./lib/v35.js'); +var sha1 = require('./lib/sha1'); +module.exports = v35('v5', 0x50, sha1); diff --git a/packages/字体精简工具/node_modules/request/package.json b/packages/字体精简工具/node_modules/request/package.json new file mode 100644 index 0000000..3608133 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/package.json @@ -0,0 +1,115 @@ +{ + "_from": "request@^2.87.0", + "_id": "request@2.88.2", + "_inBundle": false, + "_integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", + "_location": "/request", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "request@^2.87.0", + "name": "request", + "escapedName": "request", + "rawSpec": "^2.87.0", + "saveSpec": null, + "fetchSpec": "^2.87.0" + }, + "_requiredBy": [ + "/node-gyp" + ], + "_resolved": "https://registry.nlark.com/request/download/request-2.88.2.tgz?cache=0&sync_timestamp=1618846813187&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frequest%2Fdownload%2Frequest-2.88.2.tgz", + "_shasum": "d73c918731cb5a87da047e207234146f664d12b3", + "_spec": "request@^2.87.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\node-gyp", + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com" + }, + "bugs": { + "url": "http://github.com/request/request/issues" + }, + "bundleDependencies": false, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "description": "Simplified HTTP request client.", + "devDependencies": { + "bluebird": "^3.2.1", + "browserify": "^13.0.1", + "browserify-istanbul": "^2.0.0", + "buffer-equal": "^1.0.0", + "codecov": "^3.0.4", + "coveralls": "^3.0.2", + "function-bind": "^1.0.2", + "karma": "^3.0.0", + "karma-browserify": "^5.0.1", + "karma-cli": "^1.0.0", + "karma-coverage": "^1.0.0", + "karma-phantomjs-launcher": "^1.0.0", + "karma-tap": "^3.0.1", + "nyc": "^14.1.1", + "phantomjs-prebuilt": "^2.1.3", + "rimraf": "^2.2.8", + "server-destroy": "^1.0.1", + "standard": "^9.0.0", + "tape": "^4.6.0", + "taper": "^0.5.0" + }, + "engines": { + "node": ">= 6" + }, + "files": [ + "lib/", + "index.js", + "request.js" + ], + "greenkeeper": { + "ignore": [ + "hawk", + "har-validator" + ] + }, + "homepage": "https://github.com/request/request#readme", + "keywords": [ + "http", + "simple", + "util", + "utility" + ], + "license": "Apache-2.0", + "main": "index.js", + "name": "request", + "repository": { + "type": "git", + "url": "git+https://github.com/request/request.git" + }, + "scripts": { + "lint": "standard", + "test": "npm run lint && npm run test-ci && npm run test-browser", + "test-browser": "node tests/browser/start.js", + "test-ci": "taper tests/test-*.js", + "test-cov": "nyc --reporter=lcov tape tests/test-*.js" + }, + "version": "2.88.2" +} diff --git a/packages/字体精简工具/node_modules/request/request.js b/packages/字体精简工具/node_modules/request/request.js new file mode 100644 index 0000000..198b760 --- /dev/null +++ b/packages/字体精简工具/node_modules/request/request.js @@ -0,0 +1,1553 @@ +'use strict' + +var http = require('http') +var https = require('https') +var url = require('url') +var util = require('util') +var stream = require('stream') +var zlib = require('zlib') +var aws2 = require('aws-sign2') +var aws4 = require('aws4') +var httpSignature = require('http-signature') +var mime = require('mime-types') +var caseless = require('caseless') +var ForeverAgent = require('forever-agent') +var FormData = require('form-data') +var extend = require('extend') +var isstream = require('isstream') +var isTypedArray = require('is-typedarray').strict +var helpers = require('./lib/helpers') +var cookies = require('./lib/cookies') +var getProxyFromURI = require('./lib/getProxyFromURI') +var Querystring = require('./lib/querystring').Querystring +var Har = require('./lib/har').Har +var Auth = require('./lib/auth').Auth +var OAuth = require('./lib/oauth').OAuth +var hawk = require('./lib/hawk') +var Multipart = require('./lib/multipart').Multipart +var Redirect = require('./lib/redirect').Redirect +var Tunnel = require('./lib/tunnel').Tunnel +var now = require('performance-now') +var Buffer = require('safe-buffer').Buffer + +var safeStringify = helpers.safeStringify +var isReadStream = helpers.isReadStream +var toBase64 = helpers.toBase64 +var defer = helpers.defer +var copy = helpers.copy +var version = helpers.version +var globalCookieJar = cookies.jar() + +var globalPool = {} + +function filterForNonReserved (reserved, options) { + // Filter out properties that are not reserved. + // Reserved values are passed in at call site. + + var object = {} + for (var i in options) { + var notReserved = (reserved.indexOf(i) === -1) + if (notReserved) { + object[i] = options[i] + } + } + return object +} + +function filterOutReservedFunctions (reserved, options) { + // Filter out properties that are functions and are reserved. + // Reserved values are passed in at call site. + + var object = {} + for (var i in options) { + var isReserved = !(reserved.indexOf(i) === -1) + var isFunction = (typeof options[i] === 'function') + if (!(isReserved && isFunction)) { + object[i] = options[i] + } + } + return object +} + +// Return a simpler request object to allow serialization +function requestToJSON () { + var self = this + return { + uri: self.uri, + method: self.method, + headers: self.headers + } +} + +// Return a simpler response object to allow serialization +function responseToJSON () { + var self = this + return { + statusCode: self.statusCode, + body: self.body, + headers: self.headers, + request: requestToJSON.call(self.request) + } +} + +function Request (options) { + // if given the method property in options, set property explicitMethod to true + + // extend the Request instance with any non-reserved properties + // remove any reserved functions from the options object + // set Request instance to be readable and writable + // call init + + var self = this + + // start with HAR, then override with additional options + if (options.har) { + self._har = new Har(self) + options = self._har.options(options) + } + + stream.Stream.call(self) + var reserved = Object.keys(Request.prototype) + var nonReserved = filterForNonReserved(reserved, options) + + extend(self, nonReserved) + options = filterOutReservedFunctions(reserved, options) + + self.readable = true + self.writable = true + if (options.method) { + self.explicitMethod = true + } + self._qs = new Querystring(self) + self._auth = new Auth(self) + self._oauth = new OAuth(self) + self._multipart = new Multipart(self) + self._redirect = new Redirect(self) + self._tunnel = new Tunnel(self) + self.init(options) +} + +util.inherits(Request, stream.Stream) + +// Debugging +Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG) +function debug () { + if (Request.debug) { + console.error('REQUEST %s', util.format.apply(util, arguments)) + } +} +Request.prototype.debug = debug + +Request.prototype.init = function (options) { + // init() contains all the code to setup the request object. + // the actual outgoing request is not started until start() is called + // this function is called from both the constructor and on redirect. + var self = this + if (!options) { + options = {} + } + self.headers = self.headers ? copy(self.headers) : {} + + // Delete headers with value undefined since they break + // ClientRequest.OutgoingMessage.setHeader in node 0.12 + for (var headerName in self.headers) { + if (typeof self.headers[headerName] === 'undefined') { + delete self.headers[headerName] + } + } + + caseless.httpify(self, self.headers) + + if (!self.method) { + self.method = options.method || 'GET' + } + if (!self.localAddress) { + self.localAddress = options.localAddress + } + + self._qs.init(options) + + debug(options) + if (!self.pool && self.pool !== false) { + self.pool = globalPool + } + self.dests = self.dests || [] + self.__isRequestRequest = true + + // Protect against double callback + if (!self._callback && self.callback) { + self._callback = self.callback + self.callback = function () { + if (self._callbackCalled) { + return // Print a warning maybe? + } + self._callbackCalled = true + self._callback.apply(self, arguments) + } + self.on('error', self.callback.bind()) + self.on('complete', self.callback.bind(self, null)) + } + + // People use this property instead all the time, so support it + if (!self.uri && self.url) { + self.uri = self.url + delete self.url + } + + // If there's a baseUrl, then use it as the base URL (i.e. uri must be + // specified as a relative path and is appended to baseUrl). + if (self.baseUrl) { + if (typeof self.baseUrl !== 'string') { + return self.emit('error', new Error('options.baseUrl must be a string')) + } + + if (typeof self.uri !== 'string') { + return self.emit('error', new Error('options.uri must be a string when using options.baseUrl')) + } + + if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) { + return self.emit('error', new Error('options.uri must be a path when using options.baseUrl')) + } + + // Handle all cases to make sure that there's only one slash between + // baseUrl and uri. + var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1 + var uriStartsWithSlash = self.uri.indexOf('/') === 0 + + if (baseUrlEndsWithSlash && uriStartsWithSlash) { + self.uri = self.baseUrl + self.uri.slice(1) + } else if (baseUrlEndsWithSlash || uriStartsWithSlash) { + self.uri = self.baseUrl + self.uri + } else if (self.uri === '') { + self.uri = self.baseUrl + } else { + self.uri = self.baseUrl + '/' + self.uri + } + delete self.baseUrl + } + + // A URI is needed by this point, emit error if we haven't been able to get one + if (!self.uri) { + return self.emit('error', new Error('options.uri is a required argument')) + } + + // If a string URI/URL was given, parse it into a URL object + if (typeof self.uri === 'string') { + self.uri = url.parse(self.uri) + } + + // Some URL objects are not from a URL parsed string and need href added + if (!self.uri.href) { + self.uri.href = url.format(self.uri) + } + + // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme + if (self.uri.protocol === 'unix:') { + return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`')) + } + + // Support Unix Sockets + if (self.uri.host === 'unix') { + self.enableUnixSocket() + } + + if (self.strictSSL === false) { + self.rejectUnauthorized = false + } + + if (!self.uri.pathname) { self.uri.pathname = '/' } + + if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) { + // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar + // Detect and reject it as soon as possible + var faultyUri = url.format(self.uri) + var message = 'Invalid URI "' + faultyUri + '"' + if (Object.keys(options).length === 0) { + // No option ? This can be the sign of a redirect + // As this is a case where the user cannot do anything (they didn't call request directly with this URL) + // they should be warned that it can be caused by a redirection (can save some hair) + message += '. This can be caused by a crappy redirection.' + } + // This error was fatal + self.abort() + return self.emit('error', new Error(message)) + } + + if (!self.hasOwnProperty('proxy')) { + self.proxy = getProxyFromURI(self.uri) + } + + self.tunnel = self._tunnel.isEnabled() + if (self.proxy) { + self._tunnel.setup(options) + } + + self._redirect.onRequest(options) + + self.setHost = false + if (!self.hasHeader('host')) { + var hostHeaderName = self.originalHostHeaderName || 'host' + self.setHeader(hostHeaderName, self.uri.host) + // Drop :port suffix from Host header if known protocol. + if (self.uri.port) { + if ((self.uri.port === '80' && self.uri.protocol === 'http:') || + (self.uri.port === '443' && self.uri.protocol === 'https:')) { + self.setHeader(hostHeaderName, self.uri.hostname) + } + } + self.setHost = true + } + + self.jar(self._jar || options.jar) + + if (!self.uri.port) { + if (self.uri.protocol === 'http:') { self.uri.port = 80 } else if (self.uri.protocol === 'https:') { self.uri.port = 443 } + } + + if (self.proxy && !self.tunnel) { + self.port = self.proxy.port + self.host = self.proxy.hostname + } else { + self.port = self.uri.port + self.host = self.uri.hostname + } + + if (options.form) { + self.form(options.form) + } + + if (options.formData) { + var formData = options.formData + var requestForm = self.form() + var appendFormValue = function (key, value) { + if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) { + requestForm.append(key, value.value, value.options) + } else { + requestForm.append(key, value) + } + } + for (var formKey in formData) { + if (formData.hasOwnProperty(formKey)) { + var formValue = formData[formKey] + if (formValue instanceof Array) { + for (var j = 0; j < formValue.length; j++) { + appendFormValue(formKey, formValue[j]) + } + } else { + appendFormValue(formKey, formValue) + } + } + } + } + + if (options.qs) { + self.qs(options.qs) + } + + if (self.uri.path) { + self.path = self.uri.path + } else { + self.path = self.uri.pathname + (self.uri.search || '') + } + + if (self.path.length === 0) { + self.path = '/' + } + + // Auth must happen last in case signing is dependent on other headers + if (options.aws) { + self.aws(options.aws) + } + + if (options.hawk) { + self.hawk(options.hawk) + } + + if (options.httpSignature) { + self.httpSignature(options.httpSignature) + } + + if (options.auth) { + if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) { + options.auth.user = options.auth.username + } + if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) { + options.auth.pass = options.auth.password + } + + self.auth( + options.auth.user, + options.auth.pass, + options.auth.sendImmediately, + options.auth.bearer + ) + } + + if (self.gzip && !self.hasHeader('accept-encoding')) { + self.setHeader('accept-encoding', 'gzip, deflate') + } + + if (self.uri.auth && !self.hasHeader('authorization')) { + var uriAuthPieces = self.uri.auth.split(':').map(function (item) { return self._qs.unescape(item) }) + self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true) + } + + if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) { + var proxyAuthPieces = self.proxy.auth.split(':').map(function (item) { return self._qs.unescape(item) }) + var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':')) + self.setHeader('proxy-authorization', authHeader) + } + + if (self.proxy && !self.tunnel) { + self.path = (self.uri.protocol + '//' + self.uri.host + self.path) + } + + if (options.json) { + self.json(options.json) + } + if (options.multipart) { + self.multipart(options.multipart) + } + + if (options.time) { + self.timing = true + + // NOTE: elapsedTime is deprecated in favor of .timings + self.elapsedTime = self.elapsedTime || 0 + } + + function setContentLength () { + if (isTypedArray(self.body)) { + self.body = Buffer.from(self.body) + } + + if (!self.hasHeader('content-length')) { + var length + if (typeof self.body === 'string') { + length = Buffer.byteLength(self.body) + } else if (Array.isArray(self.body)) { + length = self.body.reduce(function (a, b) { return a + b.length }, 0) + } else { + length = self.body.length + } + + if (length) { + self.setHeader('content-length', length) + } else { + self.emit('error', new Error('Argument error, options.body.')) + } + } + } + if (self.body && !isstream(self.body)) { + setContentLength() + } + + if (options.oauth) { + self.oauth(options.oauth) + } else if (self._oauth.params && self.hasHeader('authorization')) { + self.oauth(self._oauth.params) + } + + var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol + var defaultModules = {'http:': http, 'https:': https} + var httpModules = self.httpModules || {} + + self.httpModule = httpModules[protocol] || defaultModules[protocol] + + if (!self.httpModule) { + return self.emit('error', new Error('Invalid protocol: ' + protocol)) + } + + if (options.ca) { + self.ca = options.ca + } + + if (!self.agent) { + if (options.agentOptions) { + self.agentOptions = options.agentOptions + } + + if (options.agentClass) { + self.agentClass = options.agentClass + } else if (options.forever) { + var v = version() + // use ForeverAgent in node 0.10- only + if (v.major === 0 && v.minor <= 10) { + self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL + } else { + self.agentClass = self.httpModule.Agent + self.agentOptions = self.agentOptions || {} + self.agentOptions.keepAlive = true + } + } else { + self.agentClass = self.httpModule.Agent + } + } + + if (self.pool === false) { + self.agent = false + } else { + self.agent = self.agent || self.getNewAgent() + } + + self.on('pipe', function (src) { + if (self.ntick && self._started) { + self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.')) + } + self.src = src + if (isReadStream(src)) { + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', mime.lookup(src.path)) + } + } else { + if (src.headers) { + for (var i in src.headers) { + if (!self.hasHeader(i)) { + self.setHeader(i, src.headers[i]) + } + } + } + if (self._json && !self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + if (src.method && !self.explicitMethod) { + self.method = src.method + } + } + + // self.on('pipe', function () { + // console.error('You have already piped to this stream. Pipeing twice is likely to break the request.') + // }) + }) + + defer(function () { + if (self._aborted) { + return + } + + var end = function () { + if (self._form) { + if (!self._auth.hasAuth) { + self._form.pipe(self) + } else if (self._auth.hasAuth && self._auth.sentAuth) { + self._form.pipe(self) + } + } + if (self._multipart && self._multipart.chunked) { + self._multipart.body.pipe(self) + } + if (self.body) { + if (isstream(self.body)) { + self.body.pipe(self) + } else { + setContentLength() + if (Array.isArray(self.body)) { + self.body.forEach(function (part) { + self.write(part) + }) + } else { + self.write(self.body) + } + self.end() + } + } else if (self.requestBodyStream) { + console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.') + self.requestBodyStream.pipe(self) + } else if (!self.src) { + if (self._auth.hasAuth && !self._auth.sentAuth) { + self.end() + return + } + if (self.method !== 'GET' && typeof self.method !== 'undefined') { + self.setHeader('content-length', 0) + } + self.end() + } + } + + if (self._form && !self.hasHeader('content-length')) { + // Before ending the request, we had to compute the length of the whole form, asyncly + self.setHeader(self._form.getHeaders(), true) + self._form.getLength(function (err, length) { + if (!err && !isNaN(length)) { + self.setHeader('content-length', length) + } + end() + }) + } else { + end() + } + + self.ntick = true + }) +} + +Request.prototype.getNewAgent = function () { + var self = this + var Agent = self.agentClass + var options = {} + if (self.agentOptions) { + for (var i in self.agentOptions) { + options[i] = self.agentOptions[i] + } + } + if (self.ca) { + options.ca = self.ca + } + if (self.ciphers) { + options.ciphers = self.ciphers + } + if (self.secureProtocol) { + options.secureProtocol = self.secureProtocol + } + if (self.secureOptions) { + options.secureOptions = self.secureOptions + } + if (typeof self.rejectUnauthorized !== 'undefined') { + options.rejectUnauthorized = self.rejectUnauthorized + } + + if (self.cert && self.key) { + options.key = self.key + options.cert = self.cert + } + + if (self.pfx) { + options.pfx = self.pfx + } + + if (self.passphrase) { + options.passphrase = self.passphrase + } + + var poolKey = '' + + // different types of agents are in different pools + if (Agent !== self.httpModule.Agent) { + poolKey += Agent.name + } + + // ca option is only relevant if proxy or destination are https + var proxy = self.proxy + if (typeof proxy === 'string') { + proxy = url.parse(proxy) + } + var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' + + if (isHttps) { + if (options.ca) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.ca + } + + if (typeof options.rejectUnauthorized !== 'undefined') { + if (poolKey) { + poolKey += ':' + } + poolKey += options.rejectUnauthorized + } + + if (options.cert) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.cert.toString('ascii') + options.key.toString('ascii') + } + + if (options.pfx) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.pfx.toString('ascii') + } + + if (options.ciphers) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.ciphers + } + + if (options.secureProtocol) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.secureProtocol + } + + if (options.secureOptions) { + if (poolKey) { + poolKey += ':' + } + poolKey += options.secureOptions + } + } + + if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) { + // not doing anything special. Use the globalAgent + return self.httpModule.globalAgent + } + + // we're using a stored agent. Make sure it's protocol-specific + poolKey = self.uri.protocol + poolKey + + // generate a new agent for this setting if none yet exists + if (!self.pool[poolKey]) { + self.pool[poolKey] = new Agent(options) + // properly set maxSockets on new agents + if (self.pool.maxSockets) { + self.pool[poolKey].maxSockets = self.pool.maxSockets + } + } + + return self.pool[poolKey] +} + +Request.prototype.start = function () { + // start() is called once we are ready to send the outgoing HTTP request. + // this is usually called on the first write(), end() or on nextTick() + var self = this + + if (self.timing) { + // All timings will be relative to this request's startTime. In order to do this, + // we need to capture the wall-clock start time (via Date), immediately followed + // by the high-resolution timer (via now()). While these two won't be set + // at the _exact_ same time, they should be close enough to be able to calculate + // high-resolution, monotonically non-decreasing timestamps relative to startTime. + var startTime = new Date().getTime() + var startTimeNow = now() + } + + if (self._aborted) { + return + } + + self._started = true + self.method = self.method || 'GET' + self.href = self.uri.href + + if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) { + self.setHeader('content-length', self.src.stat.size) + } + if (self._aws) { + self.aws(self._aws, true) + } + + // We have a method named auth, which is completely different from the http.request + // auth option. If we don't remove it, we're gonna have a bad time. + var reqOptions = copy(self) + delete reqOptions.auth + + debug('make request', self.uri.href) + + // node v6.8.0 now supports a `timeout` value in `http.request()`, but we + // should delete it for now since we handle timeouts manually for better + // consistency with node versions before v6.8.0 + delete reqOptions.timeout + + try { + self.req = self.httpModule.request(reqOptions) + } catch (err) { + self.emit('error', err) + return + } + + if (self.timing) { + self.startTime = startTime + self.startTimeNow = startTimeNow + + // Timing values will all be relative to startTime (by comparing to startTimeNow + // so we have an accurate clock) + self.timings = {} + } + + var timeout + if (self.timeout && !self.timeoutTimer) { + if (self.timeout < 0) { + timeout = 0 + } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) { + timeout = self.timeout + } + } + + self.req.on('response', self.onRequestResponse.bind(self)) + self.req.on('error', self.onRequestError.bind(self)) + self.req.on('drain', function () { + self.emit('drain') + }) + + self.req.on('socket', function (socket) { + // `._connecting` was the old property which was made public in node v6.1.0 + var isConnecting = socket._connecting || socket.connecting + if (self.timing) { + self.timings.socket = now() - self.startTimeNow + + if (isConnecting) { + var onLookupTiming = function () { + self.timings.lookup = now() - self.startTimeNow + } + + var onConnectTiming = function () { + self.timings.connect = now() - self.startTimeNow + } + + socket.once('lookup', onLookupTiming) + socket.once('connect', onConnectTiming) + + // clean up timing event listeners if needed on error + self.req.once('error', function () { + socket.removeListener('lookup', onLookupTiming) + socket.removeListener('connect', onConnectTiming) + }) + } + } + + var setReqTimeout = function () { + // This timeout sets the amount of time to wait *between* bytes sent + // from the server once connected. + // + // In particular, it's useful for erroring if the server fails to send + // data halfway through streaming a response. + self.req.setTimeout(timeout, function () { + if (self.req) { + self.abort() + var e = new Error('ESOCKETTIMEDOUT') + e.code = 'ESOCKETTIMEDOUT' + e.connect = false + self.emit('error', e) + } + }) + } + if (timeout !== undefined) { + // Only start the connection timer if we're actually connecting a new + // socket, otherwise if we're already connected (because this is a + // keep-alive connection) do not bother. This is important since we won't + // get a 'connect' event for an already connected socket. + if (isConnecting) { + var onReqSockConnect = function () { + socket.removeListener('connect', onReqSockConnect) + self.clearTimeout() + setReqTimeout() + } + + socket.on('connect', onReqSockConnect) + + self.req.on('error', function (err) { // eslint-disable-line handle-callback-err + socket.removeListener('connect', onReqSockConnect) + }) + + // Set a timeout in memory - this block will throw if the server takes more + // than `timeout` to write the HTTP status and headers (corresponding to + // the on('response') event on the client). NB: this measures wall-clock + // time, not the time between bytes sent by the server. + self.timeoutTimer = setTimeout(function () { + socket.removeListener('connect', onReqSockConnect) + self.abort() + var e = new Error('ETIMEDOUT') + e.code = 'ETIMEDOUT' + e.connect = true + self.emit('error', e) + }, timeout) + } else { + // We're already connected + setReqTimeout() + } + } + self.emit('socket', socket) + }) + + self.emit('request', self.req) +} + +Request.prototype.onRequestError = function (error) { + var self = this + if (self._aborted) { + return + } + if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' && + self.agent.addRequestNoreuse) { + self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } + self.start() + self.req.end() + return + } + self.clearTimeout() + self.emit('error', error) +} + +Request.prototype.onRequestResponse = function (response) { + var self = this + + if (self.timing) { + self.timings.response = now() - self.startTimeNow + } + + debug('onRequestResponse', self.uri.href, response.statusCode, response.headers) + response.on('end', function () { + if (self.timing) { + self.timings.end = now() - self.startTimeNow + response.timingStart = self.startTime + + // fill in the blanks for any periods that didn't trigger, such as + // no lookup or connect due to keep alive + if (!self.timings.socket) { + self.timings.socket = 0 + } + if (!self.timings.lookup) { + self.timings.lookup = self.timings.socket + } + if (!self.timings.connect) { + self.timings.connect = self.timings.lookup + } + if (!self.timings.response) { + self.timings.response = self.timings.connect + } + + debug('elapsed time', self.timings.end) + + // elapsedTime includes all redirects + self.elapsedTime += Math.round(self.timings.end) + + // NOTE: elapsedTime is deprecated in favor of .timings + response.elapsedTime = self.elapsedTime + + // timings is just for the final fetch + response.timings = self.timings + + // pre-calculate phase timings as well + response.timingPhases = { + wait: self.timings.socket, + dns: self.timings.lookup - self.timings.socket, + tcp: self.timings.connect - self.timings.lookup, + firstByte: self.timings.response - self.timings.connect, + download: self.timings.end - self.timings.response, + total: self.timings.end + } + } + debug('response end', self.uri.href, response.statusCode, response.headers) + }) + + if (self._aborted) { + debug('aborted', self.uri.href) + response.resume() + return + } + + self.response = response + response.request = self + response.toJSON = responseToJSON + + // XXX This is different on 0.10, because SSL is strict by default + if (self.httpModule === https && + self.strictSSL && (!response.hasOwnProperty('socket') || + !response.socket.authorized)) { + debug('strict ssl error', self.uri.href) + var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL' + self.emit('error', new Error('SSL Error: ' + sslErr)) + return + } + + // Save the original host before any redirect (if it changes, we need to + // remove any authorization headers). Also remember the case of the header + // name because lots of broken servers expect Host instead of host and we + // want the caller to be able to specify this. + self.originalHost = self.getHeader('host') + if (!self.originalHostHeaderName) { + self.originalHostHeaderName = self.hasHeader('host') + } + if (self.setHost) { + self.removeHeader('host') + } + self.clearTimeout() + + var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar + var addCookie = function (cookie) { + // set the cookie if it's domain in the href's domain. + try { + targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true}) + } catch (e) { + self.emit('error', e) + } + } + + response.caseless = caseless(response.headers) + + if (response.caseless.has('set-cookie') && (!self._disableCookies)) { + var headerName = response.caseless.has('set-cookie') + if (Array.isArray(response.headers[headerName])) { + response.headers[headerName].forEach(addCookie) + } else { + addCookie(response.headers[headerName]) + } + } + + if (self._redirect.onResponse(response)) { + return // Ignore the rest of the response + } else { + // Be a good stream and emit end when the response is finished. + // Hack to emit end on close because of a core bug that never fires end + response.on('close', function () { + if (!self._ended) { + self.response.emit('end') + } + }) + + response.once('end', function () { + self._ended = true + }) + + var noBody = function (code) { + return ( + self.method === 'HEAD' || + // Informational + (code >= 100 && code < 200) || + // No Content + code === 204 || + // Not Modified + code === 304 + ) + } + + var responseContent + if (self.gzip && !noBody(response.statusCode)) { + var contentEncoding = response.headers['content-encoding'] || 'identity' + contentEncoding = contentEncoding.trim().toLowerCase() + + // Be more lenient with decoding compressed responses, since (very rarely) + // servers send slightly invalid gzip responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + var zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + } + + if (contentEncoding === 'gzip') { + responseContent = zlib.createGunzip(zlibOptions) + response.pipe(responseContent) + } else if (contentEncoding === 'deflate') { + responseContent = zlib.createInflate(zlibOptions) + response.pipe(responseContent) + } else { + // Since previous versions didn't check for Content-Encoding header, + // ignore any invalid values to preserve backwards-compatibility + if (contentEncoding !== 'identity') { + debug('ignoring unrecognized Content-Encoding ' + contentEncoding) + } + responseContent = response + } + } else { + responseContent = response + } + + if (self.encoding) { + if (self.dests.length !== 0) { + console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.') + } else { + responseContent.setEncoding(self.encoding) + } + } + + if (self._paused) { + responseContent.pause() + } + + self.responseContent = responseContent + + self.emit('response', response) + + self.dests.forEach(function (dest) { + self.pipeDest(dest) + }) + + responseContent.on('data', function (chunk) { + if (self.timing && !self.responseStarted) { + self.responseStartTime = (new Date()).getTime() + + // NOTE: responseStartTime is deprecated in favor of .timings + response.responseStartTime = self.responseStartTime + } + self._destdata = true + self.emit('data', chunk) + }) + responseContent.once('end', function (chunk) { + self.emit('end', chunk) + }) + responseContent.on('error', function (error) { + self.emit('error', error) + }) + responseContent.on('close', function () { self.emit('close') }) + + if (self.callback) { + self.readResponseBody(response) + } else { // if no callback + self.on('end', function () { + if (self._aborted) { + debug('aborted', self.uri.href) + return + } + self.emit('complete', response) + }) + } + } + debug('finish init function', self.uri.href) +} + +Request.prototype.readResponseBody = function (response) { + var self = this + debug("reading response's body") + var buffers = [] + var bufferLength = 0 + var strings = [] + + self.on('data', function (chunk) { + if (!Buffer.isBuffer(chunk)) { + strings.push(chunk) + } else if (chunk.length) { + bufferLength += chunk.length + buffers.push(chunk) + } + }) + self.on('end', function () { + debug('end event', self.uri.href) + if (self._aborted) { + debug('aborted', self.uri.href) + // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request. + // This can lead to leaky behavior if the user retains a reference to the request object. + buffers = [] + bufferLength = 0 + return + } + + if (bufferLength) { + debug('has body', self.uri.href, bufferLength) + response.body = Buffer.concat(buffers, bufferLength) + if (self.encoding !== null) { + response.body = response.body.toString(self.encoding) + } + // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request. + // This can lead to leaky behavior if the user retains a reference to the request object. + buffers = [] + bufferLength = 0 + } else if (strings.length) { + // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation. + // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse(). + if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') { + strings[0] = strings[0].substring(1) + } + response.body = strings.join('') + } + + if (self._json) { + try { + response.body = JSON.parse(response.body, self._jsonReviver) + } catch (e) { + debug('invalid JSON received', self.uri.href) + } + } + debug('emitting complete', self.uri.href) + if (typeof response.body === 'undefined' && !self._json) { + response.body = self.encoding === null ? Buffer.alloc(0) : '' + } + self.emit('complete', response, response.body) + }) +} + +Request.prototype.abort = function () { + var self = this + self._aborted = true + + if (self.req) { + self.req.abort() + } else if (self.response) { + self.response.destroy() + } + + self.clearTimeout() + self.emit('abort') +} + +Request.prototype.pipeDest = function (dest) { + var self = this + var response = self.response + // Called after the response is received + if (dest.headers && !dest.headersSent) { + if (response.caseless.has('content-type')) { + var ctname = response.caseless.has('content-type') + if (dest.setHeader) { + dest.setHeader(ctname, response.headers[ctname]) + } else { + dest.headers[ctname] = response.headers[ctname] + } + } + + if (response.caseless.has('content-length')) { + var clname = response.caseless.has('content-length') + if (dest.setHeader) { + dest.setHeader(clname, response.headers[clname]) + } else { + dest.headers[clname] = response.headers[clname] + } + } + } + if (dest.setHeader && !dest.headersSent) { + for (var i in response.headers) { + // If the response content is being decoded, the Content-Encoding header + // of the response doesn't represent the piped content, so don't pass it. + if (!self.gzip || i !== 'content-encoding') { + dest.setHeader(i, response.headers[i]) + } + } + dest.statusCode = response.statusCode + } + if (self.pipefilter) { + self.pipefilter(response, dest) + } +} + +Request.prototype.qs = function (q, clobber) { + var self = this + var base + if (!clobber && self.uri.query) { + base = self._qs.parse(self.uri.query) + } else { + base = {} + } + + for (var i in q) { + base[i] = q[i] + } + + var qs = self._qs.stringify(base) + + if (qs === '') { + return self + } + + self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs) + self.url = self.uri + self.path = self.uri.path + + if (self.uri.host === 'unix') { + self.enableUnixSocket() + } + + return self +} +Request.prototype.form = function (form) { + var self = this + if (form) { + if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { + self.setHeader('content-type', 'application/x-www-form-urlencoded') + } + self.body = (typeof form === 'string') + ? self._qs.rfc3986(form.toString('utf8')) + : self._qs.stringify(form).toString('utf8') + return self + } + // create form-data object + self._form = new FormData() + self._form.on('error', function (err) { + err.message = 'form-data: ' + err.message + self.emit('error', err) + self.abort() + }) + return self._form +} +Request.prototype.multipart = function (multipart) { + var self = this + + self._multipart.onRequest(multipart) + + if (!self._multipart.chunked) { + self.body = self._multipart.body + } + + return self +} +Request.prototype.json = function (val) { + var self = this + + if (!self.hasHeader('accept')) { + self.setHeader('accept', 'application/json') + } + + if (typeof self.jsonReplacer === 'function') { + self._jsonReplacer = self.jsonReplacer + } + + self._json = true + if (typeof val === 'boolean') { + if (self.body !== undefined) { + if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { + self.body = safeStringify(self.body, self._jsonReplacer) + } else { + self.body = self._qs.rfc3986(self.body) + } + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + } + } else { + self.body = safeStringify(val, self._jsonReplacer) + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', 'application/json') + } + } + + if (typeof self.jsonReviver === 'function') { + self._jsonReviver = self.jsonReviver + } + + return self +} +Request.prototype.getHeader = function (name, headers) { + var self = this + var result, re, match + if (!headers) { + headers = self.headers + } + Object.keys(headers).forEach(function (key) { + if (key.length !== name.length) { + return + } + re = new RegExp(name, 'i') + match = key.match(re) + if (match) { + result = headers[key] + } + }) + return result +} +Request.prototype.enableUnixSocket = function () { + // Get the socket & request paths from the URL + var unixParts = this.uri.path.split(':') + var host = unixParts[0] + var path = unixParts[1] + // Apply unix properties to request + this.socketPath = host + this.uri.pathname = path + this.uri.path = path + this.uri.host = host + this.uri.hostname = host + this.uri.isUnix = true +} + +Request.prototype.auth = function (user, pass, sendImmediately, bearer) { + var self = this + + self._auth.onRequest(user, pass, sendImmediately, bearer) + + return self +} +Request.prototype.aws = function (opts, now) { + var self = this + + if (!now) { + self._aws = opts + return self + } + + if (opts.sign_version === 4 || opts.sign_version === '4') { + // use aws4 + var options = { + host: self.uri.host, + path: self.uri.path, + method: self.method, + headers: self.headers, + body: self.body + } + if (opts.service) { + options.service = opts.service + } + var signRes = aws4.sign(options, { + accessKeyId: opts.key, + secretAccessKey: opts.secret, + sessionToken: opts.session + }) + self.setHeader('authorization', signRes.headers.Authorization) + self.setHeader('x-amz-date', signRes.headers['X-Amz-Date']) + if (signRes.headers['X-Amz-Security-Token']) { + self.setHeader('x-amz-security-token', signRes.headers['X-Amz-Security-Token']) + } + } else { + // default: use aws-sign2 + var date = new Date() + self.setHeader('date', date.toUTCString()) + var auth = { + key: opts.key, + secret: opts.secret, + verb: self.method.toUpperCase(), + date: date, + contentType: self.getHeader('content-type') || '', + md5: self.getHeader('content-md5') || '', + amazonHeaders: aws2.canonicalizeHeaders(self.headers) + } + var path = self.uri.path + if (opts.bucket && path) { + auth.resource = '/' + opts.bucket + path + } else if (opts.bucket && !path) { + auth.resource = '/' + opts.bucket + } else if (!opts.bucket && path) { + auth.resource = path + } else if (!opts.bucket && !path) { + auth.resource = '/' + } + auth.resource = aws2.canonicalizeResource(auth.resource) + self.setHeader('authorization', aws2.authorization(auth)) + } + + return self +} +Request.prototype.httpSignature = function (opts) { + var self = this + httpSignature.signRequest({ + getHeader: function (header) { + return self.getHeader(header, self.headers) + }, + setHeader: function (header, value) { + self.setHeader(header, value) + }, + method: self.method, + path: self.path + }, opts) + debug('httpSignature authorization', self.getHeader('authorization')) + + return self +} +Request.prototype.hawk = function (opts) { + var self = this + self.setHeader('Authorization', hawk.header(self.uri, self.method, opts)) +} +Request.prototype.oauth = function (_oauth) { + var self = this + + self._oauth.onRequest(_oauth) + + return self +} + +Request.prototype.jar = function (jar) { + var self = this + var cookies + + if (self._redirect.redirectsFollowed === 0) { + self.originalCookieHeader = self.getHeader('cookie') + } + + if (!jar) { + // disable cookies + cookies = false + self._disableCookies = true + } else { + var targetCookieJar = jar.getCookieString ? jar : globalCookieJar + var urihref = self.uri.href + // fetch cookie in the Specified host + if (targetCookieJar) { + cookies = targetCookieJar.getCookieString(urihref) + } + } + + // if need cookie and cookie is not empty + if (cookies && cookies.length) { + if (self.originalCookieHeader) { + // Don't overwrite existing Cookie header + self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies) + } else { + self.setHeader('cookie', cookies) + } + } + self._jar = jar + return self +} + +// Stream API +Request.prototype.pipe = function (dest, opts) { + var self = this + + if (self.response) { + if (self._destdata) { + self.emit('error', new Error('You cannot pipe after data has been emitted from the response.')) + } else if (self._ended) { + self.emit('error', new Error('You cannot pipe after the response has been ended.')) + } else { + stream.Stream.prototype.pipe.call(self, dest, opts) + self.pipeDest(dest) + return dest + } + } else { + self.dests.push(dest) + stream.Stream.prototype.pipe.call(self, dest, opts) + return dest + } +} +Request.prototype.write = function () { + var self = this + if (self._aborted) { return } + + if (!self._started) { + self.start() + } + if (self.req) { + return self.req.write.apply(self.req, arguments) + } +} +Request.prototype.end = function (chunk) { + var self = this + if (self._aborted) { return } + + if (chunk) { + self.write(chunk) + } + if (!self._started) { + self.start() + } + if (self.req) { + self.req.end() + } +} +Request.prototype.pause = function () { + var self = this + if (!self.responseContent) { + self._paused = true + } else { + self.responseContent.pause.apply(self.responseContent, arguments) + } +} +Request.prototype.resume = function () { + var self = this + if (!self.responseContent) { + self._paused = false + } else { + self.responseContent.resume.apply(self.responseContent, arguments) + } +} +Request.prototype.destroy = function () { + var self = this + this.clearTimeout() + if (!self._ended) { + self.end() + } else if (self.response) { + self.response.destroy() + } +} + +Request.prototype.clearTimeout = function () { + if (this.timeoutTimer) { + clearTimeout(this.timeoutTimer) + this.timeoutTimer = null + } +} + +Request.defaultProxyHeaderWhiteList = + Tunnel.defaultProxyHeaderWhiteList.slice() + +Request.defaultProxyHeaderExclusiveList = + Tunnel.defaultProxyHeaderExclusiveList.slice() + +// Exports + +Request.prototype.toJSON = requestToJSON +module.exports = Request diff --git a/packages/字体精简工具/node_modules/resolve-options/LICENSE b/packages/字体精简工具/node_modules/resolve-options/LICENSE new file mode 100644 index 0000000..b8fc743 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve-options/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/resolve-options/README.md b/packages/字体精简工具/node_modules/resolve-options/README.md new file mode 100644 index 0000000..60efcb3 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve-options/README.md @@ -0,0 +1,104 @@ +

+ + + +

+ +# resolve-options + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Resolve an options object based on configuration. + +## Usage + +```js +// This example assumes a Vinyl file + +var createResolver = require('resolve-options'); + +var config = { + cwd: { + type: 'string', + default: process.cwd + }, + sourcemaps: { + type: 'boolean', + default: false + }, + since: { + type: ['date', 'number'] + }, + read: { + type: 'boolean' + } +}; + +var options = { + sourcemaps: true, + since: Date.now(), + read: function(file) { + return (file.extname !== '.mp4'); + } +}; + +var resolver = createResolver(config, options); + +var cwd = resolver.resolve('cwd', file); +// cwd === process.cwd() + +var sourcemaps = resolver.resolve('sourcemaps', file); +// sourcemaps === true + +var read = resolver.resolve('read', file); +// Given .mp4, read === false +// Given .txt, read === true +``` + +## API + +### `createResolver([config,] [options])` + +Takes a `config` object that describes the options to accept/resolve and an `options` object (usually passed by a user) to resolve against the `config`. Returns a `resolver` that contains a `resolve` method for realtime resolution of options. + +The `config` object takes the following structure: +```graphql +config { + [optionKey] { + type // string, array or function + default // any value or function + } +} +``` + +Each option is represented by its `optionKey` in the `config` object. It must be an object with a `type` property. + +The `type` property must be a string, array or function which will be passed to the [`value-or-function`][value-or-function] module (functions will be bound to the resolver to allow for dependent options). + +A `default` property may also be specified as a fallback if the option isn't available or is invalid. The `default` value can be any value or a function (functions will be bound to the resolver to allow for dependent defaults). __Note:__ `default` values are not type-validated by the `value-or-function` module. + +### `resolver.resolve(optionKey, [...arguments])` + +Takes an `optionKey` string and any number of `arguments` to apply if an option is a function. Returns the resolved value for the `optionKey`. + +## License + +MIT + +[value-or-function]: https://github.com/gulpjs/value-or-function + +[downloads-image]: http://img.shields.io/npm/dm/resolve-options.svg +[npm-url]: https://npmjs.com/package/resolve-options +[npm-image]: http://img.shields.io/npm/v/resolve-options.svg + +[travis-url]: https://travis-ci.org/gulpjs/resolve-options +[travis-image]: http://img.shields.io/travis/gulpjs/resolve-options.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/resolve-options +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/resolve-options.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/resolve-options +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/resolve-options/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/packages/字体精简工具/node_modules/resolve-options/index.js b/packages/字体精简工具/node_modules/resolve-options/index.js new file mode 100644 index 0000000..21ef429 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve-options/index.js @@ -0,0 +1,111 @@ +'use strict'; + +var normalize = require('value-or-function'); + +var slice = Array.prototype.slice; + +function createResolver(config, options) { + // TODO: should the config object be validated? + config = config || {}; + options = options || {}; + + var resolver = { + resolve: resolve, + }; + + + // Keep constants separately + var constants = {}; + + function resolveConstant(key) { + if (constants.hasOwnProperty(key)) { + return constants[key]; + } + + var definition = config[key]; + // Ignore options that are not defined + if (!definition) { + return; + } + + var option = options[key]; + + if (option != null) { + if (typeof option === 'function') { + return; + } + option = normalize.call(resolver, definition.type, option); + if (option != null) { + constants[key] = option; + return option; + } + } + + var fallback = definition.default; + if (option == null && typeof fallback !== 'function') { + constants[key] = fallback; + return fallback; + } + } + + + // Keep requested keys to detect (and disallow) recursive resolution + var stack = []; + + function resolve(key) { + var option = resolveConstant(key); + if (option != null) { + return option; + } + + var definition = config[key]; + // Ignore options that are not defined + if (!definition) { + return; + } + + if (stack.indexOf(key) >= 0) { + throw new Error('Recursive resolution denied.'); + } + + option = options[key]; + var fallback = definition.default; + var appliedArgs = slice.call(arguments, 1); + var args = [definition.type, option].concat(appliedArgs); + + function toResolve() { + stack.push(key); + var option = normalize.apply(resolver, args); + + if (option == null) { + option = fallback; + if (typeof option === 'function') { + option = option.apply(resolver, appliedArgs); + } + } + + return option; + } + + function onResolve() { + stack.pop(); + } + + return tryResolve(toResolve, onResolve); + } + + + return resolver; +} + + +function tryResolve(toResolve, onResolve) { + try { + return toResolve(); + } finally { + onResolve(); + } +} + + +module.exports = createResolver; diff --git a/packages/字体精简工具/node_modules/resolve-options/package.json b/packages/字体精简工具/node_modules/resolve-options/package.json new file mode 100644 index 0000000..5635491 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve-options/package.json @@ -0,0 +1,89 @@ +{ + "_from": "resolve-options@^1.1.0", + "_id": "resolve-options@1.1.0", + "_inBundle": false, + "_integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "_location": "/resolve-options", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "resolve-options@^1.1.0", + "name": "resolve-options", + "escapedName": "resolve-options", + "rawSpec": "^1.1.0", + "saveSpec": null, + "fetchSpec": "^1.1.0" + }, + "_requiredBy": [ + "/vinyl-fs" + ], + "_resolved": "https://registry.npm.taobao.org/resolve-options/download/resolve-options-1.1.0.tgz", + "_shasum": "32bb9e39c06d67338dc9378c0d6d6074566ad131", + "_spec": "resolve-options@^1.1.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/resolve-options/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": { + "value-or-function": "^3.0.0" + }, + "deprecated": false, + "description": "Resolve an options object based on configuration.", + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^3.2.0" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/gulpjs/resolve-options#readme", + "keywords": [ + "options", + "functions", + "resolver", + "type", + "configuration", + "config", + "opts", + "opt", + "default" + ], + "license": "MIT", + "main": "index.js", + "name": "resolve-options", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/resolve-options.git" + }, + "scripts": { + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls", + "lint": "eslint index.js test/ && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only" + }, + "version": "1.1.0" +} diff --git a/packages/字体精简工具/node_modules/resolve/.editorconfig b/packages/字体精简工具/node_modules/resolve/.editorconfig new file mode 100644 index 0000000..d63f0bb --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/.editorconfig @@ -0,0 +1,37 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 200 + +[*.js] +block_comment_start = /* +block_comment = * +block_comment_end = */ + +[*.yml] +indent_size = 1 + +[package.json] +indent_style = tab + +[lib/core.json] +indent_style = tab + +[CHANGELOG.md] +indent_style = space +indent_size = 2 + +[{*.json,Makefile}] +max_line_length = off + +[test/{dotdot,resolver,module_dir,multirepo,node_path,pathfilter,precedence}/**/*] +indent_style = off +indent_size = off +max_line_length = off +insert_final_newline = off diff --git a/packages/字体精简工具/node_modules/resolve/.eslintignore b/packages/字体精简工具/node_modules/resolve/.eslintignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/.eslintignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/字体精简工具/node_modules/resolve/.eslintrc b/packages/字体精简工具/node_modules/resolve/.eslintrc new file mode 100644 index 0000000..a22863c --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/.eslintrc @@ -0,0 +1,39 @@ +{ + "extends": "@ljharb", + "root": true, + "rules": { + "array-bracket-newline": 0, + "array-element-newline": 0, + "indent": [2, 4], + "strict": 0, + "complexity": 0, + "consistent-return": 0, + "curly": 0, + "dot-notation": [2, { "allowKeywords": true }], + "func-name-matching": 0, + "func-style": 0, + "global-require": 0, + "id-length": [2, { "min": 1, "max": 30 }], + "max-lines-per-function": 0, + "max-nested-callbacks": 0, + "max-params": 0, + "max-statements-per-line": [2, { "max": 2 }], + "max-statements": 0, + "no-magic-numbers": 0, + "no-console": 0, + "no-shadow": 0, + "no-unused-vars": [2, { "vars": "all", "args": "none" }], + "no-use-before-define": 0, + "object-curly-newline": 0, + "operator-linebreak": [2, "before"], + "sort-keys": 0, + }, + "overrides": [ + { + "files": "test/resolver/nested_symlinks/mylib/*.js", + "rules": { + "no-throw-literal": 0, + }, + }, + ], +} diff --git a/packages/字体精简工具/node_modules/resolve/LICENSE b/packages/字体精简工具/node_modules/resolve/LICENSE new file mode 100644 index 0000000..ff4fce2 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/resolve/SECURITY.md b/packages/字体精简工具/node_modules/resolve/SECURITY.md new file mode 100644 index 0000000..82e4285 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/SECURITY.md @@ -0,0 +1,3 @@ +# Security + +Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report. diff --git a/packages/字体精简工具/node_modules/resolve/appveyor.yml b/packages/字体精简工具/node_modules/resolve/appveyor.yml new file mode 100644 index 0000000..747fbdb --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/appveyor.yml @@ -0,0 +1,74 @@ +version: 1.0.{build} +skip_branch_with_pr: true +build: off + +environment: + matrix: + #- nodejs_version: "15" + - nodejs_version: "14" + - nodejs_version: "13" + - nodejs_version: "12" + - nodejs_version: "11" + - nodejs_version: "10" + - nodejs_version: "9" + - nodejs_version: "8" + - nodejs_version: "7" + - nodejs_version: "6" + - nodejs_version: "5" + - nodejs_version: "4" + - nodejs_version: "3" + - nodejs_version: "2" + - nodejs_version: "1" + - nodejs_version: "0.12" + - nodejs_version: "0.10" + - nodejs_version: "0.8" + - nodejs_version: "0.6" +matrix: + # fast_finish: true + allow_failures: + - nodejs_version: "5" # due to windows npm bug, registry-side + - nodejs_version: "0.8" + # platform: x86 # x64 has started failing on the registry side, around early November 2020 + - nodejs_version: "0.6" + +platform: + - x86 + - x64 + +# Install scripts. (runs after repo cloning) +install: + # Fix symlinks in working copy (see https://github.com/appveyor/ci/issues/650#issuecomment-186592582) / https://github.com/charleskorn/batect/commit/d08986802ec43086902958c4ee7e57ff3e71dbef + - git config core.symlinks true + - git reset --hard + # Get the latest stable version of Node.js or io.js + - ps: if ($env:nodejs_version -ne '0.6') { Install-Product node $env:nodejs_version $env:platform } + - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) $env:platform + - IF %nodejs_version% EQU 0.6 npm config set strict-ssl false && npm -g install npm@1.3 + - IF %nodejs_version% EQU 0.8 npm config set strict-ssl false && npm -g install npm@1.4.28 && npm install -g npm@4.5 + - IF %nodejs_version% EQU 1 npm -g install npm@2.9 + - IF %nodejs_version% EQU 2 npm -g install npm@4 + - IF %nodejs_version% EQU 3 npm -g install npm@4 + - IF %nodejs_version% EQU 4 npm -g install npm@5.3 + - IF %nodejs_version% EQU 5 npm -g install npm@5.3 + - IF %nodejs_version% EQU 6 npm -g install npm@6.9 + - IF %nodejs_version% EQU 7 npm -g install npm@6 + - IF %nodejs_version% EQU 8 npm -g install npm@6 + - IF %nodejs_version% EQU 9 npm -g install npm@6.9 + - IF %nodejs_version% EQU 10 npm -g install npm@7 + - IF %nodejs_version% EQU 11 npm -g install npm@7 + - IF %nodejs_version% EQU 12 npm -g install npm@7 + - IF %nodejs_version% EQU 13 npm -g install npm@7 + - IF %nodejs_version% EQU 14 npm -g install npm@7 + - IF %nodejs_version% EQU 15 npm -g install npm@7 + - set PATH=%APPDATA%\npm;%PATH% + #- IF %nodejs_version% NEQ 0.6 AND %nodejs_version% NEQ 0.8 npm -g install npm + # install modules + - npm install + +# Post-install test scripts. +test_script: + # Output useful info for debugging. + - node --version + - npm --version + # run tests + - npm run tests-only diff --git a/packages/字体精简工具/node_modules/resolve/example/async.js b/packages/字体精简工具/node_modules/resolve/example/async.js new file mode 100644 index 0000000..20e65dc --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/example/async.js @@ -0,0 +1,5 @@ +var resolve = require('../'); +resolve('tap', { basedir: __dirname }, function (err, res) { + if (err) console.error(err); + else console.log(res); +}); diff --git a/packages/字体精简工具/node_modules/resolve/example/sync.js b/packages/字体精简工具/node_modules/resolve/example/sync.js new file mode 100644 index 0000000..54b2cc1 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/example/sync.js @@ -0,0 +1,3 @@ +var resolve = require('../'); +var res = resolve.sync('tap', { basedir: __dirname }); +console.log(res); diff --git a/packages/字体精简工具/node_modules/resolve/index.js b/packages/字体精简工具/node_modules/resolve/index.js new file mode 100644 index 0000000..125d814 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/index.js @@ -0,0 +1,6 @@ +var async = require('./lib/async'); +async.core = require('./lib/core'); +async.isCore = require('./lib/is-core'); +async.sync = require('./lib/sync'); + +module.exports = async; diff --git a/packages/字体精简工具/node_modules/resolve/lib/async.js b/packages/字体精简工具/node_modules/resolve/lib/async.js new file mode 100644 index 0000000..02e80ac --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/lib/async.js @@ -0,0 +1,320 @@ +var fs = require('fs'); +var path = require('path'); +var caller = require('./caller'); +var nodeModulesPaths = require('./node-modules-paths'); +var normalizeOptions = require('./normalize-options'); +var isCore = require('is-core-module'); + +var realpathFS = fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath; + +var defaultIsFile = function isFile(file, cb) { + fs.stat(file, function (err, stat) { + if (!err) { + return cb(null, stat.isFile() || stat.isFIFO()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); +}; + +var defaultIsDir = function isDirectory(dir, cb) { + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); +}; + +var defaultRealpath = function realpath(x, cb) { + realpathFS(x, function (realpathErr, realPath) { + if (realpathErr && realpathErr.code !== 'ENOENT') cb(realpathErr); + else cb(null, realpathErr ? x : realPath); + }); +}; + +var maybeRealpath = function maybeRealpath(realpath, x, opts, cb) { + if (opts && opts.preserveSymlinks === false) { + realpath(x, cb); + } else { + cb(null, x); + } +}; + +var defaultReadPackage = function defaultReadPackage(readFile, pkgfile, cb) { + readFile(pkgfile, function (readFileErr, body) { + if (readFileErr) cb(readFileErr); + else { + try { + var pkg = JSON.parse(body); + cb(null, pkg); + } catch (jsonErr) { + cb(null); + } + } + }); +}; + +var getPackageCandidates = function getPackageCandidates(x, start, opts) { + var dirs = nodeModulesPaths(start, opts, x); + for (var i = 0; i < dirs.length; i++) { + dirs[i] = path.join(dirs[i], x); + } + return dirs; +}; + +module.exports = function resolve(x, options, callback) { + var cb = callback; + var opts = options; + if (typeof options === 'function') { + cb = opts; + opts = {}; + } + if (typeof x !== 'string') { + var err = new TypeError('Path must be a string.'); + return process.nextTick(function () { + cb(err); + }); + } + + opts = normalizeOptions(x, opts); + + var isFile = opts.isFile || defaultIsFile; + var isDirectory = opts.isDirectory || defaultIsDir; + var readFile = opts.readFile || fs.readFile; + var realpath = opts.realpath || defaultRealpath; + var readPackage = opts.readPackage || defaultReadPackage; + if (opts.readFile && opts.readPackage) { + var conflictErr = new TypeError('`readFile` and `readPackage` are mutually exclusive.'); + return process.nextTick(function () { + cb(conflictErr); + }); + } + var packageIterator = opts.packageIterator; + + var extensions = opts.extensions || ['.js']; + var includeCoreModules = opts.includeCoreModules !== false; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; + + opts.paths = opts.paths || []; + + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = path.resolve(basedir); + + maybeRealpath( + realpath, + absoluteStart, + opts, + function (err, realStart) { + if (err) cb(err); + else init(realStart); + } + ); + + var res; + function init(basedir) { + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + res = path.resolve(basedir, x); + if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; + if ((/\/$/).test(x) && res === basedir) { + loadAsDirectory(res, opts.package, onfile); + } else loadAsFile(res, opts.package, onfile); + } else if (includeCoreModules && isCore(x)) { + return cb(null, x); + } else loadNodeModules(x, basedir, function (err, n, pkg) { + if (err) cb(err); + else if (n) { + return maybeRealpath(realpath, n, opts, function (err, realN) { + if (err) { + cb(err); + } else { + cb(null, realN, pkg); + } + }); + } else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } + + function onfile(err, m, pkg) { + if (err) cb(err); + else if (m) cb(null, m, pkg); + else loadAsDirectory(res, function (err, d, pkg) { + if (err) cb(err); + else if (d) { + maybeRealpath(realpath, d, opts, function (err, realD) { + if (err) { + cb(err); + } else { + cb(null, realD, pkg); + } + }); + } else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } + + function loadAsFile(x, thePackage, callback) { + var loadAsFilePackage = thePackage; + var cb = callback; + if (typeof loadAsFilePackage === 'function') { + cb = loadAsFilePackage; + loadAsFilePackage = undefined; + } + + var exts = [''].concat(extensions); + load(exts, x, loadAsFilePackage); + + function load(exts, x, loadPackage) { + if (exts.length === 0) return cb(null, undefined, loadPackage); + var file = x + exts[0]; + + var pkg = loadPackage; + if (pkg) onpkg(null, pkg); + else loadpkg(path.dirname(file), onpkg); + + function onpkg(err, pkg_, dir) { + pkg = pkg_; + if (err) return cb(err); + if (dir && pkg && opts.pathFilter) { + var rfile = path.relative(dir, file); + var rel = rfile.slice(0, rfile.length - exts[0].length); + var r = opts.pathFilter(pkg, x, rel); + if (r) return load( + [''].concat(extensions.slice()), + path.resolve(dir, r), + pkg + ); + } + isFile(file, onex); + } + function onex(err, ex) { + if (err) return cb(err); + if (ex) return cb(null, file, pkg); + load(exts.slice(1), x, pkg); + } + } + } + + function loadpkg(dir, cb) { + if (dir === '' || dir === '/') return cb(null); + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return cb(null); + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null); + + maybeRealpath(realpath, dir, opts, function (unwrapErr, pkgdir) { + if (unwrapErr) return loadpkg(path.dirname(dir), cb); + var pkgfile = path.join(pkgdir, 'package.json'); + isFile(pkgfile, function (err, ex) { + // on err, ex is false + if (!ex) return loadpkg(path.dirname(dir), cb); + + readPackage(readFile, pkgfile, function (err, pkgParam) { + if (err) cb(err); + + var pkg = pkgParam; + + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } + cb(null, pkg, dir); + }); + }); + }); + } + + function loadAsDirectory(x, loadAsDirectoryPackage, callback) { + var cb = callback; + var fpkg = loadAsDirectoryPackage; + if (typeof fpkg === 'function') { + cb = fpkg; + fpkg = opts.package; + } + + maybeRealpath(realpath, x, opts, function (unwrapErr, pkgdir) { + if (unwrapErr) return cb(unwrapErr); + var pkgfile = path.join(pkgdir, 'package.json'); + isFile(pkgfile, function (err, ex) { + if (err) return cb(err); + if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb); + + readPackage(readFile, pkgfile, function (err, pkgParam) { + if (err) return cb(err); + + var pkg = pkgParam; + + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } + + if (pkg && pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + return cb(mainError); + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb); + + var dir = path.resolve(x, pkg.main); + loadAsDirectory(dir, pkg, function (err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + loadAsFile(path.join(x, 'index'), pkg, cb); + }); + }); + return; + } + + loadAsFile(path.join(x, '/index'), pkg, cb); + }); + }); + }); + } + + function processDirs(cb, dirs) { + if (dirs.length === 0) return cb(null, undefined); + var dir = dirs[0]; + + isDirectory(path.dirname(dir), isdir); + + function isdir(err, isdir) { + if (err) return cb(err); + if (!isdir) return processDirs(cb, dirs.slice(1)); + loadAsFile(dir, opts.package, onfile); + } + + function onfile(err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + loadAsDirectory(dir, opts.package, ondir); + } + + function ondir(err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + processDirs(cb, dirs.slice(1)); + } + } + function loadNodeModules(x, start, cb) { + var thunk = function () { return getPackageCandidates(x, start, opts); }; + processDirs( + cb, + packageIterator ? packageIterator(x, start, thunk, opts) : thunk() + ); + } +}; diff --git a/packages/字体精简工具/node_modules/resolve/lib/caller.js b/packages/字体精简工具/node_modules/resolve/lib/caller.js new file mode 100644 index 0000000..b14a280 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/lib/caller.js @@ -0,0 +1,8 @@ +module.exports = function () { + // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + var origPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = function (_, stack) { return stack; }; + var stack = (new Error()).stack; + Error.prepareStackTrace = origPrepareStackTrace; + return stack[2].getFileName(); +}; diff --git a/packages/字体精简工具/node_modules/resolve/lib/core.js b/packages/字体精简工具/node_modules/resolve/lib/core.js new file mode 100644 index 0000000..c417d23 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/lib/core.js @@ -0,0 +1,53 @@ +var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; + +function specifierIncluded(specifier) { + var parts = specifier.split(' '); + var op = parts.length > 1 ? parts[0] : '='; + var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); + + for (var i = 0; i < 3; ++i) { + var cur = parseInt(current[i] || 0, 10); + var ver = parseInt(versionParts[i] || 0, 10); + if (cur === ver) { + continue; // eslint-disable-line no-restricted-syntax, no-continue + } + if (op === '<') { + return cur < ver; + } else if (op === '>=') { + return cur >= ver; + } else { + return false; + } + } + return op === '>='; +} + +function matchesRange(range) { + var specifiers = range.split(/ ?&& ?/); + if (specifiers.length === 0) { return false; } + for (var i = 0; i < specifiers.length; ++i) { + if (!specifierIncluded(specifiers[i])) { return false; } + } + return true; +} + +function versionIncluded(specifierValue) { + if (typeof specifierValue === 'boolean') { return specifierValue; } + if (specifierValue && typeof specifierValue === 'object') { + for (var i = 0; i < specifierValue.length; ++i) { + if (matchesRange(specifierValue[i])) { return true; } + } + return false; + } + return matchesRange(specifierValue); +} + +var data = require('./core.json'); + +var core = {}; +for (var mod in data) { // eslint-disable-line no-restricted-syntax + if (Object.prototype.hasOwnProperty.call(data, mod)) { + core[mod] = versionIncluded(data[mod]); + } +} +module.exports = core; diff --git a/packages/字体精简工具/node_modules/resolve/lib/core.json b/packages/字体精简工具/node_modules/resolve/lib/core.json new file mode 100644 index 0000000..0238b61 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/lib/core.json @@ -0,0 +1,83 @@ +{ + "assert": true, + "assert/strict": ">= 15", + "async_hooks": ">= 8", + "buffer_ieee754": "< 0.9.7", + "buffer": true, + "child_process": true, + "cluster": true, + "console": true, + "constants": true, + "crypto": true, + "_debug_agent": ">= 1 && < 8", + "_debugger": "< 8", + "dgram": true, + "diagnostics_channel": ">= 15.1", + "dns": true, + "dns/promises": ">= 15", + "domain": ">= 0.7.12", + "events": true, + "freelist": "< 6", + "fs": true, + "fs/promises": [">= 10 && < 10.1", ">= 14"], + "_http_agent": ">= 0.11.1", + "_http_client": ">= 0.11.1", + "_http_common": ">= 0.11.1", + "_http_incoming": ">= 0.11.1", + "_http_outgoing": ">= 0.11.1", + "_http_server": ">= 0.11.1", + "http": true, + "http2": ">= 8.8", + "https": true, + "inspector": ">= 8.0.0", + "_linklist": "< 8", + "module": true, + "net": true, + "node-inspect/lib/_inspect": ">= 7.6.0 && < 12", + "node-inspect/lib/internal/inspect_client": ">= 7.6.0 && < 12", + "node-inspect/lib/internal/inspect_repl": ">= 7.6.0 && < 12", + "os": true, + "path": true, + "path/posix": ">= 15.3", + "path/win32": ">= 15.3", + "perf_hooks": ">= 8.5", + "process": ">= 1", + "punycode": true, + "querystring": true, + "readline": true, + "repl": true, + "smalloc": ">= 0.11.5 && < 3", + "_stream_duplex": ">= 0.9.4", + "_stream_transform": ">= 0.9.4", + "_stream_wrap": ">= 1.4.1", + "_stream_passthrough": ">= 0.9.4", + "_stream_readable": ">= 0.9.4", + "_stream_writable": ">= 0.9.4", + "stream": true, + "stream/promises": ">= 15", + "string_decoder": true, + "sys": [">= 0.6 && < 0.7", ">= 0.8"], + "timers": true, + "timers/promises": ">= 15", + "_tls_common": ">= 0.11.13", + "_tls_legacy": ">= 0.11.3 && < 10", + "_tls_wrap": ">= 0.11.3", + "tls": true, + "trace_events": ">= 10", + "tty": true, + "url": true, + "util": true, + "util/types": ">= 15.3", + "v8/tools/arguments": ">= 10 && < 12", + "v8/tools/codemap": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/consarray": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/csvparser": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/logreader": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/profile_view": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8/tools/splaytree": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"], + "v8": ">= 1", + "vm": true, + "wasi": ">= 13.4 && < 13.5", + "worker_threads": ">= 11.7", + "zlib": true +} diff --git a/packages/字体精简工具/node_modules/resolve/lib/is-core.js b/packages/字体精简工具/node_modules/resolve/lib/is-core.js new file mode 100644 index 0000000..537f5c7 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/lib/is-core.js @@ -0,0 +1,5 @@ +var isCoreModule = require('is-core-module'); + +module.exports = function isCore(x) { + return isCoreModule(x); +}; diff --git a/packages/字体精简工具/node_modules/resolve/lib/node-modules-paths.js b/packages/字体精简工具/node_modules/resolve/lib/node-modules-paths.js new file mode 100644 index 0000000..2b43813 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/lib/node-modules-paths.js @@ -0,0 +1,42 @@ +var path = require('path'); +var parse = path.parse || require('path-parse'); + +var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { + var prefix = '/'; + if ((/^([A-Za-z]:)/).test(absoluteStart)) { + prefix = ''; + } else if ((/^\\\\/).test(absoluteStart)) { + prefix = '\\\\'; + } + + var paths = [absoluteStart]; + var parsed = parse(absoluteStart); + while (parsed.dir !== paths[paths.length - 1]) { + paths.push(parsed.dir); + parsed = parse(parsed.dir); + } + + return paths.reduce(function (dirs, aPath) { + return dirs.concat(modules.map(function (moduleDir) { + return path.resolve(prefix, aPath, moduleDir); + })); + }, []); +}; + +module.exports = function nodeModulesPaths(start, opts, request) { + var modules = opts && opts.moduleDirectory + ? [].concat(opts.moduleDirectory) + : ['node_modules']; + + if (opts && typeof opts.paths === 'function') { + return opts.paths( + request, + start, + function () { return getNodeModulesDirs(start, modules); }, + opts + ); + } + + var dirs = getNodeModulesDirs(start, modules); + return opts && opts.paths ? dirs.concat(opts.paths) : dirs; +}; diff --git a/packages/字体精简工具/node_modules/resolve/lib/normalize-options.js b/packages/字体精简工具/node_modules/resolve/lib/normalize-options.js new file mode 100644 index 0000000..4b56904 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/lib/normalize-options.js @@ -0,0 +1,10 @@ +module.exports = function (x, opts) { + /** + * This file is purposefully a passthrough. It's expected that third-party + * environments will override it at runtime in order to inject special logic + * into `resolve` (by manipulating the options). One such example is the PnP + * code path in Yarn. + */ + + return opts || {}; +}; diff --git a/packages/字体精简工具/node_modules/resolve/lib/sync.js b/packages/字体精简工具/node_modules/resolve/lib/sync.js new file mode 100644 index 0000000..ef9bd80 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/lib/sync.js @@ -0,0 +1,199 @@ +var isCore = require('is-core-module'); +var fs = require('fs'); +var path = require('path'); +var caller = require('./caller'); +var nodeModulesPaths = require('./node-modules-paths'); +var normalizeOptions = require('./normalize-options'); + +var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; + +var defaultIsFile = function isFile(file) { + try { + var stat = fs.statSync(file); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isFile() || stat.isFIFO(); +}; + +var defaultIsDir = function isDirectory(dir) { + try { + var stat = fs.statSync(dir); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isDirectory(); +}; + +var defaultRealpathSync = function realpathSync(x) { + try { + return realpathFS(x); + } catch (realpathErr) { + if (realpathErr.code !== 'ENOENT') { + throw realpathErr; + } + } + return x; +}; + +var maybeRealpathSync = function maybeRealpathSync(realpathSync, x, opts) { + if (opts && opts.preserveSymlinks === false) { + return realpathSync(x); + } + return x; +}; + +var defaultReadPackageSync = function defaultReadPackageSync(readFileSync, pkgfile) { + var body = readFileSync(pkgfile); + try { + var pkg = JSON.parse(body); + return pkg; + } catch (jsonErr) {} +}; + +var getPackageCandidates = function getPackageCandidates(x, start, opts) { + var dirs = nodeModulesPaths(start, opts, x); + for (var i = 0; i < dirs.length; i++) { + dirs[i] = path.join(dirs[i], x); + } + return dirs; +}; + +module.exports = function resolveSync(x, options) { + if (typeof x !== 'string') { + throw new TypeError('Path must be a string.'); + } + var opts = normalizeOptions(x, options); + + var isFile = opts.isFile || defaultIsFile; + var readFileSync = opts.readFileSync || fs.readFileSync; + var isDirectory = opts.isDirectory || defaultIsDir; + var realpathSync = opts.realpathSync || defaultRealpathSync; + var readPackageSync = opts.readPackageSync || defaultReadPackageSync; + if (opts.readFileSync && opts.readPackageSync) { + throw new TypeError('`readFileSync` and `readPackageSync` are mutually exclusive.'); + } + var packageIterator = opts.packageIterator; + + var extensions = opts.extensions || ['.js']; + var includeCoreModules = opts.includeCoreModules !== false; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; + + opts.paths = opts.paths || []; + + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = maybeRealpathSync(realpathSync, path.resolve(basedir), opts); + + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + var res = path.resolve(absoluteStart, x); + if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; + var m = loadAsFileSync(res) || loadAsDirectorySync(res); + if (m) return maybeRealpathSync(realpathSync, m, opts); + } else if (includeCoreModules && isCore(x)) { + return x; + } else { + var n = loadNodeModulesSync(x, absoluteStart); + if (n) return maybeRealpathSync(realpathSync, n, opts); + } + + var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; + + function loadAsFileSync(x) { + var pkg = loadpkg(path.dirname(x)); + + if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { + var rfile = path.relative(pkg.dir, x); + var r = opts.pathFilter(pkg.pkg, x, rfile); + if (r) { + x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign + } + } + + if (isFile(x)) { + return x; + } + + for (var i = 0; i < extensions.length; i++) { + var file = x + extensions[i]; + if (isFile(file)) { + return file; + } + } + } + + function loadpkg(dir) { + if (dir === '' || dir === '/') return; + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return; + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; + + var pkgfile = path.join(maybeRealpathSync(realpathSync, dir, opts), 'package.json'); + + if (!isFile(pkgfile)) { + return loadpkg(path.dirname(dir)); + } + + var pkg = readPackageSync(readFileSync, pkgfile); + + if (pkg && opts.packageFilter) { + // v2 will pass pkgfile + pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment + } + + return { pkg: pkg, dir: dir }; + } + + function loadAsDirectorySync(x) { + var pkgfile = path.join(maybeRealpathSync(realpathSync, x, opts), '/package.json'); + if (isFile(pkgfile)) { + try { + var pkg = readPackageSync(readFileSync, pkgfile); + } catch (e) {} + + if (pkg && opts.packageFilter) { + // v2 will pass pkgfile + pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment + } + + if (pkg && pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + throw mainError; + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + try { + var m = loadAsFileSync(path.resolve(x, pkg.main)); + if (m) return m; + var n = loadAsDirectorySync(path.resolve(x, pkg.main)); + if (n) return n; + } catch (e) {} + } + } + + return loadAsFileSync(path.join(x, '/index')); + } + + function loadNodeModulesSync(x, start) { + var thunk = function () { return getPackageCandidates(x, start, opts); }; + var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk(); + + for (var i = 0; i < dirs.length; i++) { + var dir = dirs[i]; + if (isDirectory(path.dirname(dir))) { + var m = loadAsFileSync(dir); + if (m) return m; + var n = loadAsDirectorySync(dir); + if (n) return n; + } + } + } +}; diff --git a/packages/字体精简工具/node_modules/resolve/package.json b/packages/字体精简工具/node_modules/resolve/package.json new file mode 100644 index 0000000..64c9411 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/package.json @@ -0,0 +1,85 @@ +{ + "_from": "resolve@^1.10.0", + "_id": "resolve@1.20.0", + "_inBundle": false, + "_integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", + "_location": "/resolve", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "resolve@^1.10.0", + "name": "resolve", + "escapedName": "resolve", + "rawSpec": "^1.10.0", + "saveSpec": null, + "fetchSpec": "^1.10.0" + }, + "_requiredBy": [ + "/liftoff", + "/matchdep", + "/normalize-package-data", + "/rechoir", + "/rollup-plugin-commonjs", + "/rollup-plugin-node-resolve" + ], + "_resolved": "https://registry.nlark.com/resolve/download/resolve-1.20.0.tgz?cache=0&sync_timestamp=1618846903792&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fresolve%2Fdownload%2Fresolve-1.20.0.tgz", + "_shasum": "629a013fb3f70755d6f0b7935cc1c2c5378b1975", + "_spec": "resolve@^1.10.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\normalize-package-data", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "bugs": { + "url": "https://github.com/browserify/resolve/issues" + }, + "bundleDependencies": false, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "deprecated": false, + "description": "resolve like require.resolve() on behalf of files asynchronously and synchronously", + "devDependencies": { + "@ljharb/eslint-config": "^17.5.1", + "array.prototype.map": "^1.0.3", + "aud": "^1.1.4", + "eclint": "^2.8.1", + "eslint": "^7.19.0", + "object-keys": "^1.1.1", + "safe-publish-latest": "^1.1.4", + "tap": "0.4.13", + "tape": "^5.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "homepage": "https://github.com/browserify/resolve#readme", + "keywords": [ + "resolve", + "require", + "node", + "module" + ], + "license": "MIT", + "main": "index.js", + "name": "resolve", + "repository": { + "type": "git", + "url": "git://github.com/browserify/resolve.git" + }, + "scripts": { + "lint": "eslint --ext=js,mjs .", + "posttest": "npm run test:multirepo && aud --production", + "prelint": "eclint check '**/*'", + "prepublish": "safe-publish-latest && cp node_modules/is-core-module/core.json ./lib/ ||:", + "pretest": "npm run lint", + "pretests-only": "cd ./test/resolver/nested_symlinks && node mylib/sync && node mylib/async", + "test": "npm run --silent tests-only", + "test:multirepo": "cd ./test/resolver/multirepo && npm install && npm test", + "tests-only": "tape test/*.js" + }, + "version": "1.20.0" +} diff --git a/packages/字体精简工具/node_modules/resolve/readme.markdown b/packages/字体精简工具/node_modules/resolve/readme.markdown new file mode 100644 index 0000000..7c9f2dc --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/readme.markdown @@ -0,0 +1,279 @@ +# resolve + +implements the [node `require.resolve()` +algorithm](https://nodejs.org/api/modules.html#modules_all_together) +such that you can `require.resolve()` on behalf of a file asynchronously and +synchronously + +[![build status](https://secure.travis-ci.org/browserify/resolve.png)](http://travis-ci.org/browserify/resolve) + +# example + +asynchronously resolve: + +```js +var resolve = require('resolve'); +resolve('tap', { basedir: __dirname }, function (err, res) { + if (err) console.error(err); + else console.log(res); +}); +``` + +``` +$ node example/async.js +/home/substack/projects/node-resolve/node_modules/tap/lib/main.js +``` + +synchronously resolve: + +```js +var resolve = require('resolve'); +var res = resolve.sync('tap', { basedir: __dirname }); +console.log(res); +``` + +``` +$ node example/sync.js +/home/substack/projects/node-resolve/node_modules/tap/lib/main.js +``` + +# methods + +```js +var resolve = require('resolve'); +``` + +For both the synchronous and asynchronous methods, errors may have any of the following `err.code` values: + +- `MODULE_NOT_FOUND`: the given path string (`id`) could not be resolved to a module +- `INVALID_BASEDIR`: the specified `opts.basedir` doesn't exist, or is not a directory +- `INVALID_PACKAGE_MAIN`: a `package.json` was encountered with an invalid `main` property (eg. not a string) + +## resolve(id, opts={}, cb) + +Asynchronously resolve the module path string `id` into `cb(err, res [, pkg])`, where `pkg` (if defined) is the data from `package.json`. + +options are: + +* opts.basedir - directory to begin resolving from + +* opts.package - `package.json` data applicable to the module being loaded + +* opts.extensions - array of file extensions to search in order + +* opts.includeCoreModules - set to `false` to exclude node core modules (e.g. `fs`) from the search + +* opts.readFile - how to read files asynchronously + +* opts.isFile - function to asynchronously test whether a file exists + +* opts.isDirectory - function to asynchronously test whether a directory exists + +* opts.realpath - function to asynchronously resolve a potential symlink to its real path + +* `opts.readPackage(readFile, pkgfile, cb)` - function to asynchronously read and parse a package.json file + * readFile - the passed `opts.readFile` or `fs.readFile` if not specified + * pkgfile - path to package.json + * cb - callback + +* `opts.packageFilter(pkg, pkgfile, dir)` - transform the parsed package.json contents before looking at the "main" field + * pkg - package data + * pkgfile - path to package.json + * dir - directory for package.json + +* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package + * pkg - package data + * path - the path being resolved + * relativePath - the path relative from the package.json location + * returns - a relative path that will be joined from the package.json location + +* opts.paths - require.paths array to use if nothing is found on the normal `node_modules` recursive walk (probably don't use this) + + For advanced users, `paths` can also be a `opts.paths(request, start, opts)` function + * request - the import specifier being resolved + * start - lookup path + * getNodeModulesDirs - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* `opts.packageIterator(request, start, opts)` - return the list of candidate paths where the packages sources may be found (probably don't use this) + * request - the import specifier being resolved + * start - lookup path + * getPackageCandidates - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"` + +* opts.preserveSymlinks - if true, doesn't resolve `basedir` to real path before resolving. +This is the way Node resolves dependencies when executed with the [--preserve-symlinks](https://nodejs.org/api/all.html#cli_preserve_symlinks) flag. +**Note:** this property is currently `true` by default but it will be changed to +`false` in the next major version because *Node's resolution algorithm does not preserve symlinks by default*. + +default `opts` values: + +```js +{ + paths: [], + basedir: __dirname, + extensions: ['.js'], + includeCoreModules: true, + readFile: fs.readFile, + isFile: function isFile(file, cb) { + fs.stat(file, function (err, stat) { + if (!err) { + return cb(null, stat.isFile() || stat.isFIFO()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }, + isDirectory: function isDirectory(dir, cb) { + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }, + realpath: function realpath(file, cb) { + var realpath = typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath; + realpath(file, function (realPathErr, realPath) { + if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr); + else cb(null, realPathErr ? file : realPath); + }); + }, + readPackage: function defaultReadPackage(readFile, pkgfile, cb) { + readFile(pkgfile, function (readFileErr, body) { + if (readFileErr) cb(readFileErr); + else { + try { + var pkg = JSON.parse(body); + cb(null, pkg); + } catch (jsonErr) { + cb(null); + } + } + }); + }, + moduleDirectory: 'node_modules', + preserveSymlinks: true +} +``` + +## resolve.sync(id, opts) + +Synchronously resolve the module path string `id`, returning the result and +throwing an error when `id` can't be resolved. + +options are: + +* opts.basedir - directory to begin resolving from + +* opts.extensions - array of file extensions to search in order + +* opts.includeCoreModules - set to `false` to exclude node core modules (e.g. `fs`) from the search + +* opts.readFileSync - how to read files synchronously + +* opts.isFile - function to synchronously test whether a file exists + +* opts.isDirectory - function to synchronously test whether a directory exists + +* opts.realpathSync - function to synchronously resolve a potential symlink to its real path + +* `opts.readPackageSync(readFileSync, pkgfile)` - function to synchronously read and parse a package.json file + * readFileSync - the passed `opts.readFileSync` or `fs.readFileSync` if not specified + * pkgfile - path to package.json + +* `opts.packageFilter(pkg, dir)` - transform the parsed package.json contents before looking at the "main" field + * pkg - package data + * dir - directory for package.json (Note: the second argument will change to "pkgfile" in v2) + +* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package + * pkg - package data + * path - the path being resolved + * relativePath - the path relative from the package.json location + * returns - a relative path that will be joined from the package.json location + +* opts.paths - require.paths array to use if nothing is found on the normal `node_modules` recursive walk (probably don't use this) + + For advanced users, `paths` can also be a `opts.paths(request, start, opts)` function + * request - the import specifier being resolved + * start - lookup path + * getNodeModulesDirs - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* `opts.packageIterator(request, start, opts)` - return the list of candidate paths where the packages sources may be found (probably don't use this) + * request - the import specifier being resolved + * start - lookup path + * getPackageCandidates - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution + * opts - the resolution options + +* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"` + +* opts.preserveSymlinks - if true, doesn't resolve `basedir` to real path before resolving. +This is the way Node resolves dependencies when executed with the [--preserve-symlinks](https://nodejs.org/api/all.html#cli_preserve_symlinks) flag. +**Note:** this property is currently `true` by default but it will be changed to +`false` in the next major version because *Node's resolution algorithm does not preserve symlinks by default*. + +default `opts` values: + +```js +{ + paths: [], + basedir: __dirname, + extensions: ['.js'], + includeCoreModules: true, + readFileSync: fs.readFileSync, + isFile: function isFile(file) { + try { + var stat = fs.statSync(file); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isFile() || stat.isFIFO(); + }, + isDirectory: function isDirectory(dir) { + try { + var stat = fs.statSync(dir); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isDirectory(); + }, + realpathSync: function realpathSync(file) { + try { + var realpath = typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; + return realpath(file); + } catch (realPathErr) { + if (realPathErr.code !== 'ENOENT') { + throw realPathErr; + } + } + return file; + }, + readPackageSync: function defaultReadPackageSync(readFileSync, pkgfile) { + var body = readFileSync(pkgfile); + try { + var pkg = JSON.parse(body); + return pkg; + } catch (jsonErr) {} + }, + moduleDirectory: 'node_modules', + preserveSymlinks: true +} +``` + +# install + +With [npm](https://npmjs.org) do: + +```sh +npm install resolve +``` + +# license + +MIT diff --git a/packages/字体精简工具/node_modules/resolve/test/.eslintrc b/packages/字体精简工具/node_modules/resolve/test/.eslintrc new file mode 100644 index 0000000..ddd262d --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "max-lines": 0 + } +} diff --git a/packages/字体精简工具/node_modules/resolve/test/core.js b/packages/字体精简工具/node_modules/resolve/test/core.js new file mode 100644 index 0000000..7a3ccb1 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/core.js @@ -0,0 +1,81 @@ +var test = require('tape'); +var keys = require('object-keys'); +var resolve = require('../'); + +test('core modules', function (t) { + t.test('isCore()', function (st) { + st.ok(resolve.isCore('fs')); + st.ok(resolve.isCore('net')); + st.ok(resolve.isCore('http')); + + st.ok(!resolve.isCore('seq')); + st.ok(!resolve.isCore('../')); + + st.ok(!resolve.isCore('toString')); + + st.end(); + }); + + t.test('core list', function (st) { + var cores = keys(resolve.core); + st.plan(cores.length); + + for (var i = 0; i < cores.length; ++i) { + var mod = cores[i]; + var requireFunc = function () { require(mod); }; // eslint-disable-line no-loop-func + console.log(mod, resolve.core, resolve.core[mod]); + if (resolve.core[mod]) { + st.doesNotThrow(requireFunc, mod + ' supported; requiring does not throw'); + } else { + st.throws(requireFunc, mod + ' not supported; requiring throws'); + } + } + + st.end(); + }); + + t.test('core via repl module', { skip: !resolve.core.repl }, function (st) { + var libs = require('repl')._builtinLibs; // eslint-disable-line no-underscore-dangle + if (!libs) { + st.skip('module.builtinModules does not exist'); + return st.end(); + } + for (var i = 0; i < libs.length; ++i) { + var mod = libs[i]; + st.ok(resolve.core[mod], mod + ' is a core module'); + st.doesNotThrow( + function () { require(mod); }, // eslint-disable-line no-loop-func + 'requiring ' + mod + ' does not throw' + ); + } + st.end(); + }); + + t.test('core via builtinModules list', { skip: !resolve.core.module }, function (st) { + var libs = require('module').builtinModules; + if (!libs) { + st.skip('module.builtinModules does not exist'); + return st.end(); + } + var blacklist = [ + '_debug_agent', + 'v8/tools/tickprocessor-driver', + 'v8/tools/SourceMap', + 'v8/tools/tickprocessor', + 'v8/tools/profile' + ]; + for (var i = 0; i < libs.length; ++i) { + var mod = libs[i]; + if (blacklist.indexOf(mod) === -1) { + st.ok(resolve.core[mod], mod + ' is a core module'); + st.doesNotThrow( + function () { require(mod); }, // eslint-disable-line no-loop-func + 'requiring ' + mod + ' does not throw' + ); + } + } + st.end(); + }); + + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/dotdot.js b/packages/字体精简工具/node_modules/resolve/test/dotdot.js new file mode 100644 index 0000000..3080665 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/dotdot.js @@ -0,0 +1,29 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('dotdot', function (t) { + t.plan(4); + var dir = path.join(__dirname, '/dotdot/abc'); + + resolve('..', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(__dirname, 'dotdot/index.js')); + }); + + resolve('.', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, 'index.js')); + }); +}); + +test('dotdot sync', function (t) { + t.plan(2); + var dir = path.join(__dirname, '/dotdot/abc'); + + var a = resolve.sync('..', { basedir: dir }); + t.equal(a, path.join(__dirname, 'dotdot/index.js')); + + var b = resolve.sync('.', { basedir: dir }); + t.equal(b, path.join(dir, 'index.js')); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/dotdot/abc/index.js b/packages/字体精简工具/node_modules/resolve/test/dotdot/abc/index.js new file mode 100644 index 0000000..67f2534 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/dotdot/abc/index.js @@ -0,0 +1,2 @@ +var x = require('..'); +console.log(x); diff --git a/packages/字体精简工具/node_modules/resolve/test/dotdot/index.js b/packages/字体精简工具/node_modules/resolve/test/dotdot/index.js new file mode 100644 index 0000000..643f9fc --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/dotdot/index.js @@ -0,0 +1 @@ +module.exports = 'whatever'; diff --git a/packages/字体精简工具/node_modules/resolve/test/faulty_basedir.js b/packages/字体精简工具/node_modules/resolve/test/faulty_basedir.js new file mode 100644 index 0000000..5f2141a --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/faulty_basedir.js @@ -0,0 +1,29 @@ +var test = require('tape'); +var path = require('path'); +var resolve = require('../'); + +test('faulty basedir must produce error in windows', { skip: process.platform !== 'win32' }, function (t) { + t.plan(1); + + var resolverDir = 'C:\\a\\b\\c\\d'; + + resolve('tape/lib/test.js', { basedir: resolverDir }, function (err, res, pkg) { + t.equal(!!err, true); + }); +}); + +test('non-existent basedir should not throw when preserveSymlinks is false', function (t) { + t.plan(2); + + var opts = { + basedir: path.join(path.sep, 'unreal', 'path', 'that', 'does', 'not', 'exist'), + preserveSymlinks: false + }; + + var module = './dotdot/abc'; + + resolve(module, opts, function (err, res) { + t.equal(err.code, 'MODULE_NOT_FOUND'); + t.equal(res, undefined); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/filter.js b/packages/字体精简工具/node_modules/resolve/test/filter.js new file mode 100644 index 0000000..8f8cccd --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/filter.js @@ -0,0 +1,34 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('filter', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'resolver'); + var packageFilterArgs; + resolve('./baz', { + basedir: dir, + packageFilter: function (pkg, pkgfile) { + pkg.main = 'doom'; // eslint-disable-line no-param-reassign + packageFilterArgs = [pkg, pkgfile]; + return pkg; + } + }, function (err, res, pkg) { + if (err) t.fail(err); + + t.equal(res, path.join(dir, 'baz/doom.js'), 'changing the package "main" works'); + + var packageData = packageFilterArgs[0]; + t.equal(pkg, packageData, 'first packageFilter argument is "pkg"'); + t.equal(packageData.main, 'doom', 'package "main" was altered'); + + var packageFile = packageFilterArgs[1]; + t.equal( + packageFile, + path.join(dir, 'baz/package.json'), + 'second packageFilter argument is "pkgfile"' + ); + + t.end(); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/filter_sync.js b/packages/字体精简工具/node_modules/resolve/test/filter_sync.js new file mode 100644 index 0000000..8a43b98 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/filter_sync.js @@ -0,0 +1,33 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('filter', function (t) { + var dir = path.join(__dirname, 'resolver'); + var packageFilterArgs; + var res = resolve.sync('./baz', { + basedir: dir, + // NOTE: in v2.x, this will be `pkg, pkgfile, dir`, but must remain "broken" here in v1.x for compatibility + packageFilter: function (pkg, /*pkgfile,*/ dir) { // eslint-disable-line spaced-comment + pkg.main = 'doom'; // eslint-disable-line no-param-reassign + packageFilterArgs = 'is 1.x' ? [pkg, dir] : [pkg, pkgfile, dir]; // eslint-disable-line no-constant-condition, no-undef + return pkg; + } + }); + + t.equal(res, path.join(dir, 'baz/doom.js'), 'changing the package "main" works'); + + var packageData = packageFilterArgs[0]; + t.equal(packageData.main, 'doom', 'package "main" was altered'); + + if (!'is 1.x') { // eslint-disable-line no-constant-condition + var packageFile = packageFilterArgs[1]; + t.equal(packageFile, path.join(dir, 'baz', 'package.json'), 'package.json path is correct'); + } + + var packageDir = packageFilterArgs['is 1.x' ? 1 : 2]; // eslint-disable-line no-constant-condition + // eslint-disable-next-line no-constant-condition + t.equal(packageDir, path.join(dir, 'baz'), ('is 1.x' ? 'second' : 'third') + ' packageFilter argument is "dir"'); + + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/mock.js b/packages/字体精简工具/node_modules/resolve/test/mock.js new file mode 100644 index 0000000..6116275 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/mock.js @@ -0,0 +1,315 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('mock', function (t) { + t.plan(8); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg, undefined); + }); + + resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg, undefined); + }); + + resolve('baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module 'baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('../baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module '../baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('mock from package', function (t) { + t.plan(8); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, file)); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + 'package': { main: 'bar' }, + readFile: function (file, cb) { + cb(null, files[file]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg && pkg.main, 'bar'); + }); + + resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/baz.js')); + t.equal(pkg && pkg.main, 'bar'); + }); + + resolve('baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module 'baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('../baz', opts('/foo/bar'), function (err, res) { + t.equal(err.message, "Cannot find module '../baz' from '" + path.resolve('/foo/bar') + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('mock package', function (t) { + t.plan(2); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + resolve('bar', opts('/foo'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/node_modules/bar/baz.js')); + t.equal(pkg && pkg.main, './baz.js'); + }); +}); + +test('mock package from package', function (t) { + t.plan(2); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + 'package': { main: 'bar' }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + resolve('bar', opts('/foo'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/node_modules/bar/baz.js')); + t.equal(pkg && pkg.main, './baz.js'); + }); +}); + +test('symlinked', function (t) { + t.plan(4); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/bar/symlinked/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + dirs[path.resolve('/foo/bar/symlinked')] = true; + + function opts(basedir) { + return { + preserveSymlinks: false, + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + var resolved = path.resolve(file); + + if (resolved.indexOf('symlinked') >= 0) { + cb(null, resolved); + return; + } + + var ext = path.extname(resolved); + + if (ext) { + var dir = path.dirname(resolved); + var base = path.basename(resolved); + cb(null, path.join(dir, 'symlinked', base)); + } else { + cb(null, path.join(resolved, 'symlinked')); + } + } + }; + } + + resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/symlinked/baz.js')); + t.equal(pkg, undefined); + }); + + resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { + if (err) return t.fail(err); + t.equal(res, path.resolve('/foo/bar/symlinked/baz.js')); + t.equal(pkg, undefined); + }); +}); + +test('readPackage', function (t) { + t.plan(3); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/something-else.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'boop'; + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file, cb) { + cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file))); + }, + isDirectory: function (dir, cb) { + cb(null, !!dirs[path.resolve(dir)]); + }, + 'package': { main: 'bar' }, + readFile: function (file, cb) { + cb(null, files[path.resolve(file)]); + }, + realpath: function (file, cb) { + cb(null, file); + } + }; + } + + t.test('with readFile', function (st) { + st.plan(3); + + resolve('bar', opts('/foo'), function (err, res, pkg) { + st.error(err); + st.equal(res, path.resolve('/foo/node_modules/bar/baz.js')); + st.equal(pkg && pkg.main, './baz.js'); + }); + }); + + var readPackage = function (readFile, file, cb) { + var barPackage = path.join('bar', 'package.json'); + if (file.slice(-barPackage.length) === barPackage) { + cb(null, { main: './something-else.js' }); + } else { + cb(null, JSON.parse(files[path.resolve(file)])); + } + }; + + t.test('with readPackage', function (st) { + st.plan(3); + + var options = opts('/foo'); + delete options.readFile; + options.readPackage = readPackage; + resolve('bar', options, function (err, res, pkg) { + st.error(err); + st.equal(res, path.resolve('/foo/node_modules/bar/something-else.js')); + st.equal(pkg && pkg.main, './something-else.js'); + }); + }); + + t.test('with readFile and readPackage', function (st) { + st.plan(1); + + var options = opts('/foo'); + options.readPackage = readPackage; + resolve('bar', options, function (err) { + st.throws(function () { throw err; }, TypeError, 'errors when both readFile and readPackage are provided'); + }); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/mock_sync.js b/packages/字体精简工具/node_modules/resolve/test/mock_sync.js new file mode 100644 index 0000000..0e3a60d --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/mock_sync.js @@ -0,0 +1,216 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('mock', function (t) { + t.plan(4); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: function (file) { + return files[path.resolve(file)]; + }, + realpathSync: function (file) { + return file; + } + }; + } + + t.equal( + resolve.sync('./baz', opts('/foo/bar')), + path.resolve('/foo/bar/baz.js') + ); + + t.equal( + resolve.sync('./baz.js', opts('/foo/bar')), + path.resolve('/foo/bar/baz.js') + ); + + t.throws(function () { + resolve.sync('baz', opts('/foo/bar')); + }); + + t.throws(function () { + resolve.sync('../baz', opts('/foo/bar')); + }); +}); + +test('mock package', function (t) { + t.plan(1); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir) { + return { + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: function (file) { + return files[path.resolve(file)]; + }, + realpathSync: function (file) { + return file; + } + }; + } + + t.equal( + resolve.sync('bar', opts('/foo')), + path.resolve('/foo/node_modules/bar/baz.js') + ); +}); + +test('symlinked', function (t) { + t.plan(2); + + var files = {}; + files[path.resolve('/foo/bar/baz.js')] = 'beep'; + files[path.resolve('/foo/bar/symlinked/baz.js')] = 'beep'; + + var dirs = {}; + dirs[path.resolve('/foo/bar')] = true; + dirs[path.resolve('/foo/bar/symlinked')] = true; + + function opts(basedir) { + return { + preserveSymlinks: false, + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: function (file) { + return files[path.resolve(file)]; + }, + realpathSync: function (file) { + var resolved = path.resolve(file); + + if (resolved.indexOf('symlinked') >= 0) { + return resolved; + } + + var ext = path.extname(resolved); + + if (ext) { + var dir = path.dirname(resolved); + var base = path.basename(resolved); + return path.join(dir, 'symlinked', base); + } else { + return path.join(resolved, 'symlinked'); + } + } + }; + } + + t.equal( + resolve.sync('./baz', opts('/foo/bar')), + path.resolve('/foo/bar/symlinked/baz.js') + ); + + t.equal( + resolve.sync('./baz.js', opts('/foo/bar')), + path.resolve('/foo/bar/symlinked/baz.js') + ); +}); + +test('readPackageSync', function (t) { + t.plan(3); + + var files = {}; + files[path.resolve('/foo/node_modules/bar/something-else.js')] = 'beep'; + files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({ + main: './baz.js' + }); + files[path.resolve('/foo/node_modules/bar/baz.js')] = 'boop'; + + var dirs = {}; + dirs[path.resolve('/foo')] = true; + dirs[path.resolve('/foo/node_modules')] = true; + + function opts(basedir, useReadPackage) { + return { + basedir: path.resolve(basedir), + isFile: function (file) { + return Object.prototype.hasOwnProperty.call(files, path.resolve(file)); + }, + isDirectory: function (dir) { + return !!dirs[path.resolve(dir)]; + }, + readFileSync: useReadPackage ? null : function (file) { + return files[path.resolve(file)]; + }, + realpathSync: function (file) { + return file; + } + }; + } + t.test('with readFile', function (st) { + st.plan(1); + + st.equal( + resolve.sync('bar', opts('/foo')), + path.resolve('/foo/node_modules/bar/baz.js') + ); + }); + + var readPackageSync = function (readFileSync, file) { + if (file.indexOf(path.join('bar', 'package.json')) >= 0) { + return { main: './something-else.js' }; + } else { + return JSON.parse(files[path.resolve(file)]); + } + }; + + t.test('with readPackage', function (st) { + st.plan(1); + + var options = opts('/foo'); + delete options.readFileSync; + options.readPackageSync = readPackageSync; + + st.equal( + resolve.sync('bar', options), + path.resolve('/foo/node_modules/bar/something-else.js') + ); + }); + + t.test('with readFile and readPackage', function (st) { + st.plan(1); + + var options = opts('/foo'); + options.readPackageSync = readPackageSync; + st.throws( + function () { resolve.sync('bar', options); }, + TypeError, + 'errors when both readFile and readPackage are provided' + ); + }); +}); + diff --git a/packages/字体精简工具/node_modules/resolve/test/module_dir.js b/packages/字体精简工具/node_modules/resolve/test/module_dir.js new file mode 100644 index 0000000..b50e5bb --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/module_dir.js @@ -0,0 +1,56 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('moduleDirectory strings', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'module_dir'); + var xopts = { + basedir: dir, + moduleDirectory: 'xmodules' + }; + resolve('aaa', xopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/xmodules/aaa/index.js')); + }); + + var yopts = { + basedir: dir, + moduleDirectory: 'ymodules' + }; + resolve('aaa', yopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/ymodules/aaa/index.js')); + }); +}); + +test('moduleDirectory array', function (t) { + t.plan(6); + var dir = path.join(__dirname, 'module_dir'); + var aopts = { + basedir: dir, + moduleDirectory: ['xmodules', 'ymodules', 'zmodules'] + }; + resolve('aaa', aopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/xmodules/aaa/index.js')); + }); + + var bopts = { + basedir: dir, + moduleDirectory: ['zmodules', 'ymodules', 'xmodules'] + }; + resolve('aaa', bopts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/ymodules/aaa/index.js')); + }); + + var copts = { + basedir: dir, + moduleDirectory: ['xmodules', 'ymodules', 'zmodules'] + }; + resolve('bbb', copts, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, '/zmodules/bbb/main.js')); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/module_dir/xmodules/aaa/index.js b/packages/字体精简工具/node_modules/resolve/test/module_dir/xmodules/aaa/index.js new file mode 100644 index 0000000..dd7cf7b --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/module_dir/xmodules/aaa/index.js @@ -0,0 +1 @@ +module.exports = function (x) { return x * 100; }; diff --git a/packages/字体精简工具/node_modules/resolve/test/module_dir/ymodules/aaa/index.js b/packages/字体精简工具/node_modules/resolve/test/module_dir/ymodules/aaa/index.js new file mode 100644 index 0000000..ef2d4d4 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/module_dir/ymodules/aaa/index.js @@ -0,0 +1 @@ +module.exports = function (x) { return x + 100; }; diff --git a/packages/字体精简工具/node_modules/resolve/test/module_dir/zmodules/bbb/main.js b/packages/字体精简工具/node_modules/resolve/test/module_dir/zmodules/bbb/main.js new file mode 100644 index 0000000..e8ba629 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/module_dir/zmodules/bbb/main.js @@ -0,0 +1 @@ +module.exports = function (n) { return n * 111; }; diff --git a/packages/字体精简工具/node_modules/resolve/test/module_dir/zmodules/bbb/package.json b/packages/字体精简工具/node_modules/resolve/test/module_dir/zmodules/bbb/package.json new file mode 100644 index 0000000..c13b8cf --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/module_dir/zmodules/bbb/package.json @@ -0,0 +1,3 @@ +{ + "main": "main.js" +} diff --git a/packages/字体精简工具/node_modules/resolve/test/node-modules-paths.js b/packages/字体精简工具/node_modules/resolve/test/node-modules-paths.js new file mode 100644 index 0000000..675441d --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/node-modules-paths.js @@ -0,0 +1,143 @@ +var test = require('tape'); +var path = require('path'); +var parse = path.parse || require('path-parse'); +var keys = require('object-keys'); + +var nodeModulesPaths = require('../lib/node-modules-paths'); + +var verifyDirs = function verifyDirs(t, start, dirs, moduleDirectories, paths) { + var moduleDirs = [].concat(moduleDirectories || 'node_modules'); + if (paths) { + for (var k = 0; k < paths.length; ++k) { + moduleDirs.push(path.basename(paths[k])); + } + } + + var foundModuleDirs = {}; + var uniqueDirs = {}; + var parsedDirs = {}; + for (var i = 0; i < dirs.length; ++i) { + var parsed = parse(dirs[i]); + if (!foundModuleDirs[parsed.base]) { foundModuleDirs[parsed.base] = 0; } + foundModuleDirs[parsed.base] += 1; + parsedDirs[parsed.dir] = true; + uniqueDirs[dirs[i]] = true; + } + t.equal(keys(parsedDirs).length >= start.split(path.sep).length, true, 'there are >= dirs than "start" has'); + var foundModuleDirNames = keys(foundModuleDirs); + t.deepEqual(foundModuleDirNames, moduleDirs, 'all desired module dirs were found'); + t.equal(keys(uniqueDirs).length, dirs.length, 'all dirs provided were unique'); + + var counts = {}; + for (var j = 0; j < foundModuleDirNames.length; ++j) { + counts[foundModuleDirs[j]] = true; + } + t.equal(keys(counts).length, 1, 'all found module directories had the same count'); +}; + +test('node-modules-paths', function (t) { + t.test('no options', function (t) { + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start); + + verifyDirs(t, start, dirs); + + t.end(); + }); + + t.test('empty options', function (t) { + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, {}); + + verifyDirs(t, start, dirs); + + t.end(); + }); + + t.test('with paths=array option', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var dirs = nodeModulesPaths(start, { paths: paths }); + + verifyDirs(t, start, dirs, null, paths); + + t.end(); + }); + + t.test('with paths=function option', function (t) { + var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) { + return getNodeModulesDirs().concat(path.join(absoluteStart, 'not node modules', request)); + }; + + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, { paths: paths }, 'pkg'); + + verifyDirs(t, start, dirs, null, [path.join(start, 'not node modules', 'pkg')]); + + t.end(); + }); + + t.test('with paths=function skipping node modules resolution', function (t) { + var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) { + return []; + }; + var start = path.join(__dirname, 'resolver'); + var dirs = nodeModulesPaths(start, { paths: paths }); + t.deepEqual(dirs, [], 'no node_modules was computed'); + t.end(); + }); + + t.test('with moduleDirectory option', function (t) { + var start = path.join(__dirname, 'resolver'); + var moduleDirectory = 'not node modules'; + var dirs = nodeModulesPaths(start, { moduleDirectory: moduleDirectory }); + + verifyDirs(t, start, dirs, moduleDirectory); + + t.end(); + }); + + t.test('with 1 moduleDirectory and paths options', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var moduleDirectory = 'not node modules'; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectory }); + + verifyDirs(t, start, dirs, moduleDirectory, paths); + + t.end(); + }); + + t.test('with 1+ moduleDirectory and paths options', function (t) { + var start = path.join(__dirname, 'resolver'); + var paths = ['a', 'b']; + var moduleDirectories = ['not node modules', 'other modules']; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + verifyDirs(t, start, dirs, moduleDirectories, paths); + + t.end(); + }); + + t.test('combine paths correctly on Windows', function (t) { + var start = 'C:\\Users\\username\\myProject\\src'; + var paths = []; + var moduleDirectories = ['node_modules', start]; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir'); + + t.end(); + }); + + t.test('combine paths correctly on non-Windows', { skip: process.platform === 'win32' }, function (t) { + var start = '/Users/username/git/myProject/src'; + var paths = []; + var moduleDirectories = ['node_modules', '/Users/username/git/myProject/src']; + var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories }); + + t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir'); + + t.end(); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/node_path.js b/packages/字体精简工具/node_modules/resolve/test/node_path.js new file mode 100644 index 0000000..d06aa4e --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/node_path.js @@ -0,0 +1,70 @@ +var fs = require('fs'); +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('$NODE_PATH', function (t) { + t.plan(8); + + var isDir = function (dir, cb) { + if (dir === '/node_path' || dir === 'node_path/x') { + return cb(null, true); + } + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); + }; + + resolve('aaa', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/x/aaa/index.js'), 'aaa resolves'); + }); + + resolve('bbb', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/y/bbb/index.js'), 'bbb resolves'); + }); + + resolve('ccc', { + paths: [ + path.join(__dirname, '/node_path/x'), + path.join(__dirname, '/node_path/y') + ], + basedir: __dirname, + isDirectory: isDir + }, function (err, res) { + t.error(err); + t.equal(res, path.join(__dirname, '/node_path/x/ccc/index.js'), 'ccc resolves'); + }); + + // ensure that relative paths still resolve against the regular `node_modules` correctly + resolve('tap', { + paths: [ + 'node_path' + ], + basedir: path.join(__dirname, 'node_path/x'), + isDirectory: isDir + }, function (err, res) { + var root = require('tap/package.json').main; + t.error(err); + t.equal(res, path.resolve(__dirname, '..', 'node_modules/tap', root), 'tap resolves'); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/node_path/x/aaa/index.js b/packages/字体精简工具/node_modules/resolve/test/node_path/x/aaa/index.js new file mode 100644 index 0000000..ad70d0b --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/node_path/x/aaa/index.js @@ -0,0 +1 @@ +module.exports = 'A'; diff --git a/packages/字体精简工具/node_modules/resolve/test/node_path/x/ccc/index.js b/packages/字体精简工具/node_modules/resolve/test/node_path/x/ccc/index.js new file mode 100644 index 0000000..a64132e --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/node_path/x/ccc/index.js @@ -0,0 +1 @@ +module.exports = 'C'; diff --git a/packages/字体精简工具/node_modules/resolve/test/node_path/y/bbb/index.js b/packages/字体精简工具/node_modules/resolve/test/node_path/y/bbb/index.js new file mode 100644 index 0000000..4d0f32e --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/node_path/y/bbb/index.js @@ -0,0 +1 @@ +module.exports = 'B'; diff --git a/packages/字体精简工具/node_modules/resolve/test/node_path/y/ccc/index.js b/packages/字体精简工具/node_modules/resolve/test/node_path/y/ccc/index.js new file mode 100644 index 0000000..793315e --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/node_path/y/ccc/index.js @@ -0,0 +1 @@ +module.exports = 'CY'; diff --git a/packages/字体精简工具/node_modules/resolve/test/nonstring.js b/packages/字体精简工具/node_modules/resolve/test/nonstring.js new file mode 100644 index 0000000..ef63c40 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/nonstring.js @@ -0,0 +1,9 @@ +var test = require('tape'); +var resolve = require('../'); + +test('nonstring', function (t) { + t.plan(1); + resolve(555, function (err, res, pkg) { + t.ok(err); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/pathfilter.js b/packages/字体精简工具/node_modules/resolve/test/pathfilter.js new file mode 100644 index 0000000..16519ae --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/pathfilter.js @@ -0,0 +1,75 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +var resolverDir = path.join(__dirname, '/pathfilter/deep_ref'); + +var pathFilterFactory = function (t) { + return function (pkg, x, remainder) { + t.equal(pkg.version, '1.2.3'); + t.equal(x, path.join(resolverDir, 'node_modules/deep/ref')); + t.equal(remainder, 'ref'); + return 'alt'; + }; +}; + +test('#62: deep module references and the pathFilter', function (t) { + t.test('deep/ref.js', function (st) { + st.plan(3); + + resolve('deep/ref', { basedir: resolverDir }, function (err, res, pkg) { + if (err) st.fail(err); + + st.equal(pkg.version, '1.2.3'); + st.equal(res, path.join(resolverDir, 'node_modules/deep/ref.js')); + }); + + var res = resolve.sync('deep/ref', { basedir: resolverDir }); + st.equal(res, path.join(resolverDir, 'node_modules/deep/ref.js')); + }); + + t.test('deep/deeper/ref', function (st) { + st.plan(4); + + resolve( + 'deep/deeper/ref', + { basedir: resolverDir }, + function (err, res, pkg) { + if (err) t.fail(err); + st.notEqual(pkg, undefined); + st.equal(pkg.version, '1.2.3'); + st.equal(res, path.join(resolverDir, 'node_modules/deep/deeper/ref.js')); + } + ); + + var res = resolve.sync( + 'deep/deeper/ref', + { basedir: resolverDir } + ); + st.equal(res, path.join(resolverDir, 'node_modules/deep/deeper/ref.js')); + }); + + t.test('deep/ref alt', function (st) { + st.plan(8); + + var pathFilter = pathFilterFactory(st); + + var res = resolve.sync( + 'deep/ref', + { basedir: resolverDir, pathFilter: pathFilter } + ); + st.equal(res, path.join(resolverDir, 'node_modules/deep/alt.js')); + + resolve( + 'deep/ref', + { basedir: resolverDir, pathFilter: pathFilter }, + function (err, res, pkg) { + if (err) st.fail(err); + st.equal(res, path.join(resolverDir, 'node_modules/deep/alt.js')); + st.end(); + } + ); + }); + + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/pathfilter/deep_ref/main.js b/packages/字体精简工具/node_modules/resolve/test/pathfilter/deep_ref/main.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/precedence.js b/packages/字体精简工具/node_modules/resolve/test/precedence.js new file mode 100644 index 0000000..2febb59 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/precedence.js @@ -0,0 +1,23 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('precedence', function (t) { + t.plan(3); + var dir = path.join(__dirname, 'precedence/aaa'); + + resolve('./', { basedir: dir }, function (err, res, pkg) { + t.ifError(err); + t.equal(res, path.join(dir, 'index.js')); + t.equal(pkg.name, 'resolve'); + }); +}); + +test('./ should not load ${dir}.js', function (t) { // eslint-disable-line no-template-curly-in-string + t.plan(1); + var dir = path.join(__dirname, 'precedence/bbb'); + + resolve('./', { basedir: dir }, function (err, res, pkg) { + t.ok(err); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/precedence/aaa.js b/packages/字体精简工具/node_modules/resolve/test/precedence/aaa.js new file mode 100644 index 0000000..b83a3e7 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/precedence/aaa.js @@ -0,0 +1 @@ +module.exports = 'wtf'; diff --git a/packages/字体精简工具/node_modules/resolve/test/precedence/aaa/index.js b/packages/字体精简工具/node_modules/resolve/test/precedence/aaa/index.js new file mode 100644 index 0000000..e0f8f6a --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/precedence/aaa/index.js @@ -0,0 +1 @@ +module.exports = 'okok'; diff --git a/packages/字体精简工具/node_modules/resolve/test/precedence/aaa/main.js b/packages/字体精简工具/node_modules/resolve/test/precedence/aaa/main.js new file mode 100644 index 0000000..93542a9 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/precedence/aaa/main.js @@ -0,0 +1 @@ +console.log(require('./')); diff --git a/packages/字体精简工具/node_modules/resolve/test/precedence/bbb.js b/packages/字体精简工具/node_modules/resolve/test/precedence/bbb.js new file mode 100644 index 0000000..2298f47 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/precedence/bbb.js @@ -0,0 +1 @@ +module.exports = '>_<'; diff --git a/packages/字体精简工具/node_modules/resolve/test/precedence/bbb/main.js b/packages/字体精简工具/node_modules/resolve/test/precedence/bbb/main.js new file mode 100644 index 0000000..716b81d --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/precedence/bbb/main.js @@ -0,0 +1 @@ +console.log(require('./')); // should throw diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver.js b/packages/字体精简工具/node_modules/resolve/test/resolver.js new file mode 100644 index 0000000..aa36ee1 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver.js @@ -0,0 +1,450 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('async foo', function (t) { + t.plan(12); + var dir = path.join(__dirname, 'resolver'); + + resolve('./foo', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.name, 'resolve'); + }); + + resolve('./foo.js', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.name, 'resolve'); + }); + + resolve('./foo', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg && pkg.main, 'resolver'); + }); + + resolve('./foo.js', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + t.equal(pkg.main, 'resolver'); + }); + + resolve('./foo', { basedir: dir, filename: path.join(dir, 'baz.js') }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo.js')); + }); + + resolve('foo', { basedir: dir }, function (err) { + t.equal(err.message, "Cannot find module 'foo' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + // Test that filename is reported as the "from" value when passed. + resolve('foo', { basedir: dir, filename: path.join(dir, 'baz.js') }, function (err) { + t.equal(err.message, "Cannot find module 'foo' from '" + path.join(dir, 'baz.js') + "'"); + }); +}); + +test('bar', function (t) { + t.plan(6); + var dir = path.join(__dirname, 'resolver'); + + resolve('foo', { basedir: dir + '/bar' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg, undefined); + }); + + resolve('foo', { basedir: dir + '/bar' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg, undefined); + }); + + resolve('foo', { basedir: dir + '/bar', 'package': { main: 'bar' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js')); + t.equal(pkg.main, 'bar'); + }); +}); + +test('baz', function (t) { + t.plan(4); + var dir = path.join(__dirname, 'resolver'); + + resolve('./baz', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'baz/quux.js')); + t.equal(pkg.main, 'quux.js'); + }); + + resolve('./baz', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'baz/quux.js')); + t.equal(pkg.main, 'quux.js'); + }); +}); + +test('biz', function (t) { + t.plan(24); + var dir = path.join(__dirname, 'resolver/biz/node_modules'); + + resolve('./grux', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg, undefined); + }); + + resolve('./grux', { basedir: dir, 'package': { main: 'biz' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg.main, 'biz'); + }); + + resolve('./garply', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('./garply', { basedir: dir, 'package': { main: 'biz' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('tiv', { basedir: dir + '/grux' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg, undefined); + }); + + resolve('tiv', { basedir: dir + '/grux', 'package': { main: 'grux' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg.main, 'grux'); + }); + + resolve('tiv', { basedir: dir + '/garply' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg, undefined); + }); + + resolve('tiv', { basedir: dir + '/garply', 'package': { main: './lib' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'tiv/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('grux', { basedir: dir + '/tiv' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg, undefined); + }); + + resolve('grux', { basedir: dir + '/tiv', 'package': { main: 'tiv' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'grux/index.js')); + t.equal(pkg.main, 'tiv'); + }); + + resolve('garply', { basedir: dir + '/tiv' }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); + + resolve('garply', { basedir: dir + '/tiv', 'package': { main: 'tiv' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'garply/lib/index.js')); + t.equal(pkg.main, './lib'); + }); +}); + +test('quux', function (t) { + t.plan(2); + var dir = path.join(__dirname, 'resolver/quux'); + + resolve('./foo', { basedir: dir, 'package': { main: 'quux' } }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'foo/index.js')); + t.equal(pkg.main, 'quux'); + }); +}); + +test('normalize', function (t) { + t.plan(2); + var dir = path.join(__dirname, 'resolver/biz/node_modules/grux'); + + resolve('../grux', { basedir: dir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'index.js')); + t.equal(pkg, undefined); + }); +}); + +test('cup', function (t) { + t.plan(5); + var dir = path.join(__dirname, 'resolver'); + + resolve('./cup', { basedir: dir, extensions: ['.js', '.coffee'] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'cup.coffee')); + }); + + resolve('./cup.coffee', { basedir: dir }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'cup.coffee')); + }); + + resolve('./cup', { basedir: dir, extensions: ['.js'] }, function (err, res) { + t.equal(err.message, "Cannot find module './cup' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + // Test that filename is reported as the "from" value when passed. + resolve('./cup', { basedir: dir, extensions: ['.js'], filename: path.join(dir, 'cupboard.js') }, function (err, res) { + t.equal(err.message, "Cannot find module './cup' from '" + path.join(dir, 'cupboard.js') + "'"); + }); +}); + +test('mug', function (t) { + t.plan(3); + var dir = path.join(__dirname, 'resolver'); + + resolve('./mug', { basedir: dir }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'mug.js')); + }); + + resolve('./mug', { basedir: dir, extensions: ['.coffee', '.js'] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(dir, '/mug.coffee')); + }); + + resolve('./mug', { basedir: dir, extensions: ['.js', '.coffee'] }, function (err, res) { + t.equal(res, path.join(dir, '/mug.js')); + }); +}); + +test('other path', function (t) { + t.plan(6); + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'bar'); + var otherDir = path.join(resolverDir, 'other_path'); + + resolve('root', { basedir: dir, paths: [otherDir] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'other_path/root.js')); + }); + + resolve('lib/other-lib', { basedir: dir, paths: [otherDir] }, function (err, res) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'other_path/lib/other-lib.js')); + }); + + resolve('root', { basedir: dir }, function (err, res) { + t.equal(err.message, "Cannot find module 'root' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); + + resolve('zzz', { basedir: dir, paths: [otherDir] }, function (err, res) { + t.equal(err.message, "Cannot find module 'zzz' from '" + path.resolve(dir) + "'"); + t.equal(err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('path iterator', function (t) { + t.plan(2); + + var resolverDir = path.join(__dirname, 'resolver'); + + var exactIterator = function (x, start, getPackageCandidates, opts) { + return [path.join(resolverDir, x)]; + }; + + resolve('baz', { packageIterator: exactIterator }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(resolverDir, 'baz/quux.js')); + t.equal(pkg && pkg.name, 'baz'); + }); +}); + +test('incorrect main', function (t) { + t.plan(1); + + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'incorrect_main'); + + resolve('./incorrect_main', { basedir: resolverDir }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'index.js')); + }); +}); + +test('without basedir', function (t) { + t.plan(1); + + var dir = path.join(__dirname, 'resolver/without_basedir'); + var tester = require(path.join(dir, 'main.js')); + + tester(t, function (err, res, pkg) { + if (err) { + t.fail(err); + } else { + t.equal(res, path.join(dir, 'node_modules/mymodule.js')); + } + }); +}); + +test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) { + t.plan(2); + + var dir = path.join(__dirname, 'resolver'); + + resolve('./foo', { basedir: path.join(dir, 'same_names') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo.js')); + }); + + resolve('./foo/', { basedir: path.join(dir, 'same_names') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); +}); + +test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) { + t.plan(2); + + var dir = path.join(__dirname, 'resolver'); + + resolve('./', { basedir: path.join(dir, 'same_names/foo') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); + + resolve('.', { basedir: path.join(dir, 'same_names/foo') }, function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'same_names/foo/index.js')); + }); +}); + +test('async: #121 - treating an existing file as a dir when no basedir', function (t) { + var testFile = path.basename(__filename); + + t.test('sanity check', function (st) { + st.plan(1); + resolve('./' + testFile, function (err, res, pkg) { + if (err) t.fail(err); + st.equal(res, __filename, 'sanity check'); + }); + }); + + t.test('with a fake directory', function (st) { + st.plan(4); + + resolve('./' + testFile + '/blah', function (err, res, pkg) { + st.ok(err, 'there is an error'); + st.notOk(res, 'no result'); + + st.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + st.equal( + err && err.message, + 'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'', + 'can not find nonexistent module' + ); + st.end(); + }); + }); + + t.end(); +}); + +test('async dot main', function (t) { + var start = new Date(); + t.plan(3); + resolve('./resolver/dot_main', function (err, ret) { + t.notOk(err); + t.equal(ret, path.join(__dirname, 'resolver/dot_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); + }); +}); + +test('async dot slash main', function (t) { + var start = new Date(); + t.plan(3); + resolve('./resolver/dot_slash_main', function (err, ret) { + t.notOk(err); + t.equal(ret, path.join(__dirname, 'resolver/dot_slash_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); + }); +}); + +test('not a directory', function (t) { + t.plan(6); + var path = './foo'; + resolve(path, { basedir: __filename }, function (err, res, pkg) { + t.ok(err, 'a non-directory errors'); + t.equal(arguments.length, 1); + t.equal(res, undefined); + t.equal(pkg, undefined); + + t.equal(err && err.message, 'Cannot find module \'' + path + '\' from \'' + __filename + '\''); + t.equal(err && err.code, 'MODULE_NOT_FOUND'); + }); +}); + +test('non-string "main" field in package.json', function (t) { + t.plan(5); + + var dir = path.join(__dirname, 'resolver'); + resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + t.equal(res, undefined, 'res is undefined'); + t.equal(pkg, undefined, 'pkg is undefined'); + }); +}); + +test('non-string "main" field in package.json', function (t) { + t.plan(5); + + var dir = path.join(__dirname, 'resolver'); + resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + t.equal(res, undefined, 'res is undefined'); + t.equal(pkg, undefined, 'pkg is undefined'); + }); +}); + +test('browser field in package.json', function (t) { + t.plan(3); + + var dir = path.join(__dirname, 'resolver'); + resolve( + './browser_field', + { + basedir: dir, + packageFilter: function packageFilter(pkg) { + if (pkg.browser) { + pkg.main = pkg.browser; // eslint-disable-line no-param-reassign + delete pkg.browser; // eslint-disable-line no-param-reassign + } + return pkg; + } + }, + function (err, res, pkg) { + if (err) t.fail(err); + t.equal(res, path.join(dir, 'browser_field', 'b.js')); + t.equal(pkg && pkg.main, 'b'); + t.equal(pkg && pkg.browser, undefined); + } + ); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/baz/doom.js b/packages/字体精简工具/node_modules/resolve/test/resolver/baz/doom.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/baz/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/baz/package.json new file mode 100644 index 0000000..2f77720 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/baz/package.json @@ -0,0 +1,4 @@ +{ + "name": "baz", + "main": "quux.js" +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/baz/quux.js b/packages/字体精简工具/node_modules/resolve/test/resolver/baz/quux.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/baz/quux.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/browser_field/a.js b/packages/字体精简工具/node_modules/resolve/test/resolver/browser_field/a.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/browser_field/b.js b/packages/字体精简工具/node_modules/resolve/test/resolver/browser_field/b.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/browser_field/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/browser_field/package.json new file mode 100644 index 0000000..bf406f0 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/browser_field/package.json @@ -0,0 +1,5 @@ +{ + "name": "browser_field", + "main": "a", + "browser": "b" +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/cup.coffee b/packages/字体精简工具/node_modules/resolve/test/resolver/cup.coffee new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/cup.coffee @@ -0,0 +1 @@ + diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/dot_main/index.js b/packages/字体精简工具/node_modules/resolve/test/resolver/dot_main/index.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/dot_main/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/dot_main/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/dot_main/package.json new file mode 100644 index 0000000..d7f4fc8 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/dot_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "." +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/dot_slash_main/index.js b/packages/字体精简工具/node_modules/resolve/test/resolver/dot_slash_main/index.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/dot_slash_main/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/dot_slash_main/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/dot_slash_main/package.json new file mode 100644 index 0000000..f51287b --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/dot_slash_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "./" +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/foo.js b/packages/字体精简工具/node_modules/resolve/test/resolver/foo.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/foo.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/incorrect_main/index.js b/packages/字体精简工具/node_modules/resolve/test/resolver/incorrect_main/index.js new file mode 100644 index 0000000..bc1fb0a --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/incorrect_main/index.js @@ -0,0 +1,2 @@ +// this is the actual main file 'index.js', not 'wrong.js' like the package.json would indicate +module.exports = 1; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/incorrect_main/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/incorrect_main/package.json new file mode 100644 index 0000000..b718804 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/incorrect_main/package.json @@ -0,0 +1,3 @@ +{ + "main": "wrong.js" +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/invalid_main/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/invalid_main/package.json new file mode 100644 index 0000000..0cf8279 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/invalid_main/package.json @@ -0,0 +1,7 @@ +{ + "name": "invalid main", + "main": [ + "why is this a thing", + "srsly omg wtf" + ] +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/mug.coffee b/packages/字体精简工具/node_modules/resolve/test/resolver/mug.coffee new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/mug.js b/packages/字体精简工具/node_modules/resolve/test/resolver/mug.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/lerna.json b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/lerna.json new file mode 100644 index 0000000..d6707ca --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/lerna.json @@ -0,0 +1,6 @@ +{ + "packages": [ + "packages/*" + ], + "version": "0.0.0" +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/package.json new file mode 100644 index 0000000..8508f9d --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/package.json @@ -0,0 +1,20 @@ +{ + "name": "monorepo-symlink-test", + "private": true, + "version": "0.0.0", + "description": "", + "main": "index.js", + "scripts": { + "postinstall": "lerna bootstrap", + "test": "node packages/package-a" + }, + "author": "", + "license": "MIT", + "dependencies": { + "jquery": "^3.3.1", + "resolve": "../../../" + }, + "devDependencies": { + "lerna": "^3.4.3" + } +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js new file mode 100644 index 0000000..8875a32 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js @@ -0,0 +1,35 @@ +'use strict'; + +var assert = require('assert'); +var path = require('path'); +var resolve = require('resolve'); + +var basedir = __dirname + '/node_modules/@my-scope/package-b'; + +var expected = path.join(__dirname, '../../node_modules/jquery/dist/jquery.js'); + +/* + * preserveSymlinks === false + * will search NPM package from + * - packages/package-b/node_modules + * - packages/node_modules + * - node_modules + */ +assert.equal(resolve.sync('jquery', { basedir: basedir, preserveSymlinks: false }), expected); +assert.equal(resolve.sync('../../node_modules/jquery', { basedir: basedir, preserveSymlinks: false }), expected); + +/* + * preserveSymlinks === true + * will search NPM package from + * - packages/package-a/node_modules/@my-scope/packages/package-b/node_modules + * - packages/package-a/node_modules/@my-scope/packages/node_modules + * - packages/package-a/node_modules/@my-scope/node_modules + * - packages/package-a/node_modules/node_modules + * - packages/package-a/node_modules + * - packages/node_modules + * - node_modules + */ +assert.equal(resolve.sync('jquery', { basedir: basedir, preserveSymlinks: true }), expected); +assert.equal(resolve.sync('../../../../../node_modules/jquery', { basedir: basedir, preserveSymlinks: true }), expected); + +console.log(' * all monorepo paths successfully resolved through symlinks'); diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json new file mode 100644 index 0000000..204de51 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json @@ -0,0 +1,14 @@ +{ + "name": "@my-scope/package-a", + "version": "0.0.0", + "private": true, + "description": "", + "license": "MIT", + "main": "index.js", + "scripts": { + "test": "echo \"Error: run tests from root\" && exit 1" + }, + "dependencies": { + "@my-scope/package-b": "^0.0.0" + } +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json new file mode 100644 index 0000000..f57c3b5 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json @@ -0,0 +1,14 @@ +{ + "name": "@my-scope/package-b", + "private": true, + "version": "0.0.0", + "description": "", + "license": "MIT", + "main": "index.js", + "scripts": { + "test": "echo \"Error: run tests from root\" && exit 1" + }, + "dependencies": { + "@my-scope/package-a": "^0.0.0" + } +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js b/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js new file mode 100644 index 0000000..9b4846a --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js @@ -0,0 +1,26 @@ +var a = require.resolve('buffer/').replace(process.cwd(), '$CWD'); +var b; +var c; + +var test = function test() { + console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false')); + console.log(b, ': preserveSymlinks true'); + console.log(c, ': preserveSymlinks false'); + + if (a !== b && a !== c) { + throw 'async: no match'; + } + console.log('async: success! a matched either b or c\n'); +}; + +require('resolve')('buffer/', { preserveSymlinks: true }, function (err, result) { + if (err) { throw err; } + b = result.replace(process.cwd(), '$CWD'); + if (b && c) { test(); } +}); +require('resolve')('buffer/', { preserveSymlinks: false }, function (err, result) { + if (err) { throw err; } + c = result.replace(process.cwd(), '$CWD'); + if (b && c) { test(); } +}); + diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json new file mode 100644 index 0000000..acfe9e9 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json @@ -0,0 +1,15 @@ +{ + "name": "mylib", + "version": "0.0.0", + "description": "", + "private": true, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "buffer": "*" + } +} diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js b/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js new file mode 100644 index 0000000..3283efc --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js @@ -0,0 +1,12 @@ +var a = require.resolve('buffer/').replace(process.cwd(), '$CWD'); +var b = require('resolve').sync('buffer/', { preserveSymlinks: true }).replace(process.cwd(), '$CWD'); +var c = require('resolve').sync('buffer/', { preserveSymlinks: false }).replace(process.cwd(), '$CWD'); + +console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false')); +console.log(b, ': preserveSymlinks true'); +console.log(c, ': preserveSymlinks false'); + +if (a !== b && a !== c) { + throw 'sync: no match'; +} +console.log('sync: success! a matched either b or c\n'); diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/other_path/lib/other-lib.js b/packages/字体精简工具/node_modules/resolve/test/resolver/other_path/lib/other-lib.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/other_path/root.js b/packages/字体精简工具/node_modules/resolve/test/resolver/other_path/root.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/quux/foo/index.js b/packages/字体精简工具/node_modules/resolve/test/resolver/quux/foo/index.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/quux/foo/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/same_names/foo.js b/packages/字体精简工具/node_modules/resolve/test/resolver/same_names/foo.js new file mode 100644 index 0000000..888cae3 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/same_names/foo.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/same_names/foo/index.js b/packages/字体精简工具/node_modules/resolve/test/resolver/same_names/foo/index.js new file mode 100644 index 0000000..bd816ea --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/same_names/foo/index.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js b/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep b/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/package/bar.js b/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/package/bar.js new file mode 100644 index 0000000..cb1c2c0 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/package/bar.js @@ -0,0 +1 @@ +module.exports = 'bar'; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/package/package.json b/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/package/package.json new file mode 100644 index 0000000..8e1b585 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/symlinked/package/package.json @@ -0,0 +1,3 @@ +{ + "main": "bar.js" +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver/without_basedir/main.js b/packages/字体精简工具/node_modules/resolve/test/resolver/without_basedir/main.js new file mode 100644 index 0000000..5b31975 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver/without_basedir/main.js @@ -0,0 +1,5 @@ +var resolve = require('../../../'); + +module.exports = function (t, cb) { + resolve('mymodule', null, cb); +}; diff --git a/packages/字体精简工具/node_modules/resolve/test/resolver_sync.js b/packages/字体精简工具/node_modules/resolve/test/resolver_sync.js new file mode 100644 index 0000000..3082c96 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/resolver_sync.js @@ -0,0 +1,358 @@ +var path = require('path'); +var test = require('tape'); +var resolve = require('../'); + +test('foo', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./foo', { basedir: dir }), + path.join(dir, 'foo.js') + ); + + t.equal( + resolve.sync('./foo.js', { basedir: dir }), + path.join(dir, 'foo.js') + ); + + t.equal( + resolve.sync('./foo.js', { basedir: dir, filename: path.join(dir, 'bar.js') }), + path.join(dir, 'foo.js') + ); + + t.throws(function () { + resolve.sync('foo', { basedir: dir }); + }); + + // Test that filename is reported as the "from" value when passed. + t.throws( + function () { + resolve.sync('foo', { basedir: dir, filename: path.join(dir, 'bar.js') }); + }, + { + name: 'Error', + message: "Cannot find module 'foo' from '" + path.join(dir, 'bar.js') + "'" + } + ); + + t.end(); +}); + +test('bar', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('foo', { basedir: path.join(dir, 'bar') }), + path.join(dir, 'bar/node_modules/foo/index.js') + ); + t.end(); +}); + +test('baz', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./baz', { basedir: dir }), + path.join(dir, 'baz/quux.js') + ); + t.end(); +}); + +test('biz', function (t) { + var dir = path.join(__dirname, 'resolver/biz/node_modules'); + t.equal( + resolve.sync('./grux', { basedir: dir }), + path.join(dir, 'grux/index.js') + ); + + t.equal( + resolve.sync('tiv', { basedir: path.join(dir, 'grux') }), + path.join(dir, 'tiv/index.js') + ); + + t.equal( + resolve.sync('grux', { basedir: path.join(dir, 'tiv') }), + path.join(dir, 'grux/index.js') + ); + t.end(); +}); + +test('normalize', function (t) { + var dir = path.join(__dirname, 'resolver/biz/node_modules/grux'); + t.equal( + resolve.sync('../grux', { basedir: dir }), + path.join(dir, 'index.js') + ); + t.end(); +}); + +test('cup', function (t) { + var dir = path.join(__dirname, 'resolver'); + t.equal( + resolve.sync('./cup', { + basedir: dir, + extensions: ['.js', '.coffee'] + }), + path.join(dir, 'cup.coffee') + ); + + t.equal( + resolve.sync('./cup.coffee', { basedir: dir }), + path.join(dir, 'cup.coffee') + ); + + t.throws(function () { + resolve.sync('./cup', { + basedir: dir, + extensions: ['.js'] + }); + }); + + t.end(); +}); + +test('mug', function (t) { + var dir = path.join(__dirname, 'resolver'); + t.equal( + resolve.sync('./mug', { basedir: dir }), + path.join(dir, 'mug.js') + ); + + t.equal( + resolve.sync('./mug', { + basedir: dir, + extensions: ['.coffee', '.js'] + }), + path.join(dir, 'mug.coffee') + ); + + t.equal( + resolve.sync('./mug', { + basedir: dir, + extensions: ['.js', '.coffee'] + }), + path.join(dir, 'mug.js') + ); + + t.end(); +}); + +test('other path', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'bar'); + var otherDir = path.join(resolverDir, 'other_path'); + + t.equal( + resolve.sync('root', { + basedir: dir, + paths: [otherDir] + }), + path.join(resolverDir, 'other_path/root.js') + ); + + t.equal( + resolve.sync('lib/other-lib', { + basedir: dir, + paths: [otherDir] + }), + path.join(resolverDir, 'other_path/lib/other-lib.js') + ); + + t.throws(function () { + resolve.sync('root', { basedir: dir }); + }); + + t.throws(function () { + resolve.sync('zzz', { + basedir: dir, + paths: [otherDir] + }); + }); + + t.end(); +}); + +test('path iterator', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + + var exactIterator = function (x, start, getPackageCandidates, opts) { + return [path.join(resolverDir, x)]; + }; + + t.equal( + resolve.sync('baz', { packageIterator: exactIterator }), + path.join(resolverDir, 'baz/quux.js') + ); + + t.end(); +}); + +test('incorrect main', function (t) { + var resolverDir = path.join(__dirname, 'resolver'); + var dir = path.join(resolverDir, 'incorrect_main'); + + t.equal( + resolve.sync('./incorrect_main', { basedir: resolverDir }), + path.join(dir, 'index.js') + ); + + t.end(); +}); + +var stubStatSync = function stubStatSync(fn) { + var fs = require('fs'); + var statSync = fs.statSync; + try { + fs.statSync = function () { + throw new EvalError('Unknown Error'); + }; + return fn(); + } finally { + fs.statSync = statSync; + } +}; + +test('#79 - re-throw non ENOENT errors from stat', function (t) { + var dir = path.join(__dirname, 'resolver'); + + stubStatSync(function () { + t.throws(function () { + resolve.sync('foo', { basedir: dir }); + }, /Unknown Error/); + }); + + t.end(); +}); + +test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./foo', { basedir: path.join(dir, 'same_names') }), + path.join(dir, 'same_names/foo.js') + ); + t.equal( + resolve.sync('./foo/', { basedir: path.join(dir, 'same_names') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.end(); +}); + +test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) { + var dir = path.join(__dirname, 'resolver'); + + t.equal( + resolve.sync('./', { basedir: path.join(dir, 'same_names/foo') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.equal( + resolve.sync('.', { basedir: path.join(dir, 'same_names/foo') }), + path.join(dir, 'same_names/foo/index.js') + ); + t.end(); +}); + +test('sync: #121 - treating an existing file as a dir when no basedir', function (t) { + var testFile = path.basename(__filename); + + t.test('sanity check', function (st) { + st.equal( + resolve.sync('./' + testFile), + __filename, + 'sanity check' + ); + st.end(); + }); + + t.test('with a fake directory', function (st) { + function run() { return resolve.sync('./' + testFile + '/blah'); } + + st.throws(run, 'throws an error'); + + try { + run(); + } catch (e) { + st.equal(e.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + st.equal( + e.message, + 'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'', + 'can not find nonexistent module' + ); + } + + st.end(); + }); + + t.end(); +}); + +test('sync dot main', function (t) { + var start = new Date(); + t.equal(resolve.sync('./resolver/dot_main'), path.join(__dirname, 'resolver/dot_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('sync dot slash main', function (t) { + var start = new Date(); + t.equal(resolve.sync('./resolver/dot_slash_main'), path.join(__dirname, 'resolver/dot_slash_main/index.js')); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('not a directory', function (t) { + var path = './foo'; + try { + resolve.sync(path, { basedir: __filename }); + t.fail(); + } catch (err) { + t.ok(err, 'a non-directory errors'); + t.equal(err && err.message, 'Cannot find module \'' + path + "' from '" + __filename + "'"); + t.equal(err && err.code, 'MODULE_NOT_FOUND'); + } + t.end(); +}); + +test('non-string "main" field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + try { + var result = resolve.sync('./invalid_main', { basedir: dir }); + t.equal(result, undefined, 'result should not exist'); + t.fail('should not get here'); + } catch (err) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + } + t.end(); +}); + +test('non-string "main" field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + try { + var result = resolve.sync('./invalid_main', { basedir: dir }); + t.equal(result, undefined, 'result should not exist'); + t.fail('should not get here'); + } catch (err) { + t.ok(err, 'errors on non-string main'); + t.equal(err.message, 'package “invalid main” `main` must be a string'); + t.equal(err.code, 'INVALID_PACKAGE_MAIN'); + } + t.end(); +}); + +test('browser field in package.json', function (t) { + var dir = path.join(__dirname, 'resolver'); + var res = resolve.sync('./browser_field', { + basedir: dir, + packageFilter: function packageFilter(pkg) { + if (pkg.browser) { + pkg.main = pkg.browser; // eslint-disable-line no-param-reassign + delete pkg.browser; // eslint-disable-line no-param-reassign + } + return pkg; + } + }); + t.equal(res, path.join(dir, 'browser_field', 'b.js')); + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/shadowed_core.js b/packages/字体精简工具/node_modules/resolve/test/shadowed_core.js new file mode 100644 index 0000000..3a5f4fc --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/shadowed_core.js @@ -0,0 +1,54 @@ +var test = require('tape'); +var resolve = require('../'); +var path = require('path'); + +test('shadowed core modules still return core module', function (t) { + t.plan(2); + + resolve('util', { basedir: path.join(__dirname, 'shadowed_core') }, function (err, res) { + t.ifError(err); + t.equal(res, 'util'); + }); +}); + +test('shadowed core modules still return core module [sync]', function (t) { + t.plan(1); + + var res = resolve.sync('util', { basedir: path.join(__dirname, 'shadowed_core') }); + + t.equal(res, 'util'); +}); + +test('shadowed core modules return shadow when appending `/`', function (t) { + t.plan(2); + + resolve('util/', { basedir: path.join(__dirname, 'shadowed_core') }, function (err, res) { + t.ifError(err); + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); + }); +}); + +test('shadowed core modules return shadow when appending `/` [sync]', function (t) { + t.plan(1); + + var res = resolve.sync('util/', { basedir: path.join(__dirname, 'shadowed_core') }); + + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); +}); + +test('shadowed core modules return shadow with `includeCoreModules: false`', function (t) { + t.plan(2); + + resolve('util', { basedir: path.join(__dirname, 'shadowed_core'), includeCoreModules: false }, function (err, res) { + t.ifError(err); + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); + }); +}); + +test('shadowed core modules return shadow with `includeCoreModules: false` [sync]', function (t) { + t.plan(1); + + var res = resolve.sync('util', { basedir: path.join(__dirname, 'shadowed_core'), includeCoreModules: false }); + + t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js')); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/shadowed_core/node_modules/util/index.js b/packages/字体精简工具/node_modules/resolve/test/shadowed_core/node_modules/util/index.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/字体精简工具/node_modules/resolve/test/subdirs.js b/packages/字体精简工具/node_modules/resolve/test/subdirs.js new file mode 100644 index 0000000..b7b8450 --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/subdirs.js @@ -0,0 +1,13 @@ +var test = require('tape'); +var resolve = require('../'); +var path = require('path'); + +test('subdirs', function (t) { + t.plan(2); + + var dir = path.join(__dirname, '/subdirs'); + resolve('a/b/c/x.json', { basedir: dir }, function (err, res) { + t.ifError(err); + t.equal(res, path.join(dir, 'node_modules/a/b/c/x.json')); + }); +}); diff --git a/packages/字体精简工具/node_modules/resolve/test/symlinks.js b/packages/字体精简工具/node_modules/resolve/test/symlinks.js new file mode 100644 index 0000000..35f881a --- /dev/null +++ b/packages/字体精简工具/node_modules/resolve/test/symlinks.js @@ -0,0 +1,176 @@ +var path = require('path'); +var fs = require('fs'); +var test = require('tape'); +var map = require('array.prototype.map'); +var resolve = require('../'); + +var symlinkDir = path.join(__dirname, 'resolver', 'symlinked', 'symlink'); +var packageDir = path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'package'); +var modADir = path.join(__dirname, 'symlinks', 'source', 'node_modules', 'mod-a'); +var symlinkModADir = path.join(__dirname, 'symlinks', 'dest', 'node_modules', 'mod-a'); +try { + fs.unlinkSync(symlinkDir); +} catch (err) {} +try { + fs.unlinkSync(packageDir); +} catch (err) {} +try { + fs.unlinkSync(modADir); +} catch (err) {} +try { + fs.unlinkSync(symlinkModADir); +} catch (err) {} + +try { + fs.symlinkSync('./_/symlink_target', symlinkDir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, 'resolver', 'symlinked', '_', 'symlink_target') + '\\', symlinkDir, 'junction'); +} +try { + fs.symlinkSync('../../package', packageDir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, '..', '..', 'package') + '\\', packageDir, 'junction'); +} +try { + fs.symlinkSync('../../source/node_modules/mod-a', symlinkModADir, 'dir'); +} catch (err) { + // if fails then it is probably on Windows and lets try to create a junction + fs.symlinkSync(path.join(__dirname, '..', '..', 'source', 'node_modules', 'mod-a') + '\\', symlinkModADir, 'junction'); +} + +test('symlink', function (t) { + t.plan(2); + + resolve('foo', { basedir: symlinkDir, preserveSymlinks: false }, function (err, res, pkg) { + t.error(err); + t.equal(res, path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js')); + }); +}); + +test('sync symlink when preserveSymlinks = true', function (t) { + t.plan(4); + + resolve('foo', { basedir: symlinkDir }, function (err, res, pkg) { + t.ok(err, 'there is an error'); + t.notOk(res, 'no result'); + + t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve'); + t.equal( + err && err.message, + 'Cannot find module \'foo\' from \'' + symlinkDir + '\'', + 'can not find nonexistent module' + ); + }); +}); + +test('sync symlink', function (t) { + var start = new Date(); + t.doesNotThrow(function () { + t.equal( + resolve.sync('foo', { basedir: symlinkDir, preserveSymlinks: false }), + path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js') + ); + }); + t.ok(new Date() - start < 50, 'resolve.sync timedout'); + t.end(); +}); + +test('sync symlink when preserveSymlinks = true', function (t) { + t.throws(function () { + resolve.sync('foo', { basedir: symlinkDir }); + }, /Cannot find module 'foo'/); + t.end(); +}); + +test('sync symlink from node_modules to other dir when preserveSymlinks = false', function (t) { + var basedir = path.join(__dirname, 'resolver', 'symlinked', '_'); + var fn = resolve.sync('package', { basedir: basedir, preserveSymlinks: false }); + + t.equal(fn, path.resolve(__dirname, 'resolver/symlinked/package/bar.js')); + t.end(); +}); + +test('async symlink from node_modules to other dir when preserveSymlinks = false', function (t) { + t.plan(2); + var basedir = path.join(__dirname, 'resolver', 'symlinked', '_'); + resolve('package', { basedir: basedir, preserveSymlinks: false }, function (err, result) { + t.notOk(err, 'no error'); + t.equal(result, path.resolve(__dirname, 'resolver/symlinked/package/bar.js')); + }); +}); + +test('packageFilter', function (t) { + function relative(x) { + return path.relative(__dirname, x); + } + + function testPackageFilter(preserveSymlinks) { + return function (st) { + st.plan('is 1.x' ? 3 : 5); // eslint-disable-line no-constant-condition + + var destMain = 'symlinks/dest/node_modules/mod-a/index.js'; + var destPkg = 'symlinks/dest/node_modules/mod-a/package.json'; + var sourceMain = 'symlinks/source/node_modules/mod-a/index.js'; + var sourcePkg = 'symlinks/source/node_modules/mod-a/package.json'; + var destDir = path.join(__dirname, 'symlinks', 'dest'); + + /* eslint multiline-comment-style: 0 */ + /* v2.x will restore these tests + var packageFilterPath = []; + var actualPath = resolve.sync('mod-a', { + basedir: destDir, + preserveSymlinks: preserveSymlinks, + packageFilter: function (pkg, pkgfile, dir) { + packageFilterPath.push(pkgfile); + } + }); + st.equal( + relative(actualPath), + path.normalize(preserveSymlinks ? destMain : sourceMain), + 'sync: actual path is correct' + ); + st.deepEqual( + map(packageFilterPath, relative), + map(preserveSymlinks ? [destPkg, destPkg] : [sourcePkg, sourcePkg], path.normalize), + 'sync: packageFilter pkgfile arg is correct' + ); + */ + + var asyncPackageFilterPath = []; + resolve( + 'mod-a', + { + basedir: destDir, + preserveSymlinks: preserveSymlinks, + packageFilter: function (pkg, pkgfile) { + asyncPackageFilterPath.push(pkgfile); + } + }, + function (err, actualPath) { + st.error(err, 'no error'); + st.equal( + relative(actualPath), + path.normalize(preserveSymlinks ? destMain : sourceMain), + 'async: actual path is correct' + ); + st.deepEqual( + map(asyncPackageFilterPath, relative), + map( + preserveSymlinks ? [destPkg, destPkg, destPkg] : [sourcePkg, sourcePkg, sourcePkg], + path.normalize + ), + 'async: packageFilter pkgfile arg is correct' + ); + } + ); + }; + } + + t.test('preserveSymlinks: false', testPackageFilter(false)); + + t.test('preserveSymlinks: true', testPackageFilter(true)); + + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/rimraf/LICENSE b/packages/字体精简工具/node_modules/rimraf/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/packages/字体精简工具/node_modules/rimraf/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/字体精简工具/node_modules/rimraf/README.md b/packages/字体精简工具/node_modules/rimraf/README.md new file mode 100644 index 0000000..423b8cf --- /dev/null +++ b/packages/字体精简工具/node_modules/rimraf/README.md @@ -0,0 +1,101 @@ +[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies) + +The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node. + +Install with `npm install rimraf`, or just drop rimraf.js somewhere. + +## API + +`rimraf(f, [opts], callback)` + +The first parameter will be interpreted as a globbing pattern for files. If you +want to disable globbing you can do so with `opts.disableGlob` (defaults to +`false`). This might be handy, for instance, if you have filenames that contain +globbing wildcard characters. + +The callback will be called with an error if there is one. Certain +errors are handled for you: + +* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of + `opts.maxBusyTries` times before giving up, adding 100ms of wait + between each attempt. The default `maxBusyTries` is 3. +* `ENOENT` - If the file doesn't exist, rimraf will return + successfully, since your desired outcome is already the case. +* `EMFILE` - Since `readdir` requires opening a file descriptor, it's + possible to hit `EMFILE` if too many file descriptors are in use. + In the sync case, there's nothing to be done for this. But in the + async case, rimraf will gradually back off with timeouts up to + `opts.emfileWait` ms, which defaults to 1000. + +## options + +* unlink, chmod, stat, lstat, rmdir, readdir, + unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync + + In order to use a custom file system library, you can override + specific fs functions on the options object. + + If any of these functions are present on the options object, then + the supplied function will be used instead of the default fs + method. + + Sync methods are only relevant for `rimraf.sync()`, of course. + + For example: + + ```javascript + var myCustomFS = require('some-custom-fs') + + rimraf('some-thing', myCustomFS, callback) + ``` + +* maxBusyTries + + If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered + on Windows systems, then rimraf will retry with a linear backoff + wait of 100ms longer on each try. The default maxBusyTries is 3. + + Only relevant for async usage. + +* emfileWait + + If an `EMFILE` error is encountered, then rimraf will retry + repeatedly with a linear backoff of 1ms longer on each try, until + the timeout counter hits this max. The default limit is 1000. + + If you repeatedly encounter `EMFILE` errors, then consider using + [graceful-fs](http://npm.im/graceful-fs) in your program. + + Only relevant for async usage. + +* glob + + Set to `false` to disable [glob](http://npm.im/glob) pattern + matching. + + Set to an object to pass options to the glob module. The default + glob options are `{ nosort: true, silent: true }`. + + Glob version 6 is used in this module. + + Relevant for both sync and async usage. + +* disableGlob + + Set to any non-falsey value to disable globbing entirely. + (Equivalent to setting `glob: false`.) + +## rimraf.sync + +It can remove stuff synchronously, too. But that's not so good. Use +the async API. It's better. + +## CLI + +If installed with `npm install rimraf -g` it can be used as a global +command `rimraf [ ...]` which is useful for cross platform support. + +## mkdirp + +If you need to create a directory recursively, check out +[mkdirp](https://github.com/substack/node-mkdirp). diff --git a/packages/字体精简工具/node_modules/rimraf/bin.js b/packages/字体精简工具/node_modules/rimraf/bin.js new file mode 100644 index 0000000..0d1e17b --- /dev/null +++ b/packages/字体精简工具/node_modules/rimraf/bin.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node + +var rimraf = require('./') + +var help = false +var dashdash = false +var noglob = false +var args = process.argv.slice(2).filter(function(arg) { + if (dashdash) + return !!arg + else if (arg === '--') + dashdash = true + else if (arg === '--no-glob' || arg === '-G') + noglob = true + else if (arg === '--glob' || arg === '-g') + noglob = false + else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/)) + help = true + else + return !!arg +}) + +if (help || args.length === 0) { + // If they didn't ask for help, then this is not a "success" + var log = help ? console.log : console.error + log('Usage: rimraf [ ...]') + log('') + log(' Deletes all files and folders at "path" recursively.') + log('') + log('Options:') + log('') + log(' -h, --help Display this usage info') + log(' -G, --no-glob Do not expand glob patterns in arguments') + log(' -g, --glob Expand glob patterns in arguments (default)') + process.exit(help ? 0 : 1) +} else + go(0) + +function go (n) { + if (n >= args.length) + return + var options = {} + if (noglob) + options = { glob: false } + rimraf(args[n], options, function (er) { + if (er) + throw er + go(n+1) + }) +} diff --git a/packages/字体精简工具/node_modules/rimraf/package.json b/packages/字体精简工具/node_modules/rimraf/package.json new file mode 100644 index 0000000..524cca3 --- /dev/null +++ b/packages/字体精简工具/node_modules/rimraf/package.json @@ -0,0 +1,68 @@ +{ + "_from": "rimraf@2", + "_id": "rimraf@2.7.1", + "_inBundle": false, + "_integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "_location": "/rimraf", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "rimraf@2", + "name": "rimraf", + "escapedName": "rimraf", + "rawSpec": "2", + "saveSpec": null, + "fetchSpec": "2" + }, + "_requiredBy": [ + "/gulp-clean", + "/node-gyp" + ], + "_resolved": "https://registry.nlark.com/rimraf/download/rimraf-2.7.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", + "_shasum": "35797f13a7fdadc566142c29d4f07ccad483e3ec", + "_spec": "rimraf@2", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\node-gyp", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bin": { + "rimraf": "./bin.js" + }, + "bugs": { + "url": "https://github.com/isaacs/rimraf/issues" + }, + "bundleDependencies": false, + "dependencies": { + "glob": "^7.1.3" + }, + "deprecated": false, + "description": "A deep deletion module for node (like `rm -rf`)", + "devDependencies": { + "mkdirp": "^0.5.1", + "tap": "^12.1.1" + }, + "files": [ + "LICENSE", + "README.md", + "bin.js", + "rimraf.js" + ], + "homepage": "https://github.com/isaacs/rimraf#readme", + "license": "ISC", + "main": "rimraf.js", + "name": "rimraf", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/rimraf.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap test/*.js" + }, + "version": "2.7.1" +} diff --git a/packages/字体精简工具/node_modules/rimraf/rimraf.js b/packages/字体精简工具/node_modules/rimraf/rimraf.js new file mode 100644 index 0000000..a90ad02 --- /dev/null +++ b/packages/字体精简工具/node_modules/rimraf/rimraf.js @@ -0,0 +1,372 @@ +module.exports = rimraf +rimraf.sync = rimrafSync + +var assert = require("assert") +var path = require("path") +var fs = require("fs") +var glob = undefined +try { + glob = require("glob") +} catch (_err) { + // treat glob as optional. +} +var _0666 = parseInt('666', 8) + +var defaultGlobOpts = { + nosort: true, + silent: true +} + +// for EMFILE handling +var timeout = 0 + +var isWindows = (process.platform === "win32") + +function defaults (options) { + var methods = [ + 'unlink', + 'chmod', + 'stat', + 'lstat', + 'rmdir', + 'readdir' + ] + methods.forEach(function(m) { + options[m] = options[m] || fs[m] + m = m + 'Sync' + options[m] = options[m] || fs[m] + }) + + options.maxBusyTries = options.maxBusyTries || 3 + options.emfileWait = options.emfileWait || 1000 + if (options.glob === false) { + options.disableGlob = true + } + if (options.disableGlob !== true && glob === undefined) { + throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') + } + options.disableGlob = options.disableGlob || false + options.glob = options.glob || defaultGlobOpts +} + +function rimraf (p, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert.equal(typeof cb, 'function', 'rimraf: callback function required') + assert(options, 'rimraf: invalid options argument provided') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + defaults(options) + + var busyTries = 0 + var errState = null + var n = 0 + + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]) + + options.lstat(p, function (er, stat) { + if (!er) + return afterGlob(null, [p]) + + glob(p, options.glob, afterGlob) + }) + + function next (er) { + errState = errState || er + if (--n === 0) + cb(errState) + } + + function afterGlob (er, results) { + if (er) + return cb(er) + + n = results.length + if (n === 0) + return cb() + + results.forEach(function (p) { + rimraf_(p, options, function CB (er) { + if (er) { + if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && + busyTries < options.maxBusyTries) { + busyTries ++ + var time = busyTries * 100 + // try again, with the same exact callback as this one. + return setTimeout(function () { + rimraf_(p, options, CB) + }, time) + } + + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(function () { + rimraf_(p, options, CB) + }, timeout ++) + } + + // already gone + if (er.code === "ENOENT") er = null + } + + timeout = 0 + next(er) + }) + }) + } +} + +// Two possible strategies. +// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR +// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR +// +// Both result in an extra syscall when you guess wrong. However, there +// are likely far more normal files in the world than directories. This +// is based on the assumption that a the average number of files per +// directory is >= 1. +// +// If anyone ever complains about this, then I guess the strategy could +// be made configurable somehow. But until then, YAGNI. +function rimraf_ (p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + // sunos lets the root user unlink directories, which is... weird. + // so we have to lstat here and make sure it's not a dir. + options.lstat(p, function (er, st) { + if (er && er.code === "ENOENT") + return cb(null) + + // Windows can EPERM on stat. Life is suffering. + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb) + + if (st && st.isDirectory()) + return rmdir(p, options, er, cb) + + options.unlink(p, function (er) { + if (er) { + if (er.code === "ENOENT") + return cb(null) + if (er.code === "EPERM") + return (isWindows) + ? fixWinEPERM(p, options, er, cb) + : rmdir(p, options, er, cb) + if (er.code === "EISDIR") + return rmdir(p, options, er, cb) + } + return cb(er) + }) + }) +} + +function fixWinEPERM (p, options, er, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + if (er) + assert(er instanceof Error) + + options.chmod(p, _0666, function (er2) { + if (er2) + cb(er2.code === "ENOENT" ? null : er) + else + options.stat(p, function(er3, stats) { + if (er3) + cb(er3.code === "ENOENT" ? null : er) + else if (stats.isDirectory()) + rmdir(p, options, er, cb) + else + options.unlink(p, cb) + }) + }) +} + +function fixWinEPERMSync (p, options, er) { + assert(p) + assert(options) + if (er) + assert(er instanceof Error) + + try { + options.chmodSync(p, _0666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er + } + + try { + var stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } + + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} + +function rmdir (p, options, originalEr, cb) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + assert(typeof cb === 'function') + + // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) + // if we guessed wrong, and it's not a directory, then + // raise the original error. + options.rmdir(p, function (er) { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb) + else if (er && er.code === "ENOTDIR") + cb(originalEr) + else + cb(er) + }) +} + +function rmkids(p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + options.readdir(p, function (er, files) { + if (er) + return cb(er) + var n = files.length + if (n === 0) + return options.rmdir(p, cb) + var errState + files.forEach(function (f) { + rimraf(path.join(p, f), options, function (er) { + if (errState) + return + if (er) + return cb(errState = er) + if (--n === 0) + options.rmdir(p, cb) + }) + }) + }) +} + +// this looks simpler, and is strictly *faster*, but will +// tie up the JavaScript thread and fail on excessively +// deep directory trees. +function rimrafSync (p, options) { + options = options || {} + defaults(options) + + assert(p, 'rimraf: missing path') + assert.equal(typeof p, 'string', 'rimraf: path should be a string') + assert(options, 'rimraf: missing options') + assert.equal(typeof options, 'object', 'rimraf: options should be object') + + var results + + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p] + } else { + try { + options.lstatSync(p) + results = [p] + } catch (er) { + results = glob.sync(p, options.glob) + } + } + + if (!results.length) + return + + for (var i = 0; i < results.length; i++) { + var p = results[i] + + try { + var st = options.lstatSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + + // Windows can EPERM on stat. Life is suffering. + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er) + } + + try { + // sunos lets the root user unlink directories, which is... weird. + if (st && st.isDirectory()) + rmdirSync(p, options, null) + else + options.unlinkSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) + if (er.code !== "EISDIR") + throw er + + rmdirSync(p, options, er) + } + } +} + +function rmdirSync (p, options, originalEr) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + + try { + options.rmdirSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "ENOTDIR") + throw originalEr + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options) + } +} + +function rmkidsSync (p, options) { + assert(p) + assert(options) + options.readdirSync(p).forEach(function (f) { + rimrafSync(path.join(p, f), options) + }) + + // We only end up here once we got ENOTEMPTY at least once, and + // at this point, we are guaranteed to have removed all the kids. + // So, we know that it won't be ENOENT or ENOTDIR or anything else. + // try really hard to delete stuff on windows, because it has a + // PROFOUNDLY annoying habit of not closing handles promptly when + // files are deleted, resulting in spurious ENOTEMPTY errors. + var retries = isWindows ? 100 : 1 + var i = 0 + do { + var threw = true + try { + var ret = options.rmdirSync(p, options) + threw = false + return ret + } finally { + if (++i < retries && threw) + continue + } + } while (true) +} diff --git a/packages/字体精简工具/node_modules/safe-buffer/LICENSE b/packages/字体精简工具/node_modules/safe-buffer/LICENSE new file mode 100644 index 0000000..0c068ce --- /dev/null +++ b/packages/字体精简工具/node_modules/safe-buffer/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/safe-buffer/README.md b/packages/字体精简工具/node_modules/safe-buffer/README.md new file mode 100644 index 0000000..e9a81af --- /dev/null +++ b/packages/字体精简工具/node_modules/safe-buffer/README.md @@ -0,0 +1,584 @@ +# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url] + +[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg +[travis-url]: https://travis-ci.org/feross/safe-buffer +[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg +[npm-url]: https://npmjs.org/package/safe-buffer +[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg +[downloads-url]: https://npmjs.org/package/safe-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com + +#### Safer Node.js Buffer API + +**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`, +`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.** + +**Uses the built-in implementation when available.** + +## install + +``` +npm install safe-buffer +``` + +## usage + +The goal of this package is to provide a safe replacement for the node.js `Buffer`. + +It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to +the top of your node.js modules: + +```js +var Buffer = require('safe-buffer').Buffer + +// Existing buffer code will continue to work without issues: + +new Buffer('hey', 'utf8') +new Buffer([1, 2, 3], 'utf8') +new Buffer(obj) +new Buffer(16) // create an uninitialized buffer (potentially unsafe) + +// But you can use these new explicit APIs to make clear what you want: + +Buffer.from('hey', 'utf8') // convert from many types to a Buffer +Buffer.alloc(16) // create a zero-filled buffer (safe) +Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe) +``` + +## api + +### Class Method: Buffer.from(array) + + +* `array` {Array} + +Allocates a new `Buffer` using an `array` of octets. + +```js +const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]); + // creates a new Buffer containing ASCII bytes + // ['b','u','f','f','e','r'] +``` + +A `TypeError` will be thrown if `array` is not an `Array`. + +### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]]) + + +* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or + a `new ArrayBuffer()` +* `byteOffset` {Number} Default: `0` +* `length` {Number} Default: `arrayBuffer.length - byteOffset` + +When passed a reference to the `.buffer` property of a `TypedArray` instance, +the newly created `Buffer` will share the same allocated memory as the +TypedArray. + +```js +const arr = new Uint16Array(2); +arr[0] = 5000; +arr[1] = 4000; + +const buf = Buffer.from(arr.buffer); // shares the memory with arr; + +console.log(buf); + // Prints: + +// changing the TypedArray changes the Buffer also +arr[1] = 6000; + +console.log(buf); + // Prints: +``` + +The optional `byteOffset` and `length` arguments specify a memory range within +the `arrayBuffer` that will be shared by the `Buffer`. + +```js +const ab = new ArrayBuffer(10); +const buf = Buffer.from(ab, 0, 2); +console.log(buf.length); + // Prints: 2 +``` + +A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`. + +### Class Method: Buffer.from(buffer) + + +* `buffer` {Buffer} + +Copies the passed `buffer` data onto a new `Buffer` instance. + +```js +const buf1 = Buffer.from('buffer'); +const buf2 = Buffer.from(buf1); + +buf1[0] = 0x61; +console.log(buf1.toString()); + // 'auffer' +console.log(buf2.toString()); + // 'buffer' (copy is not changed) +``` + +A `TypeError` will be thrown if `buffer` is not a `Buffer`. + +### Class Method: Buffer.from(str[, encoding]) + + +* `str` {String} String to encode. +* `encoding` {String} Encoding to use, Default: `'utf8'` + +Creates a new `Buffer` containing the given JavaScript string `str`. If +provided, the `encoding` parameter identifies the character encoding. +If not provided, `encoding` defaults to `'utf8'`. + +```js +const buf1 = Buffer.from('this is a tést'); +console.log(buf1.toString()); + // prints: this is a tést +console.log(buf1.toString('ascii')); + // prints: this is a tC)st + +const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex'); +console.log(buf2.toString()); + // prints: this is a tést +``` + +A `TypeError` will be thrown if `str` is not a string. + +### Class Method: Buffer.alloc(size[, fill[, encoding]]) + + +* `size` {Number} +* `fill` {Value} Default: `undefined` +* `encoding` {String} Default: `utf8` + +Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the +`Buffer` will be *zero-filled*. + +```js +const buf = Buffer.alloc(5); +console.log(buf); + // +``` + +The `size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +If `fill` is specified, the allocated `Buffer` will be initialized by calling +`buf.fill(fill)`. See [`buf.fill()`][] for more information. + +```js +const buf = Buffer.alloc(5, 'a'); +console.log(buf); + // +``` + +If both `fill` and `encoding` are specified, the allocated `Buffer` will be +initialized by calling `buf.fill(fill, encoding)`. For example: + +```js +const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64'); +console.log(buf); + // +``` + +Calling `Buffer.alloc(size)` can be significantly slower than the alternative +`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance +contents will *never contain sensitive data*. + +A `TypeError` will be thrown if `size` is not a number. + +### Class Method: Buffer.allocUnsafe(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* `Buffer` of `size` bytes. The `size` must +be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit +architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is +thrown. A zero-length Buffer will be created if a `size` less than or equal to +0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +```js +const buf = Buffer.allocUnsafe(5); +console.log(buf); + // + // (octets will be different, every time) +buf.fill(0); +console.log(buf); + // +``` + +A `TypeError` will be thrown if `size` is not a number. + +Note that the `Buffer` module pre-allocates an internal `Buffer` instance of +size `Buffer.poolSize` that is used as a pool for the fast allocation of new +`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated +`new Buffer(size)` constructor) only when `size` is less than or equal to +`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default +value of `Buffer.poolSize` is `8192` but can be modified. + +Use of this pre-allocated internal memory pool is a key difference between +calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. +Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer +pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal +Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The +difference is subtle but can be important when an application requires the +additional performance that `Buffer.allocUnsafe(size)` provides. + +### Class Method: Buffer.allocUnsafeSlow(size) + + +* `size` {Number} + +Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes. The +`size` must be less than or equal to the value of +`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is +`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will +be created if a `size` less than or equal to 0 is specified. + +The underlying memory for `Buffer` instances created in this way is *not +initialized*. The contents of the newly created `Buffer` are unknown and +*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such +`Buffer` instances to zeroes. + +When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances, +allocations under 4KB are, by default, sliced from a single pre-allocated +`Buffer`. This allows applications to avoid the garbage collection overhead of +creating many individually allocated Buffers. This approach improves both +performance and memory usage by eliminating the need to track and cleanup as +many `Persistent` objects. + +However, in the case where a developer may need to retain a small chunk of +memory from a pool for an indeterminate amount of time, it may be appropriate +to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then +copy out the relevant bits. + +```js +// need to keep around a few small chunks of memory +const store = []; + +socket.on('readable', () => { + const data = socket.read(); + // allocate for retained data + const sb = Buffer.allocUnsafeSlow(10); + // copy the data into the new allocation + data.copy(sb, 0, 0, 10); + store.push(sb); +}); +``` + +Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after* +a developer has observed undue memory retention in their applications. + +A `TypeError` will be thrown if `size` is not a number. + +### All the Rest + +The rest of the `Buffer` API is exactly the same as in node.js. +[See the docs](https://nodejs.org/api/buffer.html). + + +## Related links + +- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660) +- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4) + +## Why is `Buffer` unsafe? + +Today, the node.js `Buffer` constructor is overloaded to handle many different argument +types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.), +`ArrayBuffer`, and also `Number`. + +The API is optimized for convenience: you can throw any type at it, and it will try to do +what you want. + +Because the Buffer constructor is so powerful, you often see code like this: + +```js +// Convert UTF-8 strings to hex +function toHex (str) { + return new Buffer(str).toString('hex') +} +``` + +***But what happens if `toHex` is called with a `Number` argument?*** + +### Remote Memory Disclosure + +If an attacker can make your program call the `Buffer` constructor with a `Number` +argument, then they can make it allocate uninitialized memory from the node.js process. +This could potentially disclose TLS private keys, user data, or database passwords. + +When the `Buffer` constructor is passed a `Number` argument, it returns an +**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like +this, you **MUST** overwrite the contents before returning it to the user. + +From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size): + +> `new Buffer(size)` +> +> - `size` Number +> +> The underlying memory for `Buffer` instances created in this way is not initialized. +> **The contents of a newly created `Buffer` are unknown and could contain sensitive +> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes. + +(Emphasis our own.) + +Whenever the programmer intended to create an uninitialized `Buffer` you often see code +like this: + +```js +var buf = new Buffer(16) + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### Would this ever be a problem in real code? + +Yes. It's surprisingly common to forget to check the type of your variables in a +dynamically-typed language like JavaScript. + +Usually the consequences of assuming the wrong type is that your program crashes with an +uncaught exception. But the failure mode for forgetting to check the type of arguments to +the `Buffer` constructor is more catastrophic. + +Here's an example of a vulnerable service that takes a JSON payload and converts it to +hex: + +```js +// Take a JSON payload {str: "some string"} and convert it to hex +var server = http.createServer(function (req, res) { + var data = '' + req.setEncoding('utf8') + req.on('data', function (chunk) { + data += chunk + }) + req.on('end', function () { + var body = JSON.parse(data) + res.end(new Buffer(body.str).toString('hex')) + }) +}) + +server.listen(8080) +``` + +In this example, an http client just has to send: + +```json +{ + "str": 1000 +} +``` + +and it will get back 1,000 bytes of uninitialized memory from the server. + +This is a very serious bug. It's similar in severity to the +[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process +memory by remote attackers. + + +### Which real-world packages were vulnerable? + +#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht) + +[Mathias Buus](https://github.com/mafintosh) and I +([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages, +[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow +anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get +them to reveal 20 bytes at a time of uninitialized memory from the node.js process. + +Here's +[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8) +that fixed it. We released a new fixed version, created a +[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all +vulnerable versions on npm so users will get a warning to upgrade to a newer version. + +#### [`ws`](https://www.npmjs.com/package/ws) + +That got us wondering if there were other vulnerable packages. Sure enough, within a short +period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the +most popular WebSocket implementation in node.js. + +If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as +expected, then uninitialized server memory would be disclosed to the remote peer. + +These were the vulnerable methods: + +```js +socket.send(number) +socket.ping(number) +socket.pong(number) +``` + +Here's a vulnerable socket server with some echo functionality: + +```js +server.on('connection', function (socket) { + socket.on('message', function (message) { + message = JSON.parse(message) + if (message.type === 'echo') { + socket.send(message.data) // send back the user's message + } + }) +}) +``` + +`socket.send(number)` called on the server, will disclose server memory. + +Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue +was fixed, with a more detailed explanation. Props to +[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the +[Node Security Project disclosure](https://nodesecurity.io/advisories/67). + + +### What's the solution? + +It's important that node.js offers a fast way to get memory otherwise performance-critical +applications would needlessly get a lot slower. + +But we need a better way to *signal our intent* as programmers. **When we want +uninitialized memory, we should request it explicitly.** + +Sensitive functionality should not be packed into a developer-friendly API that loosely +accepts many different types. This type of API encourages the lazy practice of passing +variables in without checking the type very carefully. + +#### A new API: `Buffer.allocUnsafe(number)` + +The functionality of creating buffers with uninitialized memory should be part of another +API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that +frequently gets user input of all sorts of different types passed into it. + +```js +var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory! + +// Immediately overwrite the uninitialized buffer with data from another buffer +for (var i = 0; i < buf.length; i++) { + buf[i] = otherBuf[i] +} +``` + + +### How do we fix node.js core? + +We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as +`semver-major`) which defends against one case: + +```js +var str = 16 +new Buffer(str, 'utf8') +``` + +In this situation, it's implied that the programmer intended the first argument to be a +string, since they passed an encoding as a second argument. Today, node.js will allocate +uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not +what the programmer intended. + +But this is only a partial solution, since if the programmer does `new Buffer(variable)` +(without an `encoding` parameter) there's no way to know what they intended. If `variable` +is sometimes a number, then uninitialized memory will sometimes be returned. + +### What's the real long-term fix? + +We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when +we need uninitialized memory. But that would break 1000s of packages. + +~~We believe the best solution is to:~~ + +~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~ + +~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~ + +#### Update + +We now support adding three new APIs: + +- `Buffer.from(value)` - convert from any type to a buffer +- `Buffer.alloc(size)` - create a zero-filled buffer +- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size + +This solves the core problem that affected `ws` and `bittorrent-dht` which is +`Buffer(variable)` getting tricked into taking a number argument. + +This way, existing code continues working and the impact on the npm ecosystem will be +minimal. Over time, npm maintainers can migrate performance-critical code to use +`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`. + + +### Conclusion + +We think there's a serious design issue with the `Buffer` API as it exists today. It +promotes insecure software by putting high-risk functionality into a convenient API +with friendly "developer ergonomics". + +This wasn't merely a theoretical exercise because we found the issue in some of the +most popular npm packages. + +Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of +`buffer`. + +```js +var Buffer = require('safe-buffer').Buffer +``` + +Eventually, we hope that node.js core can switch to this new, safer behavior. We believe +the impact on the ecosystem would be minimal since it's not a breaking change. +Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while +older, insecure packages would magically become safe from this attack vector. + + +## links + +- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514) +- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67) +- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68) + + +## credit + +The original issues in `bittorrent-dht` +([disclosure](https://nodesecurity.io/advisories/68)) and +`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by +[Mathias Buus](https://github.com/mafintosh) and +[Feross Aboukhadijeh](http://feross.org/). + +Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues +and for his work running the [Node Security Project](https://nodesecurity.io/). + +Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and +auditing the code. + + +## license + +MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org) diff --git a/packages/字体精简工具/node_modules/safe-buffer/index.d.ts b/packages/字体精简工具/node_modules/safe-buffer/index.d.ts new file mode 100644 index 0000000..e9fed80 --- /dev/null +++ b/packages/字体精简工具/node_modules/safe-buffer/index.d.ts @@ -0,0 +1,187 @@ +declare module "safe-buffer" { + export class Buffer { + length: number + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): { type: 'Buffer', data: any[] }; + equals(otherBuffer: Buffer): boolean; + compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt8(offset: number, noAssert?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + writeUInt8(value: number, offset: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeInt8(value: number, offset: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; + fill(value: any, offset?: number, end?: number): this; + indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; + + /** + * Allocates a new buffer containing the given {str}. + * + * @param str String to store in buffer. + * @param encoding encoding to use, optional. Default is 'utf8' + */ + constructor (str: string, encoding?: string); + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + */ + constructor (size: number); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: Uint8Array); + /** + * Produces a Buffer backed by the same allocated memory as + * the given {ArrayBuffer}. + * + * + * @param arrayBuffer The ArrayBuffer with which to share memory. + */ + constructor (arrayBuffer: ArrayBuffer); + /** + * Allocates a new buffer containing the given {array} of octets. + * + * @param array The octets to store. + */ + constructor (array: any[]); + /** + * Copies the passed {buffer} data onto a new {Buffer} instance. + * + * @param buffer The buffer to copy. + */ + constructor (buffer: Buffer); + prototype: Buffer; + /** + * Allocates a new Buffer using an {array} of octets. + * + * @param array + */ + static from(array: any[]): Buffer; + /** + * When passed a reference to the .buffer property of a TypedArray instance, + * the newly created Buffer will share the same allocated memory as the TypedArray. + * The optional {byteOffset} and {length} arguments specify a memory range + * within the {arrayBuffer} that will be shared by the Buffer. + * + * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer() + * @param byteOffset + * @param length + */ + static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; + /** + * Copies the passed {buffer} data onto a new Buffer instance. + * + * @param buffer + */ + static from(buffer: Buffer): Buffer; + /** + * Creates a new Buffer containing the given JavaScript string {str}. + * If provided, the {encoding} parameter identifies the character encoding. + * If not provided, {encoding} defaults to 'utf8'. + * + * @param str + */ + static from(str: string, encoding?: string): Buffer; + /** + * Returns true if {obj} is a Buffer + * + * @param obj object to test. + */ + static isBuffer(obj: any): obj is Buffer; + /** + * Returns true if {encoding} is a valid encoding argument. + * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' + * + * @param encoding string to test. + */ + static isEncoding(encoding: string): boolean; + /** + * Gives the actual byte length of a string. encoding defaults to 'utf8'. + * This is not the same as String.prototype.length since that returns the number of characters in a string. + * + * @param string string to test. + * @param encoding encoding used to evaluate (defaults to 'utf8') + */ + static byteLength(string: string, encoding?: string): number; + /** + * Returns a buffer which is the result of concatenating all the buffers in the list together. + * + * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer. + * If the list has exactly one item, then the first item of the list is returned. + * If the list has more than one item, then a new Buffer is created. + * + * @param list An array of Buffer objects to concatenate + * @param totalLength Total length of the buffers when concatenated. + * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. + */ + static concat(list: Buffer[], totalLength?: number): Buffer; + /** + * The same as buf1.compare(buf2). + */ + static compare(buf1: Buffer, buf2: Buffer): number; + /** + * Allocates a new buffer of {size} octets. + * + * @param size count of octets to allocate. + * @param fill if specified, buffer will be initialized by calling buf.fill(fill). + * If parameter is omitted, buffer will be filled with zeros. + * @param encoding encoding used for call to buf.fill while initalizing + */ + static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; + /** + * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafe(size: number): Buffer; + /** + * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents + * of the newly created Buffer are unknown and may contain sensitive data. + * + * @param size count of octets to allocate + */ + static allocUnsafeSlow(size: number): Buffer; + } +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/safe-buffer/index.js b/packages/字体精简工具/node_modules/safe-buffer/index.js new file mode 100644 index 0000000..22438da --- /dev/null +++ b/packages/字体精简工具/node_modules/safe-buffer/index.js @@ -0,0 +1,62 @@ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} diff --git a/packages/字体精简工具/node_modules/safe-buffer/package.json b/packages/字体精简工具/node_modules/safe-buffer/package.json new file mode 100644 index 0000000..5f365bf --- /dev/null +++ b/packages/字体精简工具/node_modules/safe-buffer/package.json @@ -0,0 +1,70 @@ +{ + "_from": "safe-buffer@~5.1.1", + "_id": "safe-buffer@5.1.2", + "_inBundle": false, + "_integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "_location": "/safe-buffer", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "safe-buffer@~5.1.1", + "name": "safe-buffer", + "escapedName": "safe-buffer", + "rawSpec": "~5.1.1", + "saveSpec": null, + "fetchSpec": "~5.1.1" + }, + "_requiredBy": [ + "/convert-source-map", + "/minipass", + "/randombytes", + "/readable-stream", + "/remove-bom-stream", + "/request", + "/string_decoder", + "/tar", + "/tunnel-agent" + ], + "_resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "_shasum": "991ec69d296e0313747d59bdfd2b745c35f8828d", + "_spec": "safe-buffer@~5.1.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\readable-stream", + "author": { + "name": "Feross Aboukhadijeh", + "email": "feross@feross.org", + "url": "http://feross.org" + }, + "bugs": { + "url": "https://github.com/feross/safe-buffer/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Safer Node.js Buffer API", + "devDependencies": { + "standard": "*", + "tape": "^4.0.0" + }, + "homepage": "https://github.com/feross/safe-buffer", + "keywords": [ + "buffer", + "buffer allocate", + "node security", + "safe", + "safe-buffer", + "security", + "uninitialized" + ], + "license": "MIT", + "main": "index.js", + "name": "safe-buffer", + "repository": { + "type": "git", + "url": "git://github.com/feross/safe-buffer.git" + }, + "scripts": { + "test": "standard && tape test/*.js" + }, + "types": "index.d.ts", + "version": "5.1.2" +} diff --git a/packages/字体精简工具/node_modules/safer-buffer/LICENSE b/packages/字体精简工具/node_modules/safer-buffer/LICENSE new file mode 100644 index 0000000..4fe9e6f --- /dev/null +++ b/packages/字体精简工具/node_modules/safer-buffer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/safer-buffer/Porting-Buffer.md b/packages/字体精简工具/node_modules/safer-buffer/Porting-Buffer.md new file mode 100644 index 0000000..68d86ba --- /dev/null +++ b/packages/字体精简工具/node_modules/safer-buffer/Porting-Buffer.md @@ -0,0 +1,268 @@ +# Porting to the Buffer.from/Buffer.alloc API + + +## Overview + +- [Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.](#variant-1) (*recommended*) +- [Variant 2: Use a polyfill](#variant-2) +- [Variant 3: manual detection, with safeguards](#variant-3) + +### Finding problematic bits of code using grep + +Just run `grep -nrE '[^a-zA-Z](Slow)?Buffer\s*\(' --exclude-dir node_modules`. + +It will find all the potentially unsafe places in your own code (with some considerably unlikely +exceptions). + +### Finding problematic bits of code using Node.js 8 + +If you’re using Node.js ≥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code: + +- `--trace-warnings` will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js. +- `--trace-deprecation` does the same thing, but only for deprecation warnings. +- `--pending-deprecation` will show more types of deprecation warnings. In particular, it will show the `Buffer()` deprecation warning, even on Node.js 8. + +You can set these flags using an environment variable: + +```console +$ export NODE_OPTIONS='--trace-warnings --pending-deprecation' +$ cat example.js +'use strict'; +const foo = new Buffer('foo'); +$ node example.js +(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead. + at showFlaggedDeprecation (buffer.js:127:13) + at new Buffer (buffer.js:148:3) + at Object. (/path/to/example.js:2:13) + [... more stack trace lines ...] +``` + +### Finding problematic bits of code using linters + +Eslint rules [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +also find calls to deprecated `Buffer()` API. Those rules are included in some pre-sets. + +There is a drawback, though, that it doesn't always +[work correctly](https://github.com/chalker/safer-buffer#why-not-safe-buffer) when `Buffer` is +overriden e.g. with a polyfill, so recommended is a combination of this and some other method +described above. + + +## Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x. + +This is the recommended solution nowadays that would imply only minimal overhead. + +The Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (→ [Schedule](https://github.com/nodejs/Release#release-schedule)). This means that these versions of Node.js will *not* receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible. + +What you would do in this case is to convert all `new Buffer()` or `Buffer()` calls to use `Buffer.alloc()` or `Buffer.from()`, in the following way: + +- For `new Buffer(number)`, replace it with `Buffer.alloc(number)`. +- For `new Buffer(string)` (or `new Buffer(string, encoding)`), replace it with `Buffer.from(string)` (or `Buffer.from(string, encoding)`). +- For all other combinations of arguments (these are much rarer), also replace `new Buffer(...arguments)` with `Buffer.from(...arguments)`. + +Note that `Buffer.alloc()` is also _faster_ on the current Node.js versions than +`new Buffer(size).fill(0)`, which is what you would otherwise need to ensure zero-filling. + +Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +is recommended to avoid accidential unsafe Buffer API usage. + +There is also a [JSCodeshift codemod](https://github.com/joyeecheung/node-dep-codemod#dep005) +for automatically migrating Buffer constructors to `Buffer.alloc()` or `Buffer.from()`. +Note that it currently only works with cases where the arguments are literals or where the +constructor is invoked with two arguments. + +_If you currently support those older Node.js versions and dropping them would be a semver-major change +for you, or if you support older branches of your packages, consider using [Variant 2](#variant-2) +or [Variant 3](#variant-3) on older branches, so people using those older branches will also receive +the fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and +your users will not observe a runtime deprecation warning when running your code on Node.js 10._ + + +## Variant 2: Use a polyfill + +Utilize [safer-buffer](https://www.npmjs.com/package/safer-buffer) as a polyfill to support older +Node.js versions. + +You would take exacly the same steps as in [Variant 1](#variant-1), but with a polyfill +`const Buffer = require('safer-buffer').Buffer` in all files where you use the new `Buffer` api. + +Make sure that you do not use old `new Buffer` API — in any files where the line above is added, +using old `new Buffer()` API will _throw_. It will be easy to notice that in CI, though. + +Alternatively, you could use [buffer-from](https://www.npmjs.com/package/buffer-from) and/or +[buffer-alloc](https://www.npmjs.com/package/buffer-alloc) [ponyfills](https://ponyfill.com/) — +those are great, the only downsides being 4 deps in the tree and slightly more code changes to +migrate off them (as you would be using e.g. `Buffer.from` under a different name). If you need only +`Buffer.from` polyfilled — `buffer-from` alone which comes with no extra dependencies. + +_Alternatively, you could use [safe-buffer](https://www.npmjs.com/package/safe-buffer) — it also +provides a polyfill, but takes a different approach which has +[it's drawbacks](https://github.com/chalker/safer-buffer#why-not-safe-buffer). It will allow you +to also use the older `new Buffer()` API in your code, though — but that's arguably a benefit, as +it is problematic, can cause issues in your code, and will start emitting runtime deprecation +warnings starting with Node.js 10._ + +Note that in either case, it is important that you also remove all calls to the old Buffer +API manually — just throwing in `safe-buffer` doesn't fix the problem by itself, it just provides +a polyfill for the new API. I have seen people doing that mistake. + +Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor) +or +[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md) +is recommended. + +_Don't forget to drop the polyfill usage once you drop support for Node.js < 4.5.0._ + + +## Variant 3 — manual detection, with safeguards + +This is useful if you create Buffer instances in only a few places (e.g. one), or you have your own +wrapper around them. + +### Buffer(0) + +This special case for creating empty buffers can be safely replaced with `Buffer.concat([])`, which +returns the same result all the way down to Node.js 0.8.x. + +### Buffer(notNumber) + +Before: + +```js +var buf = new Buffer(notNumber, encoding); +``` + +After: + +```js +var buf; +if (Buffer.from && Buffer.from !== Uint8Array.from) { + buf = Buffer.from(notNumber, encoding); +} else { + if (typeof notNumber === 'number') + throw new Error('The "size" argument must be of type number.'); + buf = new Buffer(notNumber, encoding); +} +``` + +`encoding` is optional. + +Note that the `typeof notNumber` before `new Buffer` is required (for cases when `notNumber` argument is not +hard-coded) and _is not caused by the deprecation of Buffer constructor_ — it's exactly _why_ the +Buffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous +security issues — situations when unsanitized user input could end up in the `Buffer(arg)` create +problems ranging from DoS to leaking sensitive information to the attacker from the process memory. + +When `notNumber` argument is hardcoded (e.g. literal `"abc"` or `[0,1,2]`), the `typeof` check can +be omitted. + +Also note that using TypeScript does not fix this problem for you — when libs written in +`TypeScript` are used from JS, or when user input ends up there — it behaves exactly as pure JS, as +all type checks are translation-time only and are not present in the actual JS code which TS +compiles to. + +### Buffer(number) + +For Node.js 0.10.x (and below) support: + +```js +var buf; +if (Buffer.alloc) { + buf = Buffer.alloc(number); +} else { + buf = new Buffer(number); + buf.fill(0); +} +``` + +Otherwise (Node.js ≥ 0.12.x): + +```js +const buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0); +``` + +## Regarding Buffer.allocUnsafe + +Be extra cautious when using `Buffer.allocUnsafe`: + * Don't use it if you don't have a good reason to + * e.g. you probably won't ever see a performance difference for small buffers, in fact, those + might be even faster with `Buffer.alloc()`, + * if your code is not in the hot code path — you also probably won't notice a difference, + * keep in mind that zero-filling minimizes the potential risks. + * If you use it, make sure that you never return the buffer in a partially-filled state, + * if you are writing to it sequentially — always truncate it to the actuall written length + +Errors in handling buffers allocated with `Buffer.allocUnsafe` could result in various issues, +ranged from undefined behaviour of your code to sensitive data (user input, passwords, certs) +leaking to the remote attacker. + +_Note that the same applies to `new Buffer` usage without zero-filling, depending on the Node.js +version (and lacking type checks also adds DoS to the list of potential problems)._ + + +## FAQ + + +### What is wrong with the `Buffer` constructor? + +The `Buffer` constructor could be used to create a buffer in many different ways: + +- `new Buffer(42)` creates a `Buffer` of 42 bytes. Before Node.js 8, this buffer contained + *arbitrary memory* for performance reasons, which could include anything ranging from + program source code to passwords and encryption keys. +- `new Buffer('abc')` creates a `Buffer` that contains the UTF-8-encoded version of + the string `'abc'`. A second argument could specify another encoding: For example, + `new Buffer(string, 'base64')` could be used to convert a Base64 string into the original + sequence of bytes that it represents. +- There are several other combinations of arguments. + +This meant that, in code like `var buffer = new Buffer(foo);`, *it is not possible to tell +what exactly the contents of the generated buffer are* without knowing the type of `foo`. + +Sometimes, the value of `foo` comes from an external source. For example, this function +could be exposed as a service on a web server, converting a UTF-8 string into its Base64 form: + +``` +function stringToBase64(req, res) { + // The request body should have the format of `{ string: 'foobar' }` + const rawBytes = new Buffer(req.body.string) + const encoded = rawBytes.toString('base64') + res.end({ encoded: encoded }) +} +``` + +Note that this code does *not* validate the type of `req.body.string`: + +- `req.body.string` is expected to be a string. If this is the case, all goes well. +- `req.body.string` is controlled by the client that sends the request. +- If `req.body.string` is the *number* `50`, the `rawBytes` would be 50 bytes: + - Before Node.js 8, the content would be uninitialized + - After Node.js 8, the content would be `50` bytes with the value `0` + +Because of the missing type check, an attacker could intentionally send a number +as part of the request. Using this, they can either: + +- Read uninitialized memory. This **will** leak passwords, encryption keys and other + kinds of sensitive information. (Information leak) +- Force the program to allocate a large amount of memory. For example, when specifying + `500000000` as the input value, each request will allocate 500MB of memory. + This can be used to either exhaust the memory available of a program completely + and make it crash, or slow it down significantly. (Denial of Service) + +Both of these scenarios are considered serious security issues in a real-world +web server context. + +when using `Buffer.from(req.body.string)` instead, passing a number will always +throw an exception instead, giving a controlled behaviour that can always be +handled by the program. + + +### The `Buffer()` constructor has been deprecated for a while. Is this really an issue? + +Surveys of code in the `npm` ecosystem have shown that the `Buffer()` constructor is still +widely used. This includes new code, and overall usage of such code has actually been +*increasing*. diff --git a/packages/字体精简工具/node_modules/safer-buffer/Readme.md b/packages/字体精简工具/node_modules/safer-buffer/Readme.md new file mode 100644 index 0000000..14b0822 --- /dev/null +++ b/packages/字体精简工具/node_modules/safer-buffer/Readme.md @@ -0,0 +1,156 @@ +# safer-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![javascript style guide][standard-image]][standard-url] [![Security Responsible Disclosure][secuirty-image]][secuirty-url] + +[travis-image]: https://travis-ci.org/ChALkeR/safer-buffer.svg?branch=master +[travis-url]: https://travis-ci.org/ChALkeR/safer-buffer +[npm-image]: https://img.shields.io/npm/v/safer-buffer.svg +[npm-url]: https://npmjs.org/package/safer-buffer +[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg +[standard-url]: https://standardjs.com +[secuirty-image]: https://img.shields.io/badge/Security-Responsible%20Disclosure-green.svg +[secuirty-url]: https://github.com/nodejs/security-wg/blob/master/processes/responsible_disclosure_template.md + +Modern Buffer API polyfill without footguns, working on Node.js from 0.8 to current. + +## How to use? + +First, port all `Buffer()` and `new Buffer()` calls to `Buffer.alloc()` and `Buffer.from()` API. + +Then, to achieve compatibility with outdated Node.js versions (`<4.5.0` and 5.x `<5.9.0`), use +`const Buffer = require('safer-buffer').Buffer` in all files where you make calls to the new +Buffer API. _Use `var` instead of `const` if you need that for your Node.js version range support._ + +Also, see the +[porting Buffer](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) guide. + +## Do I need it? + +Hopefully, not — dropping support for outdated Node.js versions should be fine nowdays, and that +is the recommended path forward. You _do_ need to port to the `Buffer.alloc()` and `Buffer.from()` +though. + +See the [porting guide](https://github.com/ChALkeR/safer-buffer/blob/master/Porting-Buffer.md) +for a better description. + +## Why not [safe-buffer](https://npmjs.com/safe-buffer)? + +_In short: while `safe-buffer` serves as a polyfill for the new API, it allows old API usage and +itself contains footguns._ + +`safe-buffer` could be used safely to get the new API while still keeping support for older +Node.js versions (like this module), but while analyzing ecosystem usage of the old Buffer API +I found out that `safe-buffer` is itself causing problems in some cases. + +For example, consider the following snippet: + +```console +$ cat example.unsafe.js +console.log(Buffer(20)) +$ ./node-v6.13.0-linux-x64/bin/node example.unsafe.js + +$ standard example.unsafe.js +standard: Use JavaScript Standard Style (https://standardjs.com) + /home/chalker/repo/safer-buffer/example.unsafe.js:2:13: 'Buffer()' was deprecated since v6. Use 'Buffer.alloc()' or 'Buffer.from()' (use 'https://www.npmjs.com/package/safe-buffer' for '<4.5.0') instead. +``` + +This is allocates and writes to console an uninitialized chunk of memory. +[standard](https://www.npmjs.com/package/standard) linter (among others) catch that and warn people +to avoid using unsafe API. + +Let's now throw in `safe-buffer`! + +```console +$ cat example.safe-buffer.js +const Buffer = require('safe-buffer').Buffer +console.log(Buffer(20)) +$ standard example.safe-buffer.js +$ ./node-v6.13.0-linux-x64/bin/node example.safe-buffer.js + +``` + +See the problem? Adding in `safe-buffer` _magically removes the lint warning_, but the behavior +remains identiсal to what we had before, and when launched on Node.js 6.x LTS — this dumps out +chunks of uninitialized memory. +_And this code will still emit runtime warnings on Node.js 10.x and above._ + +That was done by design. I first considered changing `safe-buffer`, prohibiting old API usage or +emitting warnings on it, but that significantly diverges from `safe-buffer` design. After some +discussion, it was decided to move my approach into a separate package, and _this is that separate +package_. + +This footgun is not imaginary — I observed top-downloaded packages doing that kind of thing, +«fixing» the lint warning by blindly including `safe-buffer` without any actual changes. + +Also in some cases, even if the API _was_ migrated to use of safe Buffer API — a random pull request +can bring unsafe Buffer API usage back to the codebase by adding new calls — and that could go +unnoticed even if you have a linter prohibiting that (becase of the reason stated above), and even +pass CI. _I also observed that being done in popular packages._ + +Some examples: + * [webdriverio](https://github.com/webdriverio/webdriverio/commit/05cbd3167c12e4930f09ef7cf93b127ba4effae4#diff-124380949022817b90b622871837d56cR31) + (a module with 548 759 downloads/month), + * [websocket-stream](https://github.com/maxogden/websocket-stream/commit/c9312bd24d08271687d76da0fe3c83493871cf61) + (218 288 d/m, fix in [maxogden/websocket-stream#142](https://github.com/maxogden/websocket-stream/pull/142)), + * [node-serialport](https://github.com/node-serialport/node-serialport/commit/e8d9d2b16c664224920ce1c895199b1ce2def48c) + (113 138 d/m, fix in [node-serialport/node-serialport#1510](https://github.com/node-serialport/node-serialport/pull/1510)), + * [karma](https://github.com/karma-runner/karma/commit/3d94b8cf18c695104ca195334dc75ff054c74eec) + (3 973 193 d/m, fix in [karma-runner/karma#2947](https://github.com/karma-runner/karma/pull/2947)), + * [spdy-transport](https://github.com/spdy-http2/spdy-transport/commit/5375ac33f4a62a4f65bcfc2827447d42a5dbe8b1) + (5 970 727 d/m, fix in [spdy-http2/spdy-transport#53](https://github.com/spdy-http2/spdy-transport/pull/53)). + * And there are a lot more over the ecosystem. + +I filed a PR at +[mysticatea/eslint-plugin-node#110](https://github.com/mysticatea/eslint-plugin-node/pull/110) to +partially fix that (for cases when that lint rule is used), but it is a semver-major change for +linter rules and presets, so it would take significant time for that to reach actual setups. +_It also hasn't been released yet (2018-03-20)._ + +Also, `safer-buffer` discourages the usage of `.allocUnsafe()`, which is often done by a mistake. +It still supports it with an explicit concern barier, by placing it under +`require('safer-buffer/dangereous')`. + +## But isn't throwing bad? + +Not really. It's an error that could be noticed and fixed early, instead of causing havoc later like +unguarded `new Buffer()` calls that end up receiving user input can do. + +This package affects only the files where `var Buffer = require('safer-buffer').Buffer` was done, so +it is really simple to keep track of things and make sure that you don't mix old API usage with that. +Also, CI should hint anything that you might have missed. + +New commits, if tested, won't land new usage of unsafe Buffer API this way. +_Node.js 10.x also deals with that by printing a runtime depecation warning._ + +### Would it affect third-party modules? + +No, unless you explicitly do an awful thing like monkey-patching or overriding the built-in `Buffer`. +Don't do that. + +### But I don't want throwing… + +That is also fine! + +Also, it could be better in some cases when you don't comprehensive enough test coverage. + +In that case — just don't override `Buffer` and use +`var SaferBuffer = require('safer-buffer').Buffer` instead. + +That way, everything using `Buffer` natively would still work, but there would be two drawbacks: + +* `Buffer.from`/`Buffer.alloc` won't be polyfilled — use `SaferBuffer.from` and + `SaferBuffer.alloc` instead. +* You are still open to accidentally using the insecure deprecated API — use a linter to catch that. + +Note that using a linter to catch accidential `Buffer` constructor usage in this case is strongly +recommended. `Buffer` is not overriden in this usecase, so linters won't get confused. + +## «Without footguns»? + +Well, it is still possible to do _some_ things with `Buffer` API, e.g. accessing `.buffer` property +on older versions and duping things from there. You shouldn't do that in your code, probabably. + +The intention is to remove the most significant footguns that affect lots of packages in the +ecosystem, and to do it in the proper way. + +Also, this package doesn't protect against security issues affecting some Node.js versions, so for +usage in your own production code, it is still recommended to update to a Node.js version +[supported by upstream](https://github.com/nodejs/release#release-schedule). diff --git a/packages/字体精简工具/node_modules/safer-buffer/dangerous.js b/packages/字体精简工具/node_modules/safer-buffer/dangerous.js new file mode 100644 index 0000000..ca41fdc --- /dev/null +++ b/packages/字体精简工具/node_modules/safer-buffer/dangerous.js @@ -0,0 +1,58 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var buffer = require('buffer') +var Buffer = buffer.Buffer +var safer = require('./safer.js') +var Safer = safer.Buffer + +var dangerous = {} + +var key + +for (key in safer) { + if (!safer.hasOwnProperty(key)) continue + dangerous[key] = safer[key] +} + +var Dangereous = dangerous.Buffer = {} + +// Copy Safer API +for (key in Safer) { + if (!Safer.hasOwnProperty(key)) continue + Dangereous[key] = Safer[key] +} + +// Copy those missing unsafe methods, if they are present +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (Dangereous.hasOwnProperty(key)) continue + Dangereous[key] = Buffer[key] +} + +if (!Dangereous.allocUnsafe) { + Dangereous.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + return Buffer(size) + } +} + +if (!Dangereous.allocUnsafeSlow) { + Dangereous.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + return buffer.SlowBuffer(size) + } +} + +module.exports = dangerous diff --git a/packages/字体精简工具/node_modules/safer-buffer/package.json b/packages/字体精简工具/node_modules/safer-buffer/package.json new file mode 100644 index 0000000..500919a --- /dev/null +++ b/packages/字体精简工具/node_modules/safer-buffer/package.json @@ -0,0 +1,62 @@ +{ + "_from": "safer-buffer@^2.0.2", + "_id": "safer-buffer@2.1.2", + "_inBundle": false, + "_integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "_location": "/safer-buffer", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "safer-buffer@^2.0.2", + "name": "safer-buffer", + "escapedName": "safer-buffer", + "rawSpec": "^2.0.2", + "saveSpec": null, + "fetchSpec": "^2.0.2" + }, + "_requiredBy": [ + "/asn1", + "/ecc-jsbn", + "/sshpk" + ], + "_resolved": "https://registry.nlark.com/safer-buffer/download/safer-buffer-2.1.2.tgz", + "_shasum": "44fa161b0187b9549dd84bb91802f9bd8385cd6a", + "_spec": "safer-buffer@^2.0.2", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\sshpk", + "author": { + "name": "Nikita Skovoroda", + "email": "chalkerx@gmail.com", + "url": "https://github.com/ChALkeR" + }, + "bugs": { + "url": "https://github.com/ChALkeR/safer-buffer/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Modern Buffer API polyfill without footguns", + "devDependencies": { + "standard": "^11.0.1", + "tape": "^4.9.0" + }, + "files": [ + "Porting-Buffer.md", + "Readme.md", + "tests.js", + "dangerous.js", + "safer.js" + ], + "homepage": "https://github.com/ChALkeR/safer-buffer#readme", + "license": "MIT", + "main": "safer.js", + "name": "safer-buffer", + "repository": { + "type": "git", + "url": "git+https://github.com/ChALkeR/safer-buffer.git" + }, + "scripts": { + "browserify-test": "browserify --external tape tests.js > browserify-tests.js && tape browserify-tests.js", + "test": "standard && tape tests.js" + }, + "version": "2.1.2" +} diff --git a/packages/字体精简工具/node_modules/safer-buffer/safer.js b/packages/字体精简工具/node_modules/safer-buffer/safer.js new file mode 100644 index 0000000..37c7e1a --- /dev/null +++ b/packages/字体精简工具/node_modules/safer-buffer/safer.js @@ -0,0 +1,77 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var buffer = require('buffer') +var Buffer = buffer.Buffer + +var safer = {} + +var key + +for (key in buffer) { + if (!buffer.hasOwnProperty(key)) continue + if (key === 'SlowBuffer' || key === 'Buffer') continue + safer[key] = buffer[key] +} + +var Safer = safer.Buffer = {} +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue + Safer[key] = Buffer[key] +} + +safer.Buffer.prototype = Buffer.prototype + +if (!Safer.from || Safer.from === Uint8Array.from) { + Safer.from = function (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value) + } + if (value && typeof value.length === 'undefined') { + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value) + } + return Buffer(value, encodingOrOffset, length) + } +} + +if (!Safer.alloc) { + Safer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + var buf = Buffer(size) + if (!fill || fill.length === 0) { + buf.fill(0) + } else if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + return buf + } +} + +if (!safer.kStringMaxLength) { + try { + safer.kStringMaxLength = process.binding('buffer').kStringMaxLength + } catch (e) { + // we can't determine kStringMaxLength in environments where process.binding + // is unsupported, so let's not set it + } +} + +if (!safer.constants) { + safer.constants = { + MAX_LENGTH: safer.kMaxLength + } + if (safer.kStringMaxLength) { + safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength + } +} + +module.exports = safer diff --git a/packages/字体精简工具/node_modules/safer-buffer/tests.js b/packages/字体精简工具/node_modules/safer-buffer/tests.js new file mode 100644 index 0000000..7ed2777 --- /dev/null +++ b/packages/字体精简工具/node_modules/safer-buffer/tests.js @@ -0,0 +1,406 @@ +/* eslint-disable node/no-deprecated-api */ + +'use strict' + +var test = require('tape') + +var buffer = require('buffer') + +var index = require('./') +var safer = require('./safer') +var dangerous = require('./dangerous') + +/* Inheritance tests */ + +test('Default is Safer', function (t) { + t.equal(index, safer) + t.notEqual(safer, dangerous) + t.notEqual(index, dangerous) + t.end() +}) + +test('Is not a function', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(typeof impl, 'object') + t.equal(typeof impl.Buffer, 'object') + }); + [buffer].forEach(function (impl) { + t.equal(typeof impl, 'object') + t.equal(typeof impl.Buffer, 'function') + }) + t.end() +}) + +test('Constructor throws', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.throws(function () { impl.Buffer() }) + t.throws(function () { impl.Buffer(0) }) + t.throws(function () { impl.Buffer('a') }) + t.throws(function () { impl.Buffer('a', 'utf-8') }) + t.throws(function () { return new impl.Buffer() }) + t.throws(function () { return new impl.Buffer(0) }) + t.throws(function () { return new impl.Buffer('a') }) + t.throws(function () { return new impl.Buffer('a', 'utf-8') }) + }) + t.end() +}) + +test('Safe methods exist', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(typeof impl.Buffer.alloc, 'function', 'alloc') + t.equal(typeof impl.Buffer.from, 'function', 'from') + }) + t.end() +}) + +test('Unsafe methods exist only in Dangerous', function (t) { + [index, safer].forEach(function (impl) { + t.equal(typeof impl.Buffer.allocUnsafe, 'undefined') + t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined') + }); + [dangerous].forEach(function (impl) { + t.equal(typeof impl.Buffer.allocUnsafe, 'function') + t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function') + }) + t.end() +}) + +test('Generic methods/properties are defined and equal', function (t) { + ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], buffer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Built-in buffer static methods/properties are inherited', function (t) { + Object.keys(buffer).forEach(function (method) { + if (method === 'SlowBuffer' || method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], buffer[method], method) + t.notEqual(typeof impl[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Built-in Buffer static methods/properties are inherited', function (t) { + Object.keys(buffer.Buffer).forEach(function (method) { + if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], buffer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('.prototype property of Buffer is inherited', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype') + t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype') + }) + t.end() +}) + +test('All Safer methods are present in Dangerous', function (t) { + Object.keys(safer).forEach(function (method) { + if (method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], safer[method], method) + if (method !== 'kStringMaxLength') { + t.notEqual(typeof impl[method], 'undefined', method) + } + }) + }) + Object.keys(safer.Buffer).forEach(function (method) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], safer.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +test('Safe methods from Dangerous methods are present in Safer', function (t) { + Object.keys(dangerous).forEach(function (method) { + if (method === 'Buffer') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl[method], dangerous[method], method) + if (method !== 'kStringMaxLength') { + t.notEqual(typeof impl[method], 'undefined', method) + } + }) + }) + Object.keys(dangerous.Buffer).forEach(function (method) { + if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return; + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer[method], dangerous.Buffer[method], method) + t.notEqual(typeof impl.Buffer[method], 'undefined', method) + }) + }) + t.end() +}) + +/* Behaviour tests */ + +test('Methods return Buffers', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(''))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3]))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3])))) + t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([]))) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0))) + t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10))) + }) + t.end() +}) + +test('Constructor is buffer.Buffer', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer) + t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('string').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer) + t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer) + t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer) + t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer) + t.equal(impl.Buffer.from([]).constructor, buffer.Buffer) + }); + [0, 10, 100].forEach(function (arg) { + t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer) + t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor) + }) + t.end() +}) + +test('Invalid calls throw', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.throws(function () { impl.Buffer.from(0) }) + t.throws(function () { impl.Buffer.from(10) }) + t.throws(function () { impl.Buffer.from(10, 'utf-8') }) + t.throws(function () { impl.Buffer.from('string', 'invalid encoding') }) + t.throws(function () { impl.Buffer.from(-10) }) + t.throws(function () { impl.Buffer.from(1e90) }) + t.throws(function () { impl.Buffer.from(Infinity) }) + t.throws(function () { impl.Buffer.from(-Infinity) }) + t.throws(function () { impl.Buffer.from(NaN) }) + t.throws(function () { impl.Buffer.from(null) }) + t.throws(function () { impl.Buffer.from(undefined) }) + t.throws(function () { impl.Buffer.from() }) + t.throws(function () { impl.Buffer.from({}) }) + t.throws(function () { impl.Buffer.alloc('') }) + t.throws(function () { impl.Buffer.alloc('string') }) + t.throws(function () { impl.Buffer.alloc('string', 'utf-8') }) + t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') }) + t.throws(function () { impl.Buffer.alloc(-10) }) + t.throws(function () { impl.Buffer.alloc(1e90) }) + t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) }) + t.throws(function () { impl.Buffer.alloc(Infinity) }) + t.throws(function () { impl.Buffer.alloc(-Infinity) }) + t.throws(function () { impl.Buffer.alloc(null) }) + t.throws(function () { impl.Buffer.alloc(undefined) }) + t.throws(function () { impl.Buffer.alloc() }) + t.throws(function () { impl.Buffer.alloc([]) }) + t.throws(function () { impl.Buffer.alloc([0, 42, 3]) }) + t.throws(function () { impl.Buffer.alloc({}) }) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.throws(function () { dangerous.Buffer[method]('') }) + t.throws(function () { dangerous.Buffer[method]('string') }) + t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') }) + t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) }) + t.throws(function () { dangerous.Buffer[method](Infinity) }) + if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) { + t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0') + } else { + t.throws(function () { dangerous.Buffer[method](-10) }) + t.throws(function () { dangerous.Buffer[method](-1e90) }) + t.throws(function () { dangerous.Buffer[method](-Infinity) }) + } + t.throws(function () { dangerous.Buffer[method](null) }) + t.throws(function () { dangerous.Buffer[method](undefined) }) + t.throws(function () { dangerous.Buffer[method]() }) + t.throws(function () { dangerous.Buffer[method]([]) }) + t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) }) + t.throws(function () { dangerous.Buffer[method]({}) }) + }) + t.end() +}) + +test('Buffers have appropriate lengths', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.equal(impl.Buffer.alloc(0).length, 0) + t.equal(impl.Buffer.alloc(10).length, 10) + t.equal(impl.Buffer.from('').length, 0) + t.equal(impl.Buffer.from('string').length, 6) + t.equal(impl.Buffer.from('string', 'utf-8').length, 6) + t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11) + t.equal(impl.Buffer.from([0, 42, 3]).length, 3) + t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3) + t.equal(impl.Buffer.from([]).length, 0) + }); + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + t.equal(dangerous.Buffer[method](0).length, 0) + t.equal(dangerous.Buffer[method](10).length, 10) + }) + t.end() +}) + +test('Buffers have appropriate lengths (2)', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true; + [ safer.Buffer.alloc, + dangerous.Buffer.allocUnsafe, + dangerous.Buffer.allocUnsafeSlow + ].forEach(function (method) { + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 1e5) + var buf = method(length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + } + }) + t.ok(ok) + t.end() +}) + +test('.alloc(size) is zero-filled and has correct length', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var buf = index.Buffer.alloc(length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + var j + for (j = 0; j < length; j++) { + if (buf[j] !== 0) ok = false + } + buf.fill(1) + for (j = 0; j < length; j++) { + if (buf[j] !== 1) ok = false + } + } + t.ok(ok) + t.end() +}) + +test('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) { + ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) { + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var buf = dangerous.Buffer[method](length) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + buf.fill(0, 0, length) + var j + for (j = 0; j < length; j++) { + if (buf[j] !== 0) ok = false + } + buf.fill(1, 0, length) + for (j = 0; j < length; j++) { + if (buf[j] !== 1) ok = false + } + } + t.ok(ok, method) + }) + t.end() +}) + +test('.alloc(size, fill) is `fill`-filled', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var fill = Math.round(Math.random() * 255) + var buf = index.Buffer.alloc(length, fill) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + for (var j = 0; j < length; j++) { + if (buf[j] !== fill) ok = false + } + } + t.ok(ok) + t.end() +}) + +test('.alloc(size, fill) is `fill`-filled', function (t) { + t.equal(index.Buffer.alloc, safer.Buffer.alloc) + t.equal(index.Buffer.alloc, dangerous.Buffer.alloc) + var ok = true + for (var i = 0; i < 1e2; i++) { + var length = Math.round(Math.random() * 2e6) + var fill = Math.round(Math.random() * 255) + var buf = index.Buffer.alloc(length, fill) + if (!buffer.Buffer.isBuffer(buf)) ok = false + if (buf.length !== length) ok = false + for (var j = 0; j < length; j++) { + if (buf[j] !== fill) ok = false + } + } + t.ok(ok) + t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97)) + t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98)) + + var tmp = new buffer.Buffer(2) + tmp.fill('ok') + if (tmp[1] === tmp[0]) { + // Outdated Node.js + t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo')) + } else { + t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko')) + } + t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok')) + + t.end() +}) + +test('safer.Buffer.from returns results same as Buffer constructor', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.deepEqual(impl.Buffer.from(''), new buffer.Buffer('')) + t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string')) + t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8')) + t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64')) + t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3])) + t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3]))) + t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([])) + }) + t.end() +}) + +test('safer.Buffer.from returns consistent results', function (t) { + [index, safer, dangerous].forEach(function (impl) { + t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0)) + t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string')) + t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103])) + t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string'))) + t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree')) + t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree')) + }) + t.end() +}) diff --git a/packages/字体精简工具/node_modules/semver/CHANGELOG.md b/packages/字体精简工具/node_modules/semver/CHANGELOG.md new file mode 100644 index 0000000..66304fd --- /dev/null +++ b/packages/字体精简工具/node_modules/semver/CHANGELOG.md @@ -0,0 +1,39 @@ +# changes log + +## 5.7 + +* Add `minVersion` method + +## 5.6 + +* Move boolean `loose` param to an options object, with + backwards-compatibility protection. +* Add ability to opt out of special prerelease version handling with + the `includePrerelease` option flag. + +## 5.5 + +* Add version coercion capabilities + +## 5.4 + +* Add intersection checking + +## 5.3 + +* Add `minSatisfying` method + +## 5.2 + +* Add `prerelease(v)` that returns prerelease components + +## 5.1 + +* Add Backus-Naur for ranges +* Remove excessively cute inspection methods + +## 5.0 + +* Remove AMD/Browserified build artifacts +* Fix ltr and gtr when using the `*` range +* Fix for range `*` with a prerelease identifier diff --git a/packages/字体精简工具/node_modules/semver/LICENSE b/packages/字体精简工具/node_modules/semver/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/packages/字体精简工具/node_modules/semver/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/字体精简工具/node_modules/semver/README.md b/packages/字体精简工具/node_modules/semver/README.md new file mode 100644 index 0000000..f8dfa5a --- /dev/null +++ b/packages/字体精简工具/node_modules/semver/README.md @@ -0,0 +1,412 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install --save semver +```` + +## Usage + +As a node module: + +```js +const semver = require('semver') + +semver.valid('1.2.3') // '1.2.3' +semver.valid('a.b.c') // null +semver.clean(' =v1.2.3 ') // '1.2.3' +semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true +semver.gt('1.2.3', '9.8.7') // false +semver.lt('1.2.3', '9.8.7') // true +semver.minVersion('>=1.0.0') // '1.0.0' +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +As a command-line utility: + +``` +$ semver -h + +A JavaScript implementation of the https://semver.org/ specification +Copyright Isaac Z. Schlueter + +Usage: semver [options] [ [...]] +Prints valid versions sorted by SemVer precedence + +Options: +-r --range + Print versions that match the specified range. + +-i --increment [] + Increment a version by the specified level. Level can + be one of: major, minor, patch, premajor, preminor, + prepatch, or prerelease. Default level is 'patch'. + Only one version may be specified. + +--preid + Identifier to be used to prefix premajor, preminor, + prepatch or prerelease version increments. + +-l --loose + Interpret versions and ranges loosely + +-p --include-prerelease + Always include prerelease versions in range matching + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +Program exits successfully if any valid version satisfies +all supplied ranges, and prints all satisfying versions. + +If no satisfying versions are found, then exits failure. + +Versions are printed in ascending order, so supplying +multiple versions to the utility will just sort them. +``` + +## Versions + +A "version" is described by the `v2.0.0` specification found at +. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +A `version range` is a set of `comparators` which specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional, but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. The +version `3.4.5` *would* satisfy the range, because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose for this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range matching +semantics. + +Second, a user who has opted into using a prerelease version has +clearly indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +Note that this behavior can be suppressed (treating all prerelease +versions as if they were normal versions, for the purpose of range +matching) by setting the `includePrerelease` flag on the options +object to any +[functions](https://github.com/npm/node-semver#functions) that do +range matching. + +#### Prerelease Identifiers + +The method `.inc` takes an additional `identifier` string argument that +will append the value of the string as a prerelease identifier: + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta') +// '1.2.4-beta.0' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ semver 1.2.4-beta.0 -i prerelease +1.2.4-beta.1 +``` + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any version satisfies) +* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `""` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero digit in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0` +* `^0.2.3` := `>=0.2.3 <0.3.0` +* `^0.0.3` := `>=0.0.3 <0.0.4` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0` +* `^0.0.x` := `>=0.0.0 <0.1.0` +* `^0.0` := `>=0.0.0 <0.1.0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0` +* `^0.x` := `>=0.0.0 <1.0.0` + +### Range Grammar + +Putting all this together, here is a Backus-Naur grammar for ranges, +for the benefit of parser authors: + +```bnf +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ +``` + +## Functions + +All methods and classes take a final `options` object argument. All +options in this object are `false` by default. The options supported +are: + +- `loose` Be more forgiving about not-quite-valid semver strings. + (Any resulting output will always be 100% strict compliant, of + course.) For backwards compatibility reasons, if the `options` + argument is a boolean value instead of an object, it is interpreted + to be the `loose` param. +- `includePrerelease` Set to suppress the [default + behavior](https://github.com/npm/node-semver#prerelease-tags) of + excluding prerelease tagged versions from ranges unless they are + explicitly opted into. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release)`: Return the version incremented by the release + type (`major`, `premajor`, `minor`, `preminor`, `patch`, + `prepatch`, or `prerelease`), or null if it's not valid + * `premajor` in one call will bump the version up to the next major + version and down to a prerelease of that major version. + `preminor`, and `prepatch` work the same way. + * If called from a non-prerelease version, the `prerelease` will work the + same as `prepatch`. It increments the patch version, then makes a + prerelease. If the input version is already a prerelease it simply + increments it. +* `prerelease(v)`: Returns an array of prerelease components, or null + if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` +* `major(v)`: Return the major version number. +* `minor(v)`: Return the minor version number. +* `patch(v)`: Return the patch version number. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. +* `parse(v)`: Attempt to parse a string as a semantic version, returning either + a `SemVer` object or `null`. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, + even if they're not the exact same string. You already know how to + compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call + the corresponding function above. `"==="` and `"!=="` do simple + string comparison, but are included for completeness. Throws if an + invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if + `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions + in descending order when passed to `Array.sort()`. +* `diff(v1, v2)`: Returns difference between two versions by the release type + (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), + or null if the versions are the same. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the + range. +* `maxSatisfying(versions, range)`: Return the highest version in the list + that satisfies the range, or `null` if none of them do. +* `minSatisfying(versions, range)`: Return the lowest version in the list + that satisfies the range, or `null` if none of them do. +* `minVersion(range)`: Return the lowest version that can possibly match + the given range. +* `gtr(version, range)`: Return `true` if version is greater than all the + versions possible in the range. +* `ltr(version, range)`: Return `true` if version is less than all the + versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside + the bounds of the range in either the high or low direction. The + `hilo` argument must be either the string `'>'` or `'<'`. (This is + the function called by `gtr` and `ltr`.) +* `intersects(range)`: Return true if any of the ranges comparators intersect + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range! For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so the version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. + +### Coercion + +* `coerce(version)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver string to +semver. It looks for the first digit in a string, and consumes all +remaining characters which satisfy at least a partial semver (e.g., `1`, +`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer +versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All +surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes +`3.4.0`). Only text which lacks digits will fail coercion (`version one` +is not valid). The maximum length for any semver component considered for +coercion is 16 characters; longer components will be ignored +(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any +semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value +components are invalid (`9999999999999999.4.7.4` is likely invalid). diff --git a/packages/字体精简工具/node_modules/semver/bin/semver b/packages/字体精简工具/node_modules/semver/bin/semver new file mode 100644 index 0000000..801e77f --- /dev/null +++ b/packages/字体精简工具/node_modules/semver/bin/semver @@ -0,0 +1,160 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +var argv = process.argv.slice(2) + +var versions = [] + +var range = [] + +var inc = null + +var version = require('../package.json').version + +var loose = false + +var includePrerelease = false + +var coerce = false + +var identifier + +var semver = require('../semver') + +var reverse = false + +var options = {} + +main() + +function main () { + if (!argv.length) return help() + while (argv.length) { + var a = argv.shift() + var indexOfEqualSign = a.indexOf('=') + if (indexOfEqualSign !== -1) { + a = a.slice(0, indexOfEqualSign) + argv.unshift(a.slice(indexOfEqualSign + 1)) + } + switch (a) { + case '-rv': case '-rev': case '--rev': case '--reverse': + reverse = true + break + case '-l': case '--loose': + loose = true + break + case '-p': case '--include-prerelease': + includePrerelease = true + break + case '-v': case '--version': + versions.push(argv.shift()) + break + case '-i': case '--inc': case '--increment': + switch (argv[0]) { + case 'major': case 'minor': case 'patch': case 'prerelease': + case 'premajor': case 'preminor': case 'prepatch': + inc = argv.shift() + break + default: + inc = 'patch' + break + } + break + case '--preid': + identifier = argv.shift() + break + case '-r': case '--range': + range.push(argv.shift()) + break + case '-c': case '--coerce': + coerce = true + break + case '-h': case '--help': case '-?': + return help() + default: + versions.push(a) + break + } + } + + var options = { loose: loose, includePrerelease: includePrerelease } + + versions = versions.map(function (v) { + return coerce ? (semver.coerce(v) || { version: v }).version : v + }).filter(function (v) { + return semver.valid(v) + }) + if (!versions.length) return fail() + if (inc && (versions.length !== 1 || range.length)) { return failInc() } + + for (var i = 0, l = range.length; i < l; i++) { + versions = versions.filter(function (v) { + return semver.satisfies(v, range[i], options) + }) + if (!versions.length) return fail() + } + return success(versions) +} + +function failInc () { + console.error('--inc can only be used on a single version with no range') + fail() +} + +function fail () { process.exit(1) } + +function success () { + var compare = reverse ? 'rcompare' : 'compare' + versions.sort(function (a, b) { + return semver[compare](a, b, options) + }).map(function (v) { + return semver.clean(v, options) + }).map(function (v) { + return inc ? semver.inc(v, inc, options, identifier) : v + }).forEach(function (v, i, _) { console.log(v) }) +} + +function help () { + console.log(['SemVer ' + version, + '', + 'A JavaScript implementation of the https://semver.org/ specification', + 'Copyright Isaac Z. Schlueter', + '', + 'Usage: semver [options] [ [...]]', + 'Prints valid versions sorted by SemVer precedence', + '', + 'Options:', + '-r --range ', + ' Print versions that match the specified range.', + '', + '-i --increment []', + ' Increment a version by the specified level. Level can', + ' be one of: major, minor, patch, premajor, preminor,', + " prepatch, or prerelease. Default level is 'patch'.", + ' Only one version may be specified.', + '', + '--preid ', + ' Identifier to be used to prefix premajor, preminor,', + ' prepatch or prerelease version increments.', + '', + '-l --loose', + ' Interpret versions and ranges loosely', + '', + '-p --include-prerelease', + ' Always include prerelease versions in range matching', + '', + '-c --coerce', + ' Coerce a string into SemVer if possible', + ' (does not imply --loose)', + '', + 'Program exits successfully if any valid version satisfies', + 'all supplied ranges, and prints all satisfying versions.', + '', + 'If no satisfying versions are found, then exits failure.', + '', + 'Versions are printed in ascending order, so supplying', + 'multiple versions to the utility will just sort them.' + ].join('\n')) +} diff --git a/packages/字体精简工具/node_modules/semver/package.json b/packages/字体精简工具/node_modules/semver/package.json new file mode 100644 index 0000000..2797493 --- /dev/null +++ b/packages/字体精简工具/node_modules/semver/package.json @@ -0,0 +1,60 @@ +{ + "_from": "semver@2 || 3 || 4 || 5", + "_id": "semver@5.7.1", + "_inBundle": false, + "_integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "_location": "/semver", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "semver@2 || 3 || 4 || 5", + "name": "semver", + "escapedName": "semver", + "rawSpec": "2 || 3 || 4 || 5", + "saveSpec": null, + "fetchSpec": "2 || 3 || 4 || 5" + }, + "_requiredBy": [ + "/normalize-package-data" + ], + "_resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463603361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "_shasum": "a954f931aeba508d307bbf069eff0c01c96116f7", + "_spec": "semver@2 || 3 || 4 || 5", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\normalize-package-data", + "bin": { + "semver": "./bin/semver" + }, + "bugs": { + "url": "https://github.com/npm/node-semver/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "The semantic version parser used by npm.", + "devDependencies": { + "tap": "^13.0.0-rc.18" + }, + "files": [ + "bin", + "range.bnf", + "semver.js" + ], + "homepage": "https://github.com/npm/node-semver#readme", + "license": "ISC", + "main": "semver.js", + "name": "semver", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/node-semver.git" + }, + "scripts": { + "postpublish": "git push origin --all; git push origin --tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap" + }, + "tap": { + "check-coverage": true + }, + "version": "5.7.1" +} diff --git a/packages/字体精简工具/node_modules/semver/range.bnf b/packages/字体精简工具/node_modules/semver/range.bnf new file mode 100644 index 0000000..d4c6ae0 --- /dev/null +++ b/packages/字体精简工具/node_modules/semver/range.bnf @@ -0,0 +1,16 @@ +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | [1-9] ( [0-9] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ diff --git a/packages/字体精简工具/node_modules/semver/semver.js b/packages/字体精简工具/node_modules/semver/semver.js new file mode 100644 index 0000000..d315d5d --- /dev/null +++ b/packages/字体精简工具/node_modules/semver/semver.js @@ -0,0 +1,1483 @@ +exports = module.exports = SemVer + +var debug +/* istanbul ignore next */ +if (typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG)) { + debug = function () { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift('SEMVER') + console.log.apply(console, args) + } +} else { + debug = function () {} +} + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0' + +var MAX_LENGTH = 256 +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || + /* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16 + +// The actual regexps go on exports.re +var re = exports.re = [] +var src = exports.src = [] +var R = 0 + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++ +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' +var NUMERICIDENTIFIERLOOSE = R++ +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++ +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++ +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')' + +var MAINVERSIONLOOSE = R++ +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')' + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++ +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')' + +var PRERELEASEIDENTIFIERLOOSE = R++ +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')' + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++ +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' + +var PRERELEASELOOSE = R++ +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++ +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++ +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++ +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?' + +src[FULL] = '^' + FULLPLAIN + '$' + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?' + +var LOOSE = R++ +src[LOOSE] = '^' + LOOSEPLAIN + '$' + +var GTLT = R++ +src[GTLT] = '((?:<|>)?=?)' + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++ +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' +var XRANGEIDENTIFIER = R++ +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' + +var XRANGEPLAIN = R++ +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?' + +var XRANGEPLAINLOOSE = R++ +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?' + +var XRANGE = R++ +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' +var XRANGELOOSE = R++ +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++ +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])' + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++ +src[LONETILDE] = '(?:~>?)' + +var TILDETRIM = R++ +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') +var tildeTrimReplace = '$1~' + +var TILDE = R++ +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' +var TILDELOOSE = R++ +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++ +src[LONECARET] = '(?:\\^)' + +var CARETTRIM = R++ +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') +var caretTrimReplace = '$1^' + +var CARET = R++ +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' +var CARETLOOSE = R++ +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++ +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' +var COMPARATOR = R++ +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++ +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') +var comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++ +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$' + +var HYPHENRANGELOOSE = R++ +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$' + +// Star ranges basically just allow anything at all. +var STAR = R++ +src[STAR] = '(<|>)?=?\\s*\\*' + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]) + if (!re[i]) { + re[i] = new RegExp(src[i]) + } +} + +exports.parse = parse +function parse (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + var r = options.loose ? re[LOOSE] : re[FULL] + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } +} + +exports.valid = valid +function valid (version, options) { + var v = parse(version, options) + return v ? v.version : null +} + +exports.clean = clean +function clean (version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} + +exports.SemVer = SemVer + +function SemVer (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + if (version instanceof SemVer) { + if (version.loose === options.loose) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + } + + if (!(this instanceof SemVer)) { + return new SemVer(version, options) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + + var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) + + if (!m) { + throw new TypeError('Invalid Version: ' + version) + } + + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map(function (id) { + if (/^[0-9]+$/.test(id)) { + var num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } + } + return id + }) + } + + this.build = m[5] ? m[5].split('.') : [] + this.format() +} + +SemVer.prototype.format = function () { + this.version = this.major + '.' + this.minor + '.' + this.patch + if (this.prerelease.length) { + this.version += '-' + this.prerelease.join('.') + } + return this.version +} + +SemVer.prototype.toString = function () { + return this.version +} + +SemVer.prototype.compare = function (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return this.compareMain(other) || this.comparePre(other) +} + +SemVer.prototype.compareMain = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) +} + +SemVer.prototype.comparePre = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + var i = 0 + do { + var a = this.prerelease[i] + var b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) +} + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function (release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier) + this.inc('pre', identifier) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier) + } + this.inc('pre', identifier) + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0) { + this.major++ + } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ + } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ + } + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) { + this.prerelease = [0] + } else { + var i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 + } + } + if (i === -1) { + // didn't increment anything + this.prerelease.push(0) + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) { + this.prerelease = [identifier, 0] + } + } else { + this.prerelease = [identifier, 0] + } + } + break + + default: + throw new Error('invalid increment argument: ' + release) + } + this.format() + this.raw = this.version + return this +} + +exports.inc = inc +function inc (version, release, loose, identifier) { + if (typeof (loose) === 'string') { + identifier = loose + loose = undefined + } + + try { + return new SemVer(version, loose).inc(release, identifier).version + } catch (er) { + return null + } +} + +exports.diff = diff +function diff (version1, version2) { + if (eq(version1, version2)) { + return null + } else { + var v1 = parse(version1) + var v2 = parse(version2) + var prefix = '' + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre' + var defaultResult = 'prerelease' + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } +} + +exports.compareIdentifiers = compareIdentifiers + +var numeric = /^[0-9]+$/ +function compareIdentifiers (a, b) { + var anum = numeric.test(a) + var bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +exports.rcompareIdentifiers = rcompareIdentifiers +function rcompareIdentifiers (a, b) { + return compareIdentifiers(b, a) +} + +exports.major = major +function major (a, loose) { + return new SemVer(a, loose).major +} + +exports.minor = minor +function minor (a, loose) { + return new SemVer(a, loose).minor +} + +exports.patch = patch +function patch (a, loose) { + return new SemVer(a, loose).patch +} + +exports.compare = compare +function compare (a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)) +} + +exports.compareLoose = compareLoose +function compareLoose (a, b) { + return compare(a, b, true) +} + +exports.rcompare = rcompare +function rcompare (a, b, loose) { + return compare(b, a, loose) +} + +exports.sort = sort +function sort (list, loose) { + return list.sort(function (a, b) { + return exports.compare(a, b, loose) + }) +} + +exports.rsort = rsort +function rsort (list, loose) { + return list.sort(function (a, b) { + return exports.rcompare(a, b, loose) + }) +} + +exports.gt = gt +function gt (a, b, loose) { + return compare(a, b, loose) > 0 +} + +exports.lt = lt +function lt (a, b, loose) { + return compare(a, b, loose) < 0 +} + +exports.eq = eq +function eq (a, b, loose) { + return compare(a, b, loose) === 0 +} + +exports.neq = neq +function neq (a, b, loose) { + return compare(a, b, loose) !== 0 +} + +exports.gte = gte +function gte (a, b, loose) { + return compare(a, b, loose) >= 0 +} + +exports.lte = lte +function lte (a, b, loose) { + return compare(a, b, loose) <= 0 +} + +exports.cmp = cmp +function cmp (a, op, b, loose) { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError('Invalid operator: ' + op) + } +} + +exports.Comparator = Comparator +function Comparator (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + if (!(this instanceof Comparator)) { + return new Comparator(comp, options) + } + + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) +} + +var ANY = {} +Comparator.prototype.parse = function (comp) { + var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var m = comp.match(r) + + if (!m) { + throw new TypeError('Invalid comparator: ' + comp) + } + + this.operator = m[1] + if (this.operator === '=') { + this.operator = '' + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) + } +} + +Comparator.prototype.toString = function () { + return this.value +} + +Comparator.prototype.test = function (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY) { + return true + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + return cmp(version, this.operator, this.semver, this.options) +} + +Comparator.prototype.intersects = function (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + var rangeTmp + + if (this.operator === '') { + rangeTmp = new Range(comp.value, options) + return satisfies(this.value, rangeTmp, options) + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, options) + return satisfies(comp.semver, rangeTmp, options) + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>') + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<') + var sameSemVer = this.semver.version === comp.semver.version + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<=') + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')) + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')) + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +} + +exports.Range = Range +function Range (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (range instanceof Range) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + return new Range(range.value, options) + } + + if (!(this instanceof Range)) { + return new Range(range, options) + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First, split based on boolean or || + this.raw = range + this.set = range.split(/\s*\|\|\s*/).map(function (range) { + return this.parseRange(range.trim()) + }, this).filter(function (c) { + // throw out any that are not relevant for whatever reason + return c.length + }) + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range) + } + + this.format() +} + +Range.prototype.format = function () { + this.range = this.set.map(function (comps) { + return comps.join(' ').trim() + }).join('||').trim() + return this.range +} + +Range.prototype.toString = function () { + return this.range +} + +Range.prototype.parseRange = function (range) { + var loose = this.options.loose + range = range.trim() + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] + range = range.replace(hr, hyphenReplace) + debug('hyphen replace', range) + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range, re[COMPARATORTRIM]) + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace) + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace) + + // normalize spaces + range = range.split(/\s+/).join(' ') + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var set = range.split(' ').map(function (comp) { + return parseComparator(comp, this.options) + }, this).join(' ').split(/\s+/) + if (this.options.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function (comp) { + return !!comp.match(compRe) + }) + } + set = set.map(function (comp) { + return new Comparator(comp, this.options) + }, this) + + return set +} + +Range.prototype.intersects = function (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some(function (thisComparators) { + return thisComparators.every(function (thisComparator) { + return range.set.some(function (rangeComparators) { + return rangeComparators.every(function (rangeComparator) { + return thisComparator.intersects(rangeComparator, options) + }) + }) + }) + }) +} + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators +function toComparators (range, options) { + return new Range(range, options).set.map(function (comp) { + return comp.map(function (c) { + return c.value + }).join(' ').trim().split(' ') + }) +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator (comp, options) { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +function isX (id) { + return !id || id.toLowerCase() === 'x' || id === '*' +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceTilde(comp, options) + }).join(' ') +} + +function replaceTilde (comp, options) { + var r = options.loose ? re[TILDELOOSE] : re[TILDE] + return comp.replace(r, function (_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else if (pr) { + debug('replaceTilde pr', pr) + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } else { + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + + debug('tilde return', ret) + return ret + }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceCaret(comp, options) + }).join(' ') +} + +function replaceCaret (comp, options) { + debug('caret', comp, options) + var r = options.loose ? re[CARETLOOSE] : re[CARET] + return comp.replace(r, function (_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + if (M === '0') { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else { + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + (+M + 1) + '.0.0' + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0' + } + } + + debug('caret return', ret) + return ret + }) +} + +function replaceXRanges (comp, options) { + debug('replaceXRanges', comp, options) + return comp.split(/\s+/).map(function (comp) { + return replaceXRange(comp, options) + }).join(' ') +} + +function replaceXRange (comp, options) { + comp = comp.trim() + var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] + return comp.replace(r, function (ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + var xM = isX(M) + var xm = xM || isX(m) + var xp = xm || isX(p) + var anyX = xp + + if (gtlt === '=' && anyX) { + gtlt = '' + } + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 + } + } + + ret = gtlt + M + '.' + m + '.' + p + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } + + debug('xRange return', ret) + + return ret + }) +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars (comp, options) { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], '') +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = '>=' + fM + '.0.0' + } else if (isX(fp)) { + from = '>=' + fM + '.' + fm + '.0' + } else { + from = '>=' + from + } + + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = '<' + (+tM + 1) + '.0.0' + } else if (isX(tp)) { + to = '<' + tM + '.' + (+tm + 1) + '.0' + } else if (tpr) { + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr + } else { + to = '<=' + to + } + + return (from + ' ' + to).trim() +} + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function (version) { + if (!version) { + return false + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } + } + return false +} + +function testSet (set, version, options) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true +} + +exports.satisfies = satisfies +function satisfies (version, range, options) { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} + +exports.maxSatisfying = maxSatisfying +function maxSatisfying (versions, range, options) { + var max = null + var maxSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max +} + +exports.minSatisfying = minSatisfying +function minSatisfying (versions, range, options) { + var min = null + var minSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } + }) + return min +} + +exports.minVersion = minVersion +function minVersion (range, loose) { + range = new Range(range, loose) + + var minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } + + minver = null + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + comparators.forEach(function (comparator) { + // Clone to avoid manipulating the comparator's semver object. + var compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error('Unexpected operation: ' + comparator.operator) + } + }) + } + + if (minver && range.test(minver)) { + return minver + } + + return null +} + +exports.validRange = validRange +function validRange (range, options) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr +function ltr (version, range, options) { + return outside(version, range, '<', options) +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr +function gtr (version, range, options) { + return outside(version, range, '>', options) +} + +exports.outside = outside +function outside (version, range, hilo, options) { + version = new SemVer(version, options) + range = new Range(range, options) + + var gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, options)) { + return false + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + var high = null + var low = null + + comparators.forEach(function (comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false + } + } + return true +} + +exports.prerelease = prerelease +function prerelease (version, options) { + var parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} + +exports.intersects = intersects +function intersects (r1, r2, options) { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2) +} + +exports.coerce = coerce +function coerce (version) { + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + var match = version.match(re[COERCE]) + + if (match == null) { + return null + } + + return parse(match[1] + + '.' + (match[2] || '0') + + '.' + (match[3] || '0')) +} diff --git a/packages/字体精简工具/node_modules/set-blocking/CHANGELOG.md b/packages/字体精简工具/node_modules/set-blocking/CHANGELOG.md new file mode 100644 index 0000000..03bf591 --- /dev/null +++ b/packages/字体精简工具/node_modules/set-blocking/CHANGELOG.md @@ -0,0 +1,26 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [2.0.0](https://github.com/yargs/set-blocking/compare/v1.0.0...v2.0.0) (2016-05-17) + + +### Features + +* add an isTTY check ([#3](https://github.com/yargs/set-blocking/issues/3)) ([66ce277](https://github.com/yargs/set-blocking/commit/66ce277)) + + +### BREAKING CHANGES + +* stdio/stderr will not be set to blocking if isTTY === false + + + + +# 1.0.0 (2016-05-14) + + +### Features + +* implemented shim for stream._handle.setBlocking ([6bde0c0](https://github.com/yargs/set-blocking/commit/6bde0c0)) diff --git a/packages/字体精简工具/node_modules/set-blocking/LICENSE.txt b/packages/字体精简工具/node_modules/set-blocking/LICENSE.txt new file mode 100644 index 0000000..836440b --- /dev/null +++ b/packages/字体精简工具/node_modules/set-blocking/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/字体精简工具/node_modules/set-blocking/README.md b/packages/字体精简工具/node_modules/set-blocking/README.md new file mode 100644 index 0000000..e93b420 --- /dev/null +++ b/packages/字体精简工具/node_modules/set-blocking/README.md @@ -0,0 +1,31 @@ +# set-blocking + +[![Build Status](https://travis-ci.org/yargs/set-blocking.svg)](https://travis-ci.org/yargs/set-blocking) +[![NPM version](https://img.shields.io/npm/v/set-blocking.svg)](https://www.npmjs.com/package/set-blocking) +[![Coverage Status](https://coveralls.io/repos/yargs/set-blocking/badge.svg?branch=)](https://coveralls.io/r/yargs/set-blocking?branch=master) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +set blocking `stdio` and `stderr` ensuring that terminal output does not truncate. + +```js +const setBlocking = require('set-blocking') +setBlocking(true) +console.log(someLargeStringToOutput) +``` + +## Historical Context/Word of Warning + +This was created as a shim to address the bug discussed in [node #6456](https://github.com/nodejs/node/issues/6456). This bug crops up on +newer versions of Node.js (`0.12+`), truncating terminal output. + +You should be mindful of the side-effects caused by using `set-blocking`: + +* if your module sets blocking to `true`, it will effect other modules + consuming your library. In [yargs](https://github.com/yargs/yargs/blob/master/yargs.js#L653) we only call + `setBlocking(true)` once we already know we are about to call `process.exit(code)`. +* this patch will not apply to subprocesses spawned with `isTTY = true`, this is + the [default `spawn()` behavior](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options). + +## License + +ISC diff --git a/packages/字体精简工具/node_modules/set-blocking/index.js b/packages/字体精简工具/node_modules/set-blocking/index.js new file mode 100644 index 0000000..6f78774 --- /dev/null +++ b/packages/字体精简工具/node_modules/set-blocking/index.js @@ -0,0 +1,7 @@ +module.exports = function (blocking) { + [process.stdout, process.stderr].forEach(function (stream) { + if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') { + stream._handle.setBlocking(blocking) + } + }) +} diff --git a/packages/字体精简工具/node_modules/set-blocking/package.json b/packages/字体精简工具/node_modules/set-blocking/package.json new file mode 100644 index 0000000..5ec340b --- /dev/null +++ b/packages/字体精简工具/node_modules/set-blocking/package.json @@ -0,0 +1,72 @@ +{ + "_from": "set-blocking@~2.0.0", + "_id": "set-blocking@2.0.0", + "_inBundle": false, + "_integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "_location": "/set-blocking", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "set-blocking@~2.0.0", + "name": "set-blocking", + "escapedName": "set-blocking", + "rawSpec": "~2.0.0", + "saveSpec": null, + "fetchSpec": "~2.0.0" + }, + "_requiredBy": [ + "/gulp/yargs", + "/npmlog", + "/yargs" + ], + "_resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", + "_shasum": "045f9782d011ae9a6803ddd382b24392b3d890f7", + "_spec": "set-blocking@~2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\npmlog", + "author": { + "name": "Ben Coe", + "email": "ben@npmjs.com" + }, + "bugs": { + "url": "https://github.com/yargs/set-blocking/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "set blocking stdio and stderr ensuring that terminal output does not truncate", + "devDependencies": { + "chai": "^3.5.0", + "coveralls": "^2.11.9", + "mocha": "^2.4.5", + "nyc": "^6.4.4", + "standard": "^7.0.1", + "standard-version": "^2.2.1" + }, + "files": [ + "index.js", + "LICENSE.txt" + ], + "homepage": "https://github.com/yargs/set-blocking#readme", + "keywords": [ + "flush", + "terminal", + "blocking", + "shim", + "stdio", + "stderr" + ], + "license": "ISC", + "main": "index.js", + "name": "set-blocking", + "repository": { + "type": "git", + "url": "git+https://github.com/yargs/set-blocking.git" + }, + "scripts": { + "coverage": "nyc report --reporter=text-lcov | coveralls", + "pretest": "standard", + "test": "nyc mocha ./test/*.js", + "version": "standard-version" + }, + "version": "2.0.0" +} diff --git a/packages/字体精简工具/node_modules/signal-exit/CHANGELOG.md b/packages/字体精简工具/node_modules/signal-exit/CHANGELOG.md new file mode 100644 index 0000000..ed104f4 --- /dev/null +++ b/packages/字体精简工具/node_modules/signal-exit/CHANGELOG.md @@ -0,0 +1,35 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +### [3.0.3](https://github.com/tapjs/signal-exit/compare/v3.0.2...v3.0.3) (2020-03-26) + + +### Bug Fixes + +* patch `SIGHUP` to `SIGINT` when on Windows ([cfd1046](https://github.com/tapjs/signal-exit/commit/cfd1046079af4f0e44f93c69c237a09de8c23ef2)) +* **ci:** use Travis for Windows builds ([007add7](https://github.com/tapjs/signal-exit/commit/007add793d2b5ae3c382512103adbf321768a0b8)) + + +## [3.0.1](https://github.com/tapjs/signal-exit/compare/v3.0.0...v3.0.1) (2016-09-08) + + +### Bug Fixes + +* do not listen on SIGBUS, SIGFPE, SIGSEGV and SIGILL ([#40](https://github.com/tapjs/signal-exit/issues/40)) ([5b105fb](https://github.com/tapjs/signal-exit/commit/5b105fb)) + + + + +# [3.0.0](https://github.com/tapjs/signal-exit/compare/v2.1.2...v3.0.0) (2016-06-13) + + +### Bug Fixes + +* get our test suite running on Windows ([#23](https://github.com/tapjs/signal-exit/issues/23)) ([6f3eda8](https://github.com/tapjs/signal-exit/commit/6f3eda8)) +* hooking SIGPROF was interfering with profilers see [#21](https://github.com/tapjs/signal-exit/issues/21) ([#24](https://github.com/tapjs/signal-exit/issues/24)) ([1248a4c](https://github.com/tapjs/signal-exit/commit/1248a4c)) + + +### BREAKING CHANGES + +* signal-exit no longer wires into SIGPROF diff --git a/packages/字体精简工具/node_modules/signal-exit/LICENSE.txt b/packages/字体精简工具/node_modules/signal-exit/LICENSE.txt new file mode 100644 index 0000000..eead04a --- /dev/null +++ b/packages/字体精简工具/node_modules/signal-exit/LICENSE.txt @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) 2015, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/字体精简工具/node_modules/signal-exit/README.md b/packages/字体精简工具/node_modules/signal-exit/README.md new file mode 100644 index 0000000..9f8eb59 --- /dev/null +++ b/packages/字体精简工具/node_modules/signal-exit/README.md @@ -0,0 +1,39 @@ +# signal-exit + +[![Build Status](https://travis-ci.org/tapjs/signal-exit.png)](https://travis-ci.org/tapjs/signal-exit) +[![Coverage](https://coveralls.io/repos/tapjs/signal-exit/badge.svg?branch=master)](https://coveralls.io/r/tapjs/signal-exit?branch=master) +[![NPM version](https://img.shields.io/npm/v/signal-exit.svg)](https://www.npmjs.com/package/signal-exit) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +When you want to fire an event no matter how a process exits: + +* reaching the end of execution. +* explicitly having `process.exit(code)` called. +* having `process.kill(pid, sig)` called. +* receiving a fatal signal from outside the process + +Use `signal-exit`. + +```js +var onExit = require('signal-exit') + +onExit(function (code, signal) { + console.log('process exited!') +}) +``` + +## API + +`var remove = onExit(function (code, signal) {}, options)` + +The return value of the function is a function that will remove the +handler. + +Note that the function *only* fires for signals if the signal would +cause the proces to exit. That is, there are no other listeners, and +it is a fatal signal. + +## Options + +* `alwaysLast`: Run this handler after any other signal or exit + handlers. This causes `process.emit` to be monkeypatched. diff --git a/packages/字体精简工具/node_modules/signal-exit/index.js b/packages/字体精简工具/node_modules/signal-exit/index.js new file mode 100644 index 0000000..6b6c43a --- /dev/null +++ b/packages/字体精简工具/node_modules/signal-exit/index.js @@ -0,0 +1,163 @@ +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +var assert = require('assert') +var signals = require('./signals.js') +var isWin = /^win/i.test(process.platform) + +var EE = require('events') +/* istanbul ignore if */ +if (typeof EE !== 'function') { + EE = EE.EventEmitter +} + +var emitter +if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ +} else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} +} + +// Because this emitter is a global, we have to check to see if a +// previous version of this library failed to enable infinite listeners. +// I know what you're about to say. But literally everything about +// signal-exit is a compromise with evil. Get used to it. +if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true +} + +module.exports = function (cb, opts) { + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + + if (loaded === false) { + load() + } + + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' + } + + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() + } + } + emitter.on(ev, cb) + + return remove +} + +module.exports.unload = unload +function unload () { + if (!loaded) { + return + } + loaded = false + + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 +} + +function emit (event, code, signal) { + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) +} + +// { : , ... } +var sigListeners = {} +signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + if (isWin && sig === 'SIGHUP') { + // "SIGHUP" throws an `ENOSYS` error on Windows, + // so use a supported signal instead + sig = 'SIGINT' + } + process.kill(process.pid, sig) + } + } +}) + +module.exports.signals = function () { + return signals +} + +module.exports.load = load + +var loaded = false + +function load () { + if (loaded) { + return + } + loaded = true + + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 + + signals = signals.filter(function (sig) { + try { + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false + } + }) + + process.emit = processEmit + process.reallyExit = processReallyExit +} + +var originalProcessReallyExit = process.reallyExit +function processReallyExit (code) { + process.exitCode = code || 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) +} + +var originalProcessEmit = process.emit +function processEmit (ev, arg) { + if (ev === 'exit') { + if (arg !== undefined) { + process.exitCode = arg + } + var ret = originalProcessEmit.apply(this, arguments) + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } +} diff --git a/packages/字体精简工具/node_modules/signal-exit/package.json b/packages/字体精简工具/node_modules/signal-exit/package.json new file mode 100644 index 0000000..93bfa49 --- /dev/null +++ b/packages/字体精简工具/node_modules/signal-exit/package.json @@ -0,0 +1,68 @@ +{ + "_from": "signal-exit@^3.0.0", + "_id": "signal-exit@3.0.3", + "_inBundle": false, + "_integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", + "_location": "/signal-exit", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "signal-exit@^3.0.0", + "name": "signal-exit", + "escapedName": "signal-exit", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/execa", + "/gauge", + "/loud-rejection" + ], + "_resolved": "https://registry.nlark.com/signal-exit/download/signal-exit-3.0.3.tgz", + "_shasum": "a1410c2edd8f077b08b4e253c8eacfcaf057461c", + "_spec": "signal-exit@^3.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\loud-rejection", + "author": { + "name": "Ben Coe", + "email": "ben@npmjs.com" + }, + "bugs": { + "url": "https://github.com/tapjs/signal-exit/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "when you want to fire an event no matter how a process exits.", + "devDependencies": { + "chai": "^3.5.0", + "coveralls": "^2.11.10", + "nyc": "^8.1.0", + "standard": "^8.1.0", + "standard-version": "^2.3.0", + "tap": "^8.0.1" + }, + "files": [ + "index.js", + "signals.js" + ], + "homepage": "https://github.com/tapjs/signal-exit", + "keywords": [ + "signal", + "exit" + ], + "license": "ISC", + "main": "index.js", + "name": "signal-exit", + "repository": { + "type": "git", + "url": "git+https://github.com/tapjs/signal-exit.git" + }, + "scripts": { + "coverage": "nyc report --reporter=text-lcov | coveralls", + "pretest": "standard", + "release": "standard-version", + "test": "tap --timeout=240 ./test/*.js --cov" + }, + "version": "3.0.3" +} diff --git a/packages/字体精简工具/node_modules/signal-exit/signals.js b/packages/字体精简工具/node_modules/signal-exit/signals.js new file mode 100644 index 0000000..3bd67a8 --- /dev/null +++ b/packages/字体精简工具/node_modules/signal-exit/signals.js @@ -0,0 +1,53 @@ +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] + +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} + +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} diff --git a/packages/字体精简工具/node_modules/spdx-correct/LICENSE b/packages/字体精简工具/node_modules/spdx-correct/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-correct/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/字体精简工具/node_modules/spdx-correct/README.md b/packages/字体精简工具/node_modules/spdx-correct/README.md new file mode 100644 index 0000000..ab388cf --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-correct/README.md @@ -0,0 +1,14 @@ +```javascript +var correct = require('spdx-correct') +var assert = require('assert') + +assert.equal(correct('mit'), 'MIT') + +assert.equal(correct('Apache 2'), 'Apache-2.0') + +assert(correct('No idea what license') === null) + +// disable upgrade option +assert(correct('GPL-3.0'), 'GPL-3.0-or-later') +assert(correct('GPL-3.0', { upgrade: false }), 'GPL-3.0') +``` diff --git a/packages/字体精简工具/node_modules/spdx-correct/index.js b/packages/字体精简工具/node_modules/spdx-correct/index.js new file mode 100644 index 0000000..c51a79f --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-correct/index.js @@ -0,0 +1,364 @@ +/* +Copyright spdx-correct.js contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +var parse = require('spdx-expression-parse') +var spdxLicenseIds = require('spdx-license-ids') + +function valid (string) { + try { + parse(string) + return true + } catch (error) { + return false + } +} + +// Common transpositions of license identifier acronyms +var transpositions = [ + ['APGL', 'AGPL'], + ['Gpl', 'GPL'], + ['GLP', 'GPL'], + ['APL', 'Apache'], + ['ISD', 'ISC'], + ['GLP', 'GPL'], + ['IST', 'ISC'], + ['Claude', 'Clause'], + [' or later', '+'], + [' International', ''], + ['GNU', 'GPL'], + ['GUN', 'GPL'], + ['+', ''], + ['GNU GPL', 'GPL'], + ['GNU/GPL', 'GPL'], + ['GNU GLP', 'GPL'], + ['GNU General Public License', 'GPL'], + ['Gnu public license', 'GPL'], + ['GNU Public License', 'GPL'], + ['GNU GENERAL PUBLIC LICENSE', 'GPL'], + ['MTI', 'MIT'], + ['Mozilla Public License', 'MPL'], + ['Universal Permissive License', 'UPL'], + ['WTH', 'WTF'], + ['-License', ''] +] + +var TRANSPOSED = 0 +var CORRECT = 1 + +// Simple corrections to nearly valid identifiers. +var transforms = [ + // e.g. 'mit' + function (argument) { + return argument.toUpperCase() + }, + // e.g. 'MIT ' + function (argument) { + return argument.trim() + }, + // e.g. 'M.I.T.' + function (argument) { + return argument.replace(/\./g, '') + }, + // e.g. 'Apache- 2.0' + function (argument) { + return argument.replace(/\s+/g, '') + }, + // e.g. 'CC BY 4.0'' + function (argument) { + return argument.replace(/\s+/g, '-') + }, + // e.g. 'LGPLv2.1' + function (argument) { + return argument.replace('v', '-') + }, + // e.g. 'Apache 2.0' + function (argument) { + return argument.replace(/,?\s*(\d)/, '-$1') + }, + // e.g. 'GPL 2' + function (argument) { + return argument.replace(/,?\s*(\d)/, '-$1.0') + }, + // e.g. 'Apache Version 2.0' + function (argument) { + return argument + .replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2') + }, + // e.g. 'Apache Version 2' + function (argument) { + return argument + .replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0') + }, + // e.g. 'ZLIB' + function (argument) { + return argument[0].toUpperCase() + argument.slice(1) + }, + // e.g. 'MPL/2.0' + function (argument) { + return argument.replace('/', '-') + }, + // e.g. 'Apache 2' + function (argument) { + return argument + .replace(/\s*V\s*(\d)/, '-$1') + .replace(/(\d)$/, '$1.0') + }, + // e.g. 'GPL-2.0', 'GPL-3.0' + function (argument) { + if (argument.indexOf('3.0') !== -1) { + return argument + '-or-later' + } else { + return argument + '-only' + } + }, + // e.g. 'GPL-2.0-' + function (argument) { + return argument + 'only' + }, + // e.g. 'GPL2' + function (argument) { + return argument.replace(/(\d)$/, '-$1.0') + }, + // e.g. 'BSD 3' + function (argument) { + return argument.replace(/(-| )?(\d)$/, '-$2-Clause') + }, + // e.g. 'BSD clause 3' + function (argument) { + return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause') + }, + // e.g. 'New BSD license' + function (argument) { + return argument.replace(/\b(Modified|New|Revised)(-| )?BSD((-| )License)?/i, 'BSD-3-Clause') + }, + // e.g. 'Simplified BSD license' + function (argument) { + return argument.replace(/\bSimplified(-| )?BSD((-| )License)?/i, 'BSD-2-Clause') + }, + // e.g. 'Free BSD license' + function (argument) { + return argument.replace(/\b(Free|Net)(-| )?BSD((-| )License)?/i, 'BSD-2-Clause-$1BSD') + }, + // e.g. 'Clear BSD license' + function (argument) { + return argument.replace(/\bClear(-| )?BSD((-| )License)?/i, 'BSD-3-Clause-Clear') + }, + // e.g. 'Old BSD License' + function (argument) { + return argument.replace(/\b(Old|Original)(-| )?BSD((-| )License)?/i, 'BSD-4-Clause') + }, + // e.g. 'BY-NC-4.0' + function (argument) { + return 'CC-' + argument + }, + // e.g. 'BY-NC' + function (argument) { + return 'CC-' + argument + '-4.0' + }, + // e.g. 'Attribution-NonCommercial' + function (argument) { + return argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, '') + }, + // e.g. 'Attribution-NonCommercial' + function (argument) { + return 'CC-' + + argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, '') + + '-4.0' + } +] + +var licensesWithVersions = spdxLicenseIds + .map(function (id) { + var match = /^(.*)-\d+\.\d+$/.exec(id) + return match + ? [match[0], match[1]] + : [id, null] + }) + .reduce(function (objectMap, item) { + var key = item[1] + objectMap[key] = objectMap[key] || [] + objectMap[key].push(item[0]) + return objectMap + }, {}) + +var licensesWithOneVersion = Object.keys(licensesWithVersions) + .map(function makeEntries (key) { + return [key, licensesWithVersions[key]] + }) + .filter(function identifySoleVersions (item) { + return ( + // Licenses has just one valid version suffix. + item[1].length === 1 && + item[0] !== null && + // APL will be considered Apache, rather than APL-1.0 + item[0] !== 'APL' + ) + }) + .map(function createLastResorts (item) { + return [item[0], item[1][0]] + }) + +licensesWithVersions = undefined + +// If all else fails, guess that strings containing certain substrings +// meant to identify certain licenses. +var lastResorts = [ + ['UNLI', 'Unlicense'], + ['WTF', 'WTFPL'], + ['2 CLAUSE', 'BSD-2-Clause'], + ['2-CLAUSE', 'BSD-2-Clause'], + ['3 CLAUSE', 'BSD-3-Clause'], + ['3-CLAUSE', 'BSD-3-Clause'], + ['AFFERO', 'AGPL-3.0-or-later'], + ['AGPL', 'AGPL-3.0-or-later'], + ['APACHE', 'Apache-2.0'], + ['ARTISTIC', 'Artistic-2.0'], + ['Affero', 'AGPL-3.0-or-later'], + ['BEER', 'Beerware'], + ['BOOST', 'BSL-1.0'], + ['BSD', 'BSD-2-Clause'], + ['CDDL', 'CDDL-1.1'], + ['ECLIPSE', 'EPL-1.0'], + ['FUCK', 'WTFPL'], + ['GNU', 'GPL-3.0-or-later'], + ['LGPL', 'LGPL-3.0-or-later'], + ['GPLV1', 'GPL-1.0-only'], + ['GPL-1', 'GPL-1.0-only'], + ['GPLV2', 'GPL-2.0-only'], + ['GPL-2', 'GPL-2.0-only'], + ['GPL', 'GPL-3.0-or-later'], + ['MIT +NO-FALSE-ATTRIBS', 'MITNFA'], + ['MIT', 'MIT'], + ['MPL', 'MPL-2.0'], + ['X11', 'X11'], + ['ZLIB', 'Zlib'] +].concat(licensesWithOneVersion) + +var SUBSTRING = 0 +var IDENTIFIER = 1 + +var validTransformation = function (identifier) { + for (var i = 0; i < transforms.length; i++) { + var transformed = transforms[i](identifier).trim() + if (transformed !== identifier && valid(transformed)) { + return transformed + } + } + return null +} + +var validLastResort = function (identifier) { + var upperCased = identifier.toUpperCase() + for (var i = 0; i < lastResorts.length; i++) { + var lastResort = lastResorts[i] + if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { + return lastResort[IDENTIFIER] + } + } + return null +} + +var anyCorrection = function (identifier, check) { + for (var i = 0; i < transpositions.length; i++) { + var transposition = transpositions[i] + var transposed = transposition[TRANSPOSED] + if (identifier.indexOf(transposed) > -1) { + var corrected = identifier.replace( + transposed, + transposition[CORRECT] + ) + var checked = check(corrected) + if (checked !== null) { + return checked + } + } + } + return null +} + +module.exports = function (identifier, options) { + options = options || {} + var upgrade = options.upgrade === undefined ? true : !!options.upgrade + function postprocess (value) { + return upgrade ? upgradeGPLs(value) : value + } + var validArugment = ( + typeof identifier === 'string' && + identifier.trim().length !== 0 + ) + if (!validArugment) { + throw Error('Invalid argument. Expected non-empty string.') + } + identifier = identifier.trim() + if (valid(identifier)) { + return postprocess(identifier) + } + var noPlus = identifier.replace(/\+$/, '').trim() + if (valid(noPlus)) { + return postprocess(noPlus) + } + var transformed = validTransformation(identifier) + if (transformed !== null) { + return postprocess(transformed) + } + transformed = anyCorrection(identifier, function (argument) { + if (valid(argument)) { + return argument + } + return validTransformation(argument) + }) + if (transformed !== null) { + return postprocess(transformed) + } + transformed = validLastResort(identifier) + if (transformed !== null) { + return postprocess(transformed) + } + transformed = anyCorrection(identifier, validLastResort) + if (transformed !== null) { + return postprocess(transformed) + } + return null +} + +function upgradeGPLs (value) { + if ([ + 'GPL-1.0', 'LGPL-1.0', 'AGPL-1.0', + 'GPL-2.0', 'LGPL-2.0', 'AGPL-2.0', + 'LGPL-2.1' + ].indexOf(value) !== -1) { + return value + '-only' + } else if ([ + 'GPL-1.0+', 'GPL-2.0+', 'GPL-3.0+', + 'LGPL-2.0+', 'LGPL-2.1+', 'LGPL-3.0+', + 'AGPL-1.0+', 'AGPL-3.0+' + ].indexOf(value) !== -1) { + return value.replace(/\+$/, '-or-later') + } else if (['GPL-3.0', 'LGPL-3.0', 'AGPL-3.0'].indexOf(value) !== -1) { + return value + '-or-later' + } else { + return value + } +} diff --git a/packages/字体精简工具/node_modules/spdx-correct/package.json b/packages/字体精简工具/node_modules/spdx-correct/package.json new file mode 100644 index 0000000..8cf00ed --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-correct/package.json @@ -0,0 +1,88 @@ +{ + "_from": "spdx-correct@^3.0.0", + "_id": "spdx-correct@3.1.1", + "_inBundle": false, + "_integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", + "_location": "/spdx-correct", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "spdx-correct@^3.0.0", + "name": "spdx-correct", + "escapedName": "spdx-correct", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/validate-npm-package-license" + ], + "_resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz", + "_shasum": "dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9", + "_spec": "spdx-correct@^3.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\validate-npm-package-license", + "author": { + "name": "Kyle E. Mitchell", + "email": "kyle@kemitchell.com", + "url": "https://kemitchell.com" + }, + "bugs": { + "url": "https://github.com/jslicense/spdx-correct.js/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Kyle E. Mitchell", + "email": "kyle@kemitchell.com", + "url": "https://kemitchell.com" + }, + { + "name": "Christian Zommerfelds", + "email": "aero_super@yahoo.com" + }, + { + "name": "Tal Einat", + "email": "taleinat@gmail.com" + }, + { + "name": "Dan Butvinik", + "email": "butvinik@outlook.com" + } + ], + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + }, + "deprecated": false, + "description": "correct invalid SPDX expressions", + "devDependencies": { + "defence-cli": "^2.0.1", + "replace-require-self": "^1.0.0", + "standard": "^11.0.0", + "standard-markdown": "^4.0.2", + "tape": "^4.9.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jslicense/spdx-correct.js#readme", + "keywords": [ + "SPDX", + "law", + "legal", + "license", + "metadata" + ], + "license": "Apache-2.0", + "name": "spdx-correct", + "repository": { + "type": "git", + "url": "git+https://github.com/jslicense/spdx-correct.js.git" + }, + "scripts": { + "lint": "standard && standard-markdown README.md", + "test": "defence README.md | replace-require-self | node && node test.js" + }, + "version": "3.1.1" +} diff --git a/packages/字体精简工具/node_modules/spdx-exceptions/README.md b/packages/字体精简工具/node_modules/spdx-exceptions/README.md new file mode 100644 index 0000000..6c927ec --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-exceptions/README.md @@ -0,0 +1,36 @@ +The package exports an array of strings. Each string is an identifier +for a license exception under the [Software Package Data Exchange +(SPDX)][SPDX] software license metadata standard. + +[SPDX]: https://spdx.org + +## Copyright and Licensing + +### SPDX + +"SPDX" is a federally registered United States trademark of The Linux +Foundation Corporation. + +From version 2.0 of the [SPDX] specification: + +> Copyright © 2010-2015 Linux Foundation and its Contributors. Licensed +> under the Creative Commons Attribution License 3.0 Unported. All other +> rights are expressly reserved. + +The Linux Foundation and the SPDX working groups are good people. Only +they decide what "SPDX" means, as a standard and otherwise. I respect +their work and their rights. You should, too. + +### This Package + +> I created this package by copying exception identifiers out of the +> SPDX specification. That work was mechanical, routine, and required no +> creativity whatsoever. - Kyle Mitchell, package author + +United States users concerned about intellectual property may wish to +discuss the following Supreme Court decisions with their attorneys: + +- _Baker v. Selden_, 101 U.S. 99 (1879) + +- _Feist Publications, Inc., v. Rural Telephone Service Co._, + 499 U.S. 340 (1991) diff --git a/packages/字体精简工具/node_modules/spdx-exceptions/index.json b/packages/字体精简工具/node_modules/spdx-exceptions/index.json new file mode 100644 index 0000000..f88f088 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-exceptions/index.json @@ -0,0 +1,40 @@ +[ + "389-exception", + "Autoconf-exception-2.0", + "Autoconf-exception-3.0", + "Bison-exception-2.2", + "Bootloader-exception", + "Classpath-exception-2.0", + "CLISP-exception-2.0", + "DigiRule-FOSS-exception", + "eCos-exception-2.0", + "Fawkes-Runtime-exception", + "FLTK-exception", + "Font-exception-2.0", + "freertos-exception-2.0", + "GCC-exception-2.0", + "GCC-exception-3.1", + "gnu-javamail-exception", + "GPL-3.0-linking-exception", + "GPL-3.0-linking-source-exception", + "GPL-CC-1.0", + "i2p-gpl-java-exception", + "Libtool-exception", + "Linux-syscall-note", + "LLVM-exception", + "LZMA-exception", + "mif-exception", + "Nokia-Qt-exception-1.1", + "OCaml-LGPL-linking-exception", + "OCCT-exception-1.0", + "OpenJDK-assembly-exception-1.0", + "openvpn-openssl-exception", + "PS-or-PDF-font-exception-20170817", + "Qt-GPL-exception-1.0", + "Qt-LGPL-exception-1.1", + "Qwt-exception-1.0", + "Swift-exception", + "u-boot-exception-2.0", + "Universal-FOSS-exception-1.0", + "WxWindows-exception-3.1" +] diff --git a/packages/字体精简工具/node_modules/spdx-exceptions/package.json b/packages/字体精简工具/node_modules/spdx-exceptions/package.json new file mode 100644 index 0000000..761378a --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-exceptions/package.json @@ -0,0 +1,55 @@ +{ + "_from": "spdx-exceptions@^2.1.0", + "_id": "spdx-exceptions@2.3.0", + "_inBundle": false, + "_integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", + "_location": "/spdx-exceptions", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "spdx-exceptions@^2.1.0", + "name": "spdx-exceptions", + "escapedName": "spdx-exceptions", + "rawSpec": "^2.1.0", + "saveSpec": null, + "fetchSpec": "^2.1.0" + }, + "_requiredBy": [ + "/spdx-expression-parse" + ], + "_resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", + "_shasum": "3f28ce1a77a00372683eade4a433183527a2163d", + "_spec": "spdx-exceptions@^2.1.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\spdx-expression-parse", + "author": { + "name": "The Linux Foundation" + }, + "bugs": { + "url": "https://github.com/kemitchell/spdx-exceptions.json/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Kyle E. Mitchell", + "email": "kyle@kemitchell.com", + "url": "https://kemitchell.com/" + } + ], + "deprecated": false, + "description": "list of SPDX standard license exceptions", + "files": [ + "index.json" + ], + "homepage": "https://github.com/kemitchell/spdx-exceptions.json#readme", + "license": "CC-BY-3.0", + "name": "spdx-exceptions", + "repository": { + "type": "git", + "url": "git+https://github.com/kemitchell/spdx-exceptions.json.git" + }, + "scripts": { + "build": "node build.js" + }, + "version": "2.3.0" +} diff --git a/packages/字体精简工具/node_modules/spdx-expression-parse/AUTHORS b/packages/字体精简工具/node_modules/spdx-expression-parse/AUTHORS new file mode 100644 index 0000000..257a76b --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-expression-parse/AUTHORS @@ -0,0 +1,4 @@ +C. Scott Ananian (http://cscott.net) +Kyle E. Mitchell (https://kemitchell.com) +Shinnosuke Watanabe +Antoine Motet diff --git a/packages/字体精简工具/node_modules/spdx-expression-parse/LICENSE b/packages/字体精简工具/node_modules/spdx-expression-parse/LICENSE new file mode 100644 index 0000000..831618e --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-expression-parse/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2015 Kyle E. Mitchell & other authors listed in AUTHORS + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/spdx-expression-parse/README.md b/packages/字体精简工具/node_modules/spdx-expression-parse/README.md new file mode 100644 index 0000000..9406462 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-expression-parse/README.md @@ -0,0 +1,91 @@ +This package parses [SPDX license expression](https://spdx.org/spdx-specification-21-web-version#h.jxpfx0ykyb60) strings describing license terms, like [package.json license strings](https://docs.npmjs.com/files/package.json#license), into consistently structured ECMAScript objects. The npm command-line interface depends on this package, as do many automatic license-audit tools. + +In a nutshell: + +```javascript +var parse = require('spdx-expression-parse') +var assert = require('assert') + +assert.deepEqual( + // Licensed under the terms of the Two-Clause BSD License. + parse('BSD-2-Clause'), + {license: 'BSD-2-Clause'} +) + +assert.throws(function () { + // An invalid SPDX license expression. + // Should be `Apache-2.0`. + parse('Apache 2') +}) + +assert.deepEqual( + // Dual licensed under either: + // - LGPL 2.1 + // - a combination of Three-Clause BSD and MIT + parse('(LGPL-2.1 OR BSD-3-Clause AND MIT)'), + { + left: {license: 'LGPL-2.1'}, + conjunction: 'or', + right: { + left: {license: 'BSD-3-Clause'}, + conjunction: 'and', + right: {license: 'MIT'} + } + } +) +``` + +The syntax comes from the [Software Package Data eXchange (SPDX)](https://spdx.org/), a standard from the [Linux Foundation](https://www.linuxfoundation.org) for shareable data about software package license terms. SPDX aims to make sharing and auditing license data easy, especially for users of open-source software. + +The bulk of the SPDX standard describes syntax and semantics of XML metadata files. This package implements two lightweight, plain-text components of that larger standard: + +1. The [license list](https://spdx.org/licenses), a mapping from specific string identifiers, like `Apache-2.0`, to standard form license texts and bolt-on license exceptions. The [spdx-license-ids](https://www.npmjs.com/package/spdx-license-ids) and [spdx-exceptions](https://www.npmjs.com/package/spdx-exceptions) packages implement the license list. `spdx-expression-parse` depends on and `require()`s them. + + Any license identifier from the license list is a valid license expression: + + ```javascript + var identifiers = [] + .concat(require('spdx-license-ids')) + .concat(require('spdx-license-ids/deprecated')) + + identifiers.forEach(function (id) { + assert.deepEqual(parse(id), {license: id}) + }) + ``` + + So is any license identifier `WITH` a standardized license exception: + + ```javascript + identifiers.forEach(function (id) { + require('spdx-exceptions').forEach(function (e) { + assert.deepEqual( + parse(id + ' WITH ' + e), + {license: id, exception: e} + ) + }) + }) + ``` + +2. The license expression language, for describing simple and complex license terms, like `MIT` for MIT-licensed and `(GPL-2.0 OR Apache-2.0)` for dual-licensing under GPL 2.0 and Apache 2.0. `spdx-expression-parse` itself implements license expression language, exporting a parser. + + ```javascript + assert.deepEqual( + // Licensed under a combination of: + // - the MIT License AND + // - a combination of: + // - LGPL 2.1 (or a later version) AND + // - Three-Clause BSD + parse('(MIT AND (LGPL-2.1+ AND BSD-3-Clause))'), + { + left: {license: 'MIT'}, + conjunction: 'and', + right: { + left: {license: 'LGPL-2.1', plus: true}, + conjunction: 'and', + right: {license: 'BSD-3-Clause'} + } + } + ) + ``` + +The Linux Foundation and its contributors license the SPDX standard under the terms of [the Creative Commons Attribution License 3.0 Unported (SPDX: "CC-BY-3.0")](http://spdx.org/licenses/CC-BY-3.0). "SPDX" is a United States federally registered trademark of the Linux Foundation. The authors of this package license their work under the terms of the MIT License. diff --git a/packages/字体精简工具/node_modules/spdx-expression-parse/index.js b/packages/字体精简工具/node_modules/spdx-expression-parse/index.js new file mode 100644 index 0000000..52fab56 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-expression-parse/index.js @@ -0,0 +1,8 @@ +'use strict' + +var scan = require('./scan') +var parse = require('./parse') + +module.exports = function (source) { + return parse(scan(source)) +} diff --git a/packages/字体精简工具/node_modules/spdx-expression-parse/package.json b/packages/字体精简工具/node_modules/spdx-expression-parse/package.json new file mode 100644 index 0000000..db0f73c --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-expression-parse/package.json @@ -0,0 +1,96 @@ +{ + "_from": "spdx-expression-parse@^3.0.0", + "_id": "spdx-expression-parse@3.0.1", + "_inBundle": false, + "_integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", + "_location": "/spdx-expression-parse", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "spdx-expression-parse@^3.0.0", + "name": "spdx-expression-parse", + "escapedName": "spdx-expression-parse", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/spdx-correct", + "/validate-npm-package-license" + ], + "_resolved": "https://registry.nlark.com/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz?cache=0&sync_timestamp=1618846769735&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fspdx-expression-parse%2Fdownload%2Fspdx-expression-parse-3.0.1.tgz", + "_shasum": "cf70f50482eefdc98e3ce0a6833e4a53ceeba679", + "_spec": "spdx-expression-parse@^3.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\validate-npm-package-license", + "author": { + "name": "Kyle E. Mitchell", + "email": "kyle@kemitchell.com", + "url": "https://kemitchell.com" + }, + "bugs": { + "url": "https://github.com/jslicense/spdx-expression-parse.js/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "C. Scott Ananian", + "email": "cscott@cscott.net", + "url": "http://cscott.net" + }, + { + "name": "Kyle E. Mitchell", + "email": "kyle@kemitchell.com", + "url": "https://kemitchell.com" + }, + { + "name": "Shinnosuke Watanabe", + "email": "snnskwtnb@gmail.com" + }, + { + "name": "Antoine Motet", + "email": "antoine.motet@gmail.com" + } + ], + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + }, + "deprecated": false, + "description": "parse SPDX license expressions", + "devDependencies": { + "defence-cli": "^3.0.1", + "replace-require-self": "^1.0.0", + "standard": "^14.1.0" + }, + "files": [ + "AUTHORS", + "index.js", + "parse.js", + "scan.js" + ], + "homepage": "https://github.com/jslicense/spdx-expression-parse.js#readme", + "keywords": [ + "SPDX", + "law", + "legal", + "license", + "metadata", + "package", + "package.json", + "standards" + ], + "license": "MIT", + "name": "spdx-expression-parse", + "repository": { + "type": "git", + "url": "git+https://github.com/jslicense/spdx-expression-parse.js.git" + }, + "scripts": { + "lint": "standard", + "test": "npm run test:suite && npm run test:readme", + "test:readme": "defence -i javascript README.md | replace-require-self | node", + "test:suite": "node test.js" + }, + "version": "3.0.1" +} diff --git a/packages/字体精简工具/node_modules/spdx-expression-parse/parse.js b/packages/字体精简工具/node_modules/spdx-expression-parse/parse.js new file mode 100644 index 0000000..5a00b45 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-expression-parse/parse.js @@ -0,0 +1,138 @@ +'use strict' + +// The ABNF grammar in the spec is totally ambiguous. +// +// This parser follows the operator precedence defined in the +// `Order of Precedence and Parentheses` section. + +module.exports = function (tokens) { + var index = 0 + + function hasMore () { + return index < tokens.length + } + + function token () { + return hasMore() ? tokens[index] : null + } + + function next () { + if (!hasMore()) { + throw new Error() + } + index++ + } + + function parseOperator (operator) { + var t = token() + if (t && t.type === 'OPERATOR' && operator === t.string) { + next() + return t.string + } + } + + function parseWith () { + if (parseOperator('WITH')) { + var t = token() + if (t && t.type === 'EXCEPTION') { + next() + return t.string + } + throw new Error('Expected exception after `WITH`') + } + } + + function parseLicenseRef () { + // TODO: Actually, everything is concatenated into one string + // for backward-compatibility but it could be better to return + // a nice structure. + var begin = index + var string = '' + var t = token() + if (t.type === 'DOCUMENTREF') { + next() + string += 'DocumentRef-' + t.string + ':' + if (!parseOperator(':')) { + throw new Error('Expected `:` after `DocumentRef-...`') + } + } + t = token() + if (t.type === 'LICENSEREF') { + next() + string += 'LicenseRef-' + t.string + return { license: string } + } + index = begin + } + + function parseLicense () { + var t = token() + if (t && t.type === 'LICENSE') { + next() + var node = { license: t.string } + if (parseOperator('+')) { + node.plus = true + } + var exception = parseWith() + if (exception) { + node.exception = exception + } + return node + } + } + + function parseParenthesizedExpression () { + var left = parseOperator('(') + if (!left) { + return + } + + var expr = parseExpression() + + if (!parseOperator(')')) { + throw new Error('Expected `)`') + } + + return expr + } + + function parseAtom () { + return ( + parseParenthesizedExpression() || + parseLicenseRef() || + parseLicense() + ) + } + + function makeBinaryOpParser (operator, nextParser) { + return function parseBinaryOp () { + var left = nextParser() + if (!left) { + return + } + + if (!parseOperator(operator)) { + return left + } + + var right = parseBinaryOp() + if (!right) { + throw new Error('Expected expression') + } + return { + left: left, + conjunction: operator.toLowerCase(), + right: right + } + } + } + + var parseAnd = makeBinaryOpParser('AND', parseAtom) + var parseExpression = makeBinaryOpParser('OR', parseAnd) + + var node = parseExpression() + if (!node || hasMore()) { + throw new Error('Syntax error') + } + return node +} diff --git a/packages/字体精简工具/node_modules/spdx-expression-parse/scan.js b/packages/字体精简工具/node_modules/spdx-expression-parse/scan.js new file mode 100644 index 0000000..b74fce2 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-expression-parse/scan.js @@ -0,0 +1,131 @@ +'use strict' + +var licenses = [] + .concat(require('spdx-license-ids')) + .concat(require('spdx-license-ids/deprecated')) +var exceptions = require('spdx-exceptions') + +module.exports = function (source) { + var index = 0 + + function hasMore () { + return index < source.length + } + + // `value` can be a regexp or a string. + // If it is recognized, the matching source string is returned and + // the index is incremented. Otherwise `undefined` is returned. + function read (value) { + if (value instanceof RegExp) { + var chars = source.slice(index) + var match = chars.match(value) + if (match) { + index += match[0].length + return match[0] + } + } else { + if (source.indexOf(value, index) === index) { + index += value.length + return value + } + } + } + + function skipWhitespace () { + read(/[ ]*/) + } + + function operator () { + var string + var possibilities = ['WITH', 'AND', 'OR', '(', ')', ':', '+'] + for (var i = 0; i < possibilities.length; i++) { + string = read(possibilities[i]) + if (string) { + break + } + } + + if (string === '+' && index > 1 && source[index - 2] === ' ') { + throw new Error('Space before `+`') + } + + return string && { + type: 'OPERATOR', + string: string + } + } + + function idstring () { + return read(/[A-Za-z0-9-.]+/) + } + + function expectIdstring () { + var string = idstring() + if (!string) { + throw new Error('Expected idstring at offset ' + index) + } + return string + } + + function documentRef () { + if (read('DocumentRef-')) { + var string = expectIdstring() + return { type: 'DOCUMENTREF', string: string } + } + } + + function licenseRef () { + if (read('LicenseRef-')) { + var string = expectIdstring() + return { type: 'LICENSEREF', string: string } + } + } + + function identifier () { + var begin = index + var string = idstring() + + if (licenses.indexOf(string) !== -1) { + return { + type: 'LICENSE', + string: string + } + } else if (exceptions.indexOf(string) !== -1) { + return { + type: 'EXCEPTION', + string: string + } + } + + index = begin + } + + // Tries to read the next token. Returns `undefined` if no token is + // recognized. + function parseToken () { + // Ordering matters + return ( + operator() || + documentRef() || + licenseRef() || + identifier() + ) + } + + var tokens = [] + while (hasMore()) { + skipWhitespace() + if (!hasMore()) { + break + } + + var token = parseToken() + if (!token) { + throw new Error('Unexpected `' + source[index] + + '` at offset ' + index) + } + + tokens.push(token) + } + return tokens +} diff --git a/packages/字体精简工具/node_modules/spdx-license-ids/README.md b/packages/字体精简工具/node_modules/spdx-license-ids/README.md new file mode 100644 index 0000000..e9b5aa6 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-license-ids/README.md @@ -0,0 +1,52 @@ +# spdx-license-ids + +[![npm version](https://img.shields.io/npm/v/spdx-license-ids.svg)](https://www.npmjs.com/package/spdx-license-ids) +[![Github Actions](https://action-badges.now.sh/shinnn/spdx-license-ids)](https://wdp9fww0r9.execute-api.us-west-2.amazonaws.com/production/results/shinnn/spdx-license-ids) + +A list of [SPDX license](https://spdx.org/licenses/) identifiers + +## Installation + +[Download JSON directly](https://raw.githubusercontent.com/shinnn/spdx-license-ids/main/index.json), or [use](https://docs.npmjs.com/cli/install) [npm](https://docs.npmjs.com/about-npm/): + +``` +npm install spdx-license-ids +``` + +## [Node.js](https://nodejs.org/) API + +### require('spdx-license-ids') + +Type: `string[]` + +All license IDs except for the currently deprecated ones. + +```javascript +const ids = require('spdx-license-ids'); +//=> ['0BSD', 'AAL', 'ADSL', 'AFL-1.1', 'AFL-1.2', 'AFL-2.0', 'AFL-2.1', 'AFL-3.0', 'AGPL-1.0-only', ...] + +ids.includes('BSD-3-Clause'); //=> true +ids.includes('CC-BY-1.0'); //=> true + +ids.includes('GPL-3.0'); //=> false +``` + +### require('spdx-license-ids/deprecated') + +Type: `string[]` + +Deprecated license IDs. + +```javascript +const deprecatedIds = require('spdx-license-ids/deprecated'); +//=> ['AGPL-1.0', 'AGPL-3.0', 'GFDL-1.1', 'GFDL-1.2', 'GFDL-1.3', 'GPL-1.0', 'GPL-2.0', ...] + +deprecatedIds.includes('BSD-3-Clause'); //=> false +deprecatedIds.includes('CC-BY-1.0'); //=> false + +deprecatedIds.includes('GPL-3.0'); //=> true +``` + +## License + +[Creative Commons Zero v1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/deed) diff --git a/packages/字体精简工具/node_modules/spdx-license-ids/deprecated.json b/packages/字体精简工具/node_modules/spdx-license-ids/deprecated.json new file mode 100644 index 0000000..c7de098 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-license-ids/deprecated.json @@ -0,0 +1,26 @@ +[ + "AGPL-1.0", + "AGPL-3.0", + "BSD-2-Clause-FreeBSD", + "BSD-2-Clause-NetBSD", + "GFDL-1.1", + "GFDL-1.2", + "GFDL-1.3", + "GPL-1.0", + "GPL-2.0", + "GPL-2.0-with-GCC-exception", + "GPL-2.0-with-autoconf-exception", + "GPL-2.0-with-bison-exception", + "GPL-2.0-with-classpath-exception", + "GPL-2.0-with-font-exception", + "GPL-3.0", + "GPL-3.0-with-GCC-exception", + "GPL-3.0-with-autoconf-exception", + "LGPL-2.0", + "LGPL-2.1", + "LGPL-3.0", + "Nunit", + "StandardML-NJ", + "eCos-2.0", + "wxWindows" +] diff --git a/packages/字体精简工具/node_modules/spdx-license-ids/index.json b/packages/字体精简工具/node_modules/spdx-license-ids/index.json new file mode 100644 index 0000000..c2d5e01 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-license-ids/index.json @@ -0,0 +1,432 @@ +[ + "0BSD", + "AAL", + "ADSL", + "AFL-1.1", + "AFL-1.2", + "AFL-2.0", + "AFL-2.1", + "AFL-3.0", + "AGPL-1.0-only", + "AGPL-1.0-or-later", + "AGPL-3.0-only", + "AGPL-3.0-or-later", + "AMDPLPA", + "AML", + "AMPAS", + "ANTLR-PD", + "ANTLR-PD-fallback", + "APAFML", + "APL-1.0", + "APSL-1.0", + "APSL-1.1", + "APSL-1.2", + "APSL-2.0", + "Abstyles", + "Adobe-2006", + "Adobe-Glyph", + "Afmparse", + "Aladdin", + "Apache-1.0", + "Apache-1.1", + "Apache-2.0", + "Artistic-1.0", + "Artistic-1.0-Perl", + "Artistic-1.0-cl8", + "Artistic-2.0", + "BSD-1-Clause", + "BSD-2-Clause", + "BSD-2-Clause-Patent", + "BSD-2-Clause-Views", + "BSD-3-Clause", + "BSD-3-Clause-Attribution", + "BSD-3-Clause-Clear", + "BSD-3-Clause-LBNL", + "BSD-3-Clause-Modification", + "BSD-3-Clause-No-Military-License", + "BSD-3-Clause-No-Nuclear-License", + "BSD-3-Clause-No-Nuclear-License-2014", + "BSD-3-Clause-No-Nuclear-Warranty", + "BSD-3-Clause-Open-MPI", + "BSD-4-Clause", + "BSD-4-Clause-Shortened", + "BSD-4-Clause-UC", + "BSD-Protection", + "BSD-Source-Code", + "BSL-1.0", + "BUSL-1.1", + "Bahyph", + "Barr", + "Beerware", + "BitTorrent-1.0", + "BitTorrent-1.1", + "BlueOak-1.0.0", + "Borceux", + "C-UDA-1.0", + "CAL-1.0", + "CAL-1.0-Combined-Work-Exception", + "CATOSL-1.1", + "CC-BY-1.0", + "CC-BY-2.0", + "CC-BY-2.5", + "CC-BY-3.0", + "CC-BY-3.0-AT", + "CC-BY-3.0-US", + "CC-BY-4.0", + "CC-BY-NC-1.0", + "CC-BY-NC-2.0", + "CC-BY-NC-2.5", + "CC-BY-NC-3.0", + "CC-BY-NC-4.0", + "CC-BY-NC-ND-1.0", + "CC-BY-NC-ND-2.0", + "CC-BY-NC-ND-2.5", + "CC-BY-NC-ND-3.0", + "CC-BY-NC-ND-3.0-IGO", + "CC-BY-NC-ND-4.0", + "CC-BY-NC-SA-1.0", + "CC-BY-NC-SA-2.0", + "CC-BY-NC-SA-2.5", + "CC-BY-NC-SA-3.0", + "CC-BY-NC-SA-4.0", + "CC-BY-ND-1.0", + "CC-BY-ND-2.0", + "CC-BY-ND-2.5", + "CC-BY-ND-3.0", + "CC-BY-ND-4.0", + "CC-BY-SA-1.0", + "CC-BY-SA-2.0", + "CC-BY-SA-2.0-UK", + "CC-BY-SA-2.1-JP", + "CC-BY-SA-2.5", + "CC-BY-SA-3.0", + "CC-BY-SA-3.0-AT", + "CC-BY-SA-4.0", + "CC-PDDC", + "CC0-1.0", + "CDDL-1.0", + "CDDL-1.1", + "CDL-1.0", + "CDLA-Permissive-1.0", + "CDLA-Sharing-1.0", + "CECILL-1.0", + "CECILL-1.1", + "CECILL-2.0", + "CECILL-2.1", + "CECILL-B", + "CECILL-C", + "CERN-OHL-1.1", + "CERN-OHL-1.2", + "CERN-OHL-P-2.0", + "CERN-OHL-S-2.0", + "CERN-OHL-W-2.0", + "CNRI-Jython", + "CNRI-Python", + "CNRI-Python-GPL-Compatible", + "CPAL-1.0", + "CPL-1.0", + "CPOL-1.02", + "CUA-OPL-1.0", + "Caldera", + "ClArtistic", + "Condor-1.1", + "Crossword", + "CrystalStacker", + "Cube", + "D-FSL-1.0", + "DOC", + "DRL-1.0", + "DSDP", + "Dotseqn", + "ECL-1.0", + "ECL-2.0", + "EFL-1.0", + "EFL-2.0", + "EPICS", + "EPL-1.0", + "EPL-2.0", + "EUDatagrid", + "EUPL-1.0", + "EUPL-1.1", + "EUPL-1.2", + "Entessa", + "ErlPL-1.1", + "Eurosym", + "FSFAP", + "FSFUL", + "FSFULLR", + "FTL", + "Fair", + "Frameworx-1.0", + "FreeBSD-DOC", + "FreeImage", + "GD", + "GFDL-1.1-invariants-only", + "GFDL-1.1-invariants-or-later", + "GFDL-1.1-no-invariants-only", + "GFDL-1.1-no-invariants-or-later", + "GFDL-1.1-only", + "GFDL-1.1-or-later", + "GFDL-1.2-invariants-only", + "GFDL-1.2-invariants-or-later", + "GFDL-1.2-no-invariants-only", + "GFDL-1.2-no-invariants-or-later", + "GFDL-1.2-only", + "GFDL-1.2-or-later", + "GFDL-1.3-invariants-only", + "GFDL-1.3-invariants-or-later", + "GFDL-1.3-no-invariants-only", + "GFDL-1.3-no-invariants-or-later", + "GFDL-1.3-only", + "GFDL-1.3-or-later", + "GL2PS", + "GLWTPL", + "GPL-1.0-only", + "GPL-1.0-or-later", + "GPL-2.0-only", + "GPL-2.0-or-later", + "GPL-3.0-only", + "GPL-3.0-or-later", + "Giftware", + "Glide", + "Glulxe", + "HPND", + "HPND-sell-variant", + "HTMLTIDY", + "HaskellReport", + "Hippocratic-2.1", + "IBM-pibs", + "ICU", + "IJG", + "IPA", + "IPL-1.0", + "ISC", + "ImageMagick", + "Imlib2", + "Info-ZIP", + "Intel", + "Intel-ACPI", + "Interbase-1.0", + "JPNIC", + "JSON", + "JasPer-2.0", + "LAL-1.2", + "LAL-1.3", + "LGPL-2.0-only", + "LGPL-2.0-or-later", + "LGPL-2.1-only", + "LGPL-2.1-or-later", + "LGPL-3.0-only", + "LGPL-3.0-or-later", + "LGPLLR", + "LPL-1.0", + "LPL-1.02", + "LPPL-1.0", + "LPPL-1.1", + "LPPL-1.2", + "LPPL-1.3a", + "LPPL-1.3c", + "Latex2e", + "Leptonica", + "LiLiQ-P-1.1", + "LiLiQ-R-1.1", + "LiLiQ-Rplus-1.1", + "Libpng", + "Linux-OpenIB", + "MIT", + "MIT-0", + "MIT-CMU", + "MIT-Modern-Variant", + "MIT-advertising", + "MIT-enna", + "MIT-feh", + "MIT-open-group", + "MITNFA", + "MPL-1.0", + "MPL-1.1", + "MPL-2.0", + "MPL-2.0-no-copyleft-exception", + "MS-PL", + "MS-RL", + "MTLL", + "MakeIndex", + "MirOS", + "Motosoto", + "MulanPSL-1.0", + "MulanPSL-2.0", + "Multics", + "Mup", + "NAIST-2003", + "NASA-1.3", + "NBPL-1.0", + "NCGL-UK-2.0", + "NCSA", + "NGPL", + "NIST-PD", + "NIST-PD-fallback", + "NLOD-1.0", + "NLPL", + "NOSL", + "NPL-1.0", + "NPL-1.1", + "NPOSL-3.0", + "NRL", + "NTP", + "NTP-0", + "Naumen", + "Net-SNMP", + "NetCDF", + "Newsletr", + "Nokia", + "Noweb", + "O-UDA-1.0", + "OCCT-PL", + "OCLC-2.0", + "ODC-By-1.0", + "ODbL-1.0", + "OFL-1.0", + "OFL-1.0-RFN", + "OFL-1.0-no-RFN", + "OFL-1.1", + "OFL-1.1-RFN", + "OFL-1.1-no-RFN", + "OGC-1.0", + "OGDL-Taiwan-1.0", + "OGL-Canada-2.0", + "OGL-UK-1.0", + "OGL-UK-2.0", + "OGL-UK-3.0", + "OGTSL", + "OLDAP-1.1", + "OLDAP-1.2", + "OLDAP-1.3", + "OLDAP-1.4", + "OLDAP-2.0", + "OLDAP-2.0.1", + "OLDAP-2.1", + "OLDAP-2.2", + "OLDAP-2.2.1", + "OLDAP-2.2.2", + "OLDAP-2.3", + "OLDAP-2.4", + "OLDAP-2.5", + "OLDAP-2.6", + "OLDAP-2.7", + "OLDAP-2.8", + "OML", + "OPL-1.0", + "OSET-PL-2.1", + "OSL-1.0", + "OSL-1.1", + "OSL-2.0", + "OSL-2.1", + "OSL-3.0", + "OpenSSL", + "PDDL-1.0", + "PHP-3.0", + "PHP-3.01", + "PSF-2.0", + "Parity-6.0.0", + "Parity-7.0.0", + "Plexus", + "PolyForm-Noncommercial-1.0.0", + "PolyForm-Small-Business-1.0.0", + "PostgreSQL", + "Python-2.0", + "QPL-1.0", + "Qhull", + "RHeCos-1.1", + "RPL-1.1", + "RPL-1.5", + "RPSL-1.0", + "RSA-MD", + "RSCPL", + "Rdisc", + "Ruby", + "SAX-PD", + "SCEA", + "SGI-B-1.0", + "SGI-B-1.1", + "SGI-B-2.0", + "SHL-0.5", + "SHL-0.51", + "SISSL", + "SISSL-1.2", + "SMLNJ", + "SMPPL", + "SNIA", + "SPL-1.0", + "SSH-OpenSSH", + "SSH-short", + "SSPL-1.0", + "SWL", + "Saxpath", + "Sendmail", + "Sendmail-8.23", + "SimPL-2.0", + "Sleepycat", + "Spencer-86", + "Spencer-94", + "Spencer-99", + "SugarCRM-1.1.3", + "TAPR-OHL-1.0", + "TCL", + "TCP-wrappers", + "TMate", + "TORQUE-1.1", + "TOSL", + "TU-Berlin-1.0", + "TU-Berlin-2.0", + "UCL-1.0", + "UPL-1.0", + "Unicode-DFS-2015", + "Unicode-DFS-2016", + "Unicode-TOU", + "Unlicense", + "VOSTROM", + "VSL-1.0", + "Vim", + "W3C", + "W3C-19980720", + "W3C-20150513", + "WTFPL", + "Watcom-1.0", + "Wsuipa", + "X11", + "XFree86-1.1", + "XSkat", + "Xerox", + "Xnet", + "YPL-1.0", + "YPL-1.1", + "ZPL-1.1", + "ZPL-2.0", + "ZPL-2.1", + "Zed", + "Zend-2.0", + "Zimbra-1.3", + "Zimbra-1.4", + "Zlib", + "blessing", + "bzip2-1.0.5", + "bzip2-1.0.6", + "copyleft-next-0.3.0", + "copyleft-next-0.3.1", + "curl", + "diffmark", + "dvipdfm", + "eGenix", + "etalab-2.0", + "gSOAP-1.3b", + "gnuplot", + "iMatix", + "libpng-2.0", + "libselinux-1.0", + "libtiff", + "mpich2", + "psfrag", + "psutils", + "xinetd", + "xpp", + "zlib-acknowledgement" +] diff --git a/packages/字体精简工具/node_modules/spdx-license-ids/package.json b/packages/字体精简工具/node_modules/spdx-license-ids/package.json new file mode 100644 index 0000000..08c3b50 --- /dev/null +++ b/packages/字体精简工具/node_modules/spdx-license-ids/package.json @@ -0,0 +1,76 @@ +{ + "_from": "spdx-license-ids@^3.0.0", + "_id": "spdx-license-ids@3.0.9", + "_inBundle": false, + "_integrity": "sha1-illRNd75WSvaaXCUdPHL7qfCRn8=", + "_location": "/spdx-license-ids", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "spdx-license-ids@^3.0.0", + "name": "spdx-license-ids", + "escapedName": "spdx-license-ids", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/spdx-correct", + "/spdx-expression-parse" + ], + "_resolved": "https://registry.nlark.com/spdx-license-ids/download/spdx-license-ids-3.0.9.tgz?cache=0&sync_timestamp=1621652583280&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.9.tgz", + "_shasum": "8a595135def9592bda69709474f1cbeea7c2467f", + "_spec": "spdx-license-ids@^3.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\spdx-correct", + "author": { + "name": "Shinnosuke Watanabe", + "url": "https://github.com/shinnn" + }, + "bugs": { + "url": "https://github.com/jslicense/spdx-license-ids/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "A list of SPDX license identifiers", + "devDependencies": { + "@shinnn/eslint-config": "^6.8.7", + "chalk": "^2.4.1", + "eslint": "^5.10.0", + "get-spdx-license-ids": "^2.1.0", + "rmfr": "^2.0.0", + "tape": "^4.9.1" + }, + "eslintConfig": { + "extends": "@shinnn" + }, + "files": [ + "deprecated.json", + "index.json" + ], + "homepage": "https://github.com/jslicense/spdx-license-ids#readme", + "keywords": [ + "spdx", + "license", + "licenses", + "id", + "identifier", + "identifiers", + "json", + "array", + "oss" + ], + "license": "CC0-1.0", + "name": "spdx-license-ids", + "repository": { + "type": "git", + "url": "git+https://github.com/jslicense/spdx-license-ids.git" + }, + "scripts": { + "build": "node build.js", + "latest": "node latest.js", + "pretest": "eslint .", + "test": "node test.js" + }, + "version": "3.0.9" +} diff --git a/packages/字体精简工具/node_modules/sshpk/.npmignore b/packages/字体精简工具/node_modules/sshpk/.npmignore new file mode 100644 index 0000000..8000b59 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/.npmignore @@ -0,0 +1,9 @@ +.gitmodules +deps +docs +Makefile +node_modules +test +tools +coverage +man/src diff --git a/packages/字体精简工具/node_modules/sshpk/.travis.yml b/packages/字体精简工具/node_modules/sshpk/.travis.yml new file mode 100644 index 0000000..c3394c2 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +node_js: + - "5.10" + - "4.4" + - "4.1" + - "0.12" + - "0.10" +before_install: + - "make check" +after_success: + - '[ "${TRAVIS_NODE_VERSION}" = "4.4" ] && make codecovio' diff --git a/packages/字体精简工具/node_modules/sshpk/LICENSE b/packages/字体精简工具/node_modules/sshpk/LICENSE new file mode 100644 index 0000000..f6d947d --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/sshpk/README.md b/packages/字体精简工具/node_modules/sshpk/README.md new file mode 100644 index 0000000..5740f74 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/README.md @@ -0,0 +1,804 @@ +sshpk +========= + +Parse, convert, fingerprint and use SSH keys (both public and private) in pure +node -- no `ssh-keygen` or other external dependencies. + +Supports RSA, DSA, ECDSA (nistp-\*) and ED25519 key types, in PEM (PKCS#1, +PKCS#8) and OpenSSH formats. + +This library has been extracted from +[`node-http-signature`](https://github.com/joyent/node-http-signature) +(work by [Mark Cavage](https://github.com/mcavage) and +[Dave Eddy](https://github.com/bahamas10)) and +[`node-ssh-fingerprint`](https://github.com/bahamas10/node-ssh-fingerprint) +(work by Dave Eddy), with additions (including ECDSA support) by +[Alex Wilson](https://github.com/arekinath). + +Install +------- + +``` +npm install sshpk +``` + +Examples +-------- + +```js +var sshpk = require('sshpk'); + +var fs = require('fs'); + +/* Read in an OpenSSH-format public key */ +var keyPub = fs.readFileSync('id_rsa.pub'); +var key = sshpk.parseKey(keyPub, 'ssh'); + +/* Get metadata about the key */ +console.log('type => %s', key.type); +console.log('size => %d bits', key.size); +console.log('comment => %s', key.comment); + +/* Compute key fingerprints, in new OpenSSH (>6.7) format, and old MD5 */ +console.log('fingerprint => %s', key.fingerprint().toString()); +console.log('old-style fingerprint => %s', key.fingerprint('md5').toString()); +``` + +Example output: + +``` +type => rsa +size => 2048 bits +comment => foo@foo.com +fingerprint => SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w +old-style fingerprint => a0:c8:ad:6c:32:9a:32:fa:59:cc:a9:8c:0a:0d:6e:bd +``` + +More examples: converting between formats: + +```js +/* Read in a PEM public key */ +var keyPem = fs.readFileSync('id_rsa.pem'); +var key = sshpk.parseKey(keyPem, 'pem'); + +/* Convert to PEM PKCS#8 public key format */ +var pemBuf = key.toBuffer('pkcs8'); + +/* Convert to SSH public key format (and return as a string) */ +var sshKey = key.toString('ssh'); +``` + +Signing and verifying: + +```js +/* Read in an OpenSSH/PEM *private* key */ +var keyPriv = fs.readFileSync('id_ecdsa'); +var key = sshpk.parsePrivateKey(keyPriv, 'pem'); + +var data = 'some data'; + +/* Sign some data with the key */ +var s = key.createSign('sha1'); +s.update(data); +var signature = s.sign(); + +/* Now load the public key (could also use just key.toPublic()) */ +var keyPub = fs.readFileSync('id_ecdsa.pub'); +key = sshpk.parseKey(keyPub, 'ssh'); + +/* Make a crypto.Verifier with this key */ +var v = key.createVerify('sha1'); +v.update(data); +var valid = v.verify(signature); +/* => true! */ +``` + +Matching fingerprints with keys: + +```js +var fp = sshpk.parseFingerprint('SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w'); + +var keys = [sshpk.parseKey(...), sshpk.parseKey(...), ...]; + +keys.forEach(function (key) { + if (fp.matches(key)) + console.log('found it!'); +}); +``` + +Usage +----- + +## Public keys + +### `parseKey(data[, format = 'auto'[, options]])` + +Parses a key from a given data format and returns a new `Key` object. + +Parameters + +- `data` -- Either a Buffer or String, containing the key +- `format` -- String name of format to use, valid options are: + - `auto`: choose automatically from all below + - `pem`: supports both PKCS#1 and PKCS#8 + - `ssh`: standard OpenSSH format, + - `pkcs1`, `pkcs8`: variants of `pem` + - `rfc4253`: raw OpenSSH wire format + - `openssh`: new post-OpenSSH 6.5 internal format, produced by + `ssh-keygen -o` + - `dnssec`: `.key` file format output by `dnssec-keygen` etc + - `putty`: the PuTTY `.ppk` file format (supports truncated variant without + all the lines from `Private-Lines:` onwards) +- `options` -- Optional Object, extra options, with keys: + - `filename` -- Optional String, name for the key being parsed + (eg. the filename that was opened). Used to generate + Error messages + - `passphrase` -- Optional String, encryption passphrase used to decrypt an + encrypted PEM file + +### `Key.isKey(obj)` + +Returns `true` if the given object is a valid `Key` object created by a version +of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Key#type` + +String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`. + +### `Key#size` + +Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus; +for ECDSA this is the bit size of the curve in use. + +### `Key#comment` + +Optional string, a key comment used by some formats (eg the `ssh` format). + +### `Key#curve` + +Only present if `this.type === 'ecdsa'`, string containing the name of the +named curve used with this key. Possible values include `nistp256`, `nistp384` +and `nistp521`. + +### `Key#toBuffer([format = 'ssh'])` + +Convert the key into a given data format and return the serialized key as +a Buffer. + +Parameters + +- `format` -- String name of format to use, for valid options see `parseKey()` + +### `Key#toString([format = 'ssh])` + +Same as `this.toBuffer(format).toString()`. + +### `Key#fingerprint([algorithm = 'sha256'[, hashType = 'ssh']])` + +Creates a new `Fingerprint` object representing this Key's fingerprint. + +Parameters + +- `algorithm` -- String name of hash algorithm to use, valid options are `md5`, + `sha1`, `sha256`, `sha384`, `sha512` +- `hashType` -- String name of fingerprint hash type to use, valid options are + `ssh` (the type of fingerprint used by OpenSSH, e.g. in + `ssh-keygen`), `spki` (used by HPKP, some OpenSSL applications) + +### `Key#createVerify([hashAlgorithm])` + +Creates a `crypto.Verifier` specialized to use this Key (and the correct public +key algorithm to match it). The returned Verifier has the same API as a regular +one, except that the `verify()` function takes only the target signature as an +argument. + +Parameters + +- `hashAlgorithm` -- optional String name of hash algorithm to use, any + supported by OpenSSL are valid, usually including + `sha1`, `sha256`. + +`v.verify(signature[, format])` Parameters + +- `signature` -- either a Signature object, or a Buffer or String +- `format` -- optional String, name of format to interpret given String with. + Not valid if `signature` is a Signature or Buffer. + +### `Key#createDiffieHellman()` +### `Key#createDH()` + +Creates a Diffie-Hellman key exchange object initialized with this key and all +necessary parameters. This has the same API as a `crypto.DiffieHellman` +instance, except that functions take `Key` and `PrivateKey` objects as +arguments, and return them where indicated for. + +This is only valid for keys belonging to a cryptosystem that supports DHE +or a close analogue (i.e. `dsa`, `ecdsa` and `curve25519` keys). An attempt +to call this function on other keys will yield an `Error`. + +## Private keys + +### `parsePrivateKey(data[, format = 'auto'[, options]])` + +Parses a private key from a given data format and returns a new +`PrivateKey` object. + +Parameters + +- `data` -- Either a Buffer or String, containing the key +- `format` -- String name of format to use, valid options are: + - `auto`: choose automatically from all below + - `pem`: supports both PKCS#1 and PKCS#8 + - `ssh`, `openssh`: new post-OpenSSH 6.5 internal format, produced by + `ssh-keygen -o` + - `pkcs1`, `pkcs8`: variants of `pem` + - `rfc4253`: raw OpenSSH wire format + - `dnssec`: `.private` format output by `dnssec-keygen` etc. +- `options` -- Optional Object, extra options, with keys: + - `filename` -- Optional String, name for the key being parsed + (eg. the filename that was opened). Used to generate + Error messages + - `passphrase` -- Optional String, encryption passphrase used to decrypt an + encrypted PEM file + +### `generatePrivateKey(type[, options])` + +Generates a new private key of a certain key type, from random data. + +Parameters + +- `type` -- String, type of key to generate. Currently supported are `'ecdsa'` + and `'ed25519'` +- `options` -- optional Object, with keys: + - `curve` -- optional String, for `'ecdsa'` keys, specifies the curve to use. + If ECDSA is specified and this option is not given, defaults to + using `'nistp256'`. + +### `PrivateKey.isPrivateKey(obj)` + +Returns `true` if the given object is a valid `PrivateKey` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `PrivateKey#type` + +String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`. + +### `PrivateKey#size` + +Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus; +for ECDSA this is the bit size of the curve in use. + +### `PrivateKey#curve` + +Only present if `this.type === 'ecdsa'`, string containing the name of the +named curve used with this key. Possible values include `nistp256`, `nistp384` +and `nistp521`. + +### `PrivateKey#toBuffer([format = 'pkcs1'])` + +Convert the key into a given data format and return the serialized key as +a Buffer. + +Parameters + +- `format` -- String name of format to use, valid options are listed under + `parsePrivateKey`. Note that ED25519 keys default to `openssh` + format instead (as they have no `pkcs1` representation). + +### `PrivateKey#toString([format = 'pkcs1'])` + +Same as `this.toBuffer(format).toString()`. + +### `PrivateKey#toPublic()` + +Extract just the public part of this private key, and return it as a `Key` +object. + +### `PrivateKey#fingerprint([algorithm = 'sha256'])` + +Same as `this.toPublic().fingerprint()`. + +### `PrivateKey#createVerify([hashAlgorithm])` + +Same as `this.toPublic().createVerify()`. + +### `PrivateKey#createSign([hashAlgorithm])` + +Creates a `crypto.Sign` specialized to use this PrivateKey (and the correct +key algorithm to match it). The returned Signer has the same API as a regular +one, except that the `sign()` function takes no arguments, and returns a +`Signature` object. + +Parameters + +- `hashAlgorithm` -- optional String name of hash algorithm to use, any + supported by OpenSSL are valid, usually including + `sha1`, `sha256`. + +`v.sign()` Parameters + +- none + +### `PrivateKey#derive(newType)` + +Derives a related key of type `newType` from this key. Currently this is +only supported to change between `ed25519` and `curve25519` keys which are +stored with the same private key (but usually distinct public keys in order +to avoid degenerate keys that lead to a weak Diffie-Hellman exchange). + +Parameters + +- `newType` -- String, type of key to derive, either `ed25519` or `curve25519` + +## Fingerprints + +### `parseFingerprint(fingerprint[, options])` + +Pre-parses a fingerprint, creating a `Fingerprint` object that can be used to +quickly locate a key by using the `Fingerprint#matches` function. + +Parameters + +- `fingerprint` -- String, the fingerprint value, in any supported format +- `options` -- Optional Object, with properties: + - `algorithms` -- Array of strings, names of hash algorithms to limit + support to. If `fingerprint` uses a hash algorithm not on + this list, throws `InvalidAlgorithmError`. + - `hashType` -- String, the type of hash the fingerprint uses, either `ssh` + or `spki` (normally auto-detected based on the format, but + can be overridden) + - `type` -- String, the entity this fingerprint identifies, either `key` or + `certificate` + +### `Fingerprint.isFingerprint(obj)` + +Returns `true` if the given object is a valid `Fingerprint` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Fingerprint#toString([format])` + +Returns a fingerprint as a string, in the given format. + +Parameters + +- `format` -- Optional String, format to use, valid options are `hex` and + `base64`. If this `Fingerprint` uses the `md5` algorithm, the + default format is `hex`. Otherwise, the default is `base64`. + +### `Fingerprint#matches(keyOrCertificate)` + +Verifies whether or not this `Fingerprint` matches a given `Key` or +`Certificate`. This function uses double-hashing to avoid leaking timing +information. Returns a boolean. + +Note that a `Key`-type Fingerprint will always return `false` if asked to match +a `Certificate` and vice versa. + +Parameters + +- `keyOrCertificate` -- a `Key` object or `Certificate` object, the entity to + match this fingerprint against + +## Signatures + +### `parseSignature(signature, algorithm, format)` + +Parses a signature in a given format, creating a `Signature` object. Useful +for converting between the SSH and ASN.1 (PKCS/OpenSSL) signature formats, and +also returned as output from `PrivateKey#createSign().sign()`. + +A Signature object can also be passed to a verifier produced by +`Key#createVerify()` and it will automatically be converted internally into the +correct format for verification. + +Parameters + +- `signature` -- a Buffer (binary) or String (base64), data of the actual + signature in the given format +- `algorithm` -- a String, name of the algorithm to be used, possible values + are `rsa`, `dsa`, `ecdsa` +- `format` -- a String, either `asn1` or `ssh` + +### `Signature.isSignature(obj)` + +Returns `true` if the given object is a valid `Signature` object created by a +version of `sshpk` compatible with this one. + +Parameters + +- `obj` -- Object to identify + +### `Signature#toBuffer([format = 'asn1'])` + +Converts a Signature to the given format and returns it as a Buffer. + +Parameters + +- `format` -- a String, either `asn1` or `ssh` + +### `Signature#toString([format = 'asn1'])` + +Same as `this.toBuffer(format).toString('base64')`. + +## Certificates + +`sshpk` includes basic support for parsing certificates in X.509 (PEM) format +and the OpenSSH certificate format. This feature is intended to be used mainly +to access basic metadata about certificates, extract public keys from them, and +also to generate simple self-signed certificates from an existing key. + +Notably, there is no implementation of CA chain-of-trust verification, and only +very minimal support for key usage restrictions. Please do the security world +a favour, and DO NOT use this code for certificate verification in the +traditional X.509 CA chain style. + +### `parseCertificate(data, format)` + +Parameters + + - `data` -- a Buffer or String + - `format` -- a String, format to use, one of `'openssh'`, `'pem'` (X.509 in a + PEM wrapper), or `'x509'` (raw DER encoded) + +### `createSelfSignedCertificate(subject, privateKey[, options])` + +Parameters + + - `subject` -- an Identity, the subject of the certificate + - `privateKey` -- a PrivateKey, the key of the subject: will be used both to be + placed in the certificate and also to sign it (since this is + a self-signed certificate) + - `options` -- optional Object, with keys: + - `lifetime` -- optional Number, lifetime of the certificate from now in + seconds + - `validFrom`, `validUntil` -- optional Dates, beginning and end of + certificate validity period. If given + `lifetime` will be ignored + - `serial` -- optional Buffer, the serial number of the certificate + - `purposes` -- optional Array of String, X.509 key usage restrictions + +### `createCertificate(subject, key, issuer, issuerKey[, options])` + +Parameters + + - `subject` -- an Identity, the subject of the certificate + - `key` -- a Key, the public key of the subject + - `issuer` -- an Identity, the issuer of the certificate who will sign it + - `issuerKey` -- a PrivateKey, the issuer's private key for signing + - `options` -- optional Object, with keys: + - `lifetime` -- optional Number, lifetime of the certificate from now in + seconds + - `validFrom`, `validUntil` -- optional Dates, beginning and end of + certificate validity period. If given + `lifetime` will be ignored + - `serial` -- optional Buffer, the serial number of the certificate + - `purposes` -- optional Array of String, X.509 key usage restrictions + +### `Certificate#subjects` + +Array of `Identity` instances describing the subject of this certificate. + +### `Certificate#issuer` + +The `Identity` of the Certificate's issuer (signer). + +### `Certificate#subjectKey` + +The public key of the subject of the certificate, as a `Key` instance. + +### `Certificate#issuerKey` + +The public key of the signing issuer of this certificate, as a `Key` instance. +May be `undefined` if the issuer's key is unknown (e.g. on an X509 certificate). + +### `Certificate#serial` + +The serial number of the certificate. As this is normally a 64-bit or wider +integer, it is returned as a Buffer. + +### `Certificate#purposes` + +Array of Strings indicating the X.509 key usage purposes that this certificate +is valid for. The possible strings at the moment are: + + * `'signature'` -- key can be used for digital signatures + * `'identity'` -- key can be used to attest about the identity of the signer + (X.509 calls this `nonRepudiation`) + * `'codeSigning'` -- key can be used to sign executable code + * `'keyEncryption'` -- key can be used to encrypt other keys + * `'encryption'` -- key can be used to encrypt data (only applies for RSA) + * `'keyAgreement'` -- key can be used for key exchange protocols such as + Diffie-Hellman + * `'ca'` -- key can be used to sign other certificates (is a Certificate + Authority) + * `'crl'` -- key can be used to sign Certificate Revocation Lists (CRLs) + +### `Certificate#getExtension(nameOrOid)` + +Retrieves information about a certificate extension, if present, or returns +`undefined` if not. The string argument `nameOrOid` should be either the OID +(for X509 extensions) or the name (for OpenSSH extensions) of the extension +to retrieve. + +The object returned will have the following properties: + + * `format` -- String, set to either `'x509'` or `'openssh'` + * `name` or `oid` -- String, only one set based on value of `format` + * `data` -- Buffer, the raw data inside the extension + +### `Certificate#getExtensions()` + +Returns an Array of all present certificate extensions, in the same manner and +format as `getExtension()`. + +### `Certificate#isExpired([when])` + +Tests whether the Certificate is currently expired (i.e. the `validFrom` and +`validUntil` dates specify a range of time that does not include the current +time). + +Parameters + + - `when` -- optional Date, if specified, tests whether the Certificate was or + will be expired at the specified time instead of now + +Returns a Boolean. + +### `Certificate#isSignedByKey(key)` + +Tests whether the Certificate was validly signed by the given (public) Key. + +Parameters + + - `key` -- a Key instance + +Returns a Boolean. + +### `Certificate#isSignedBy(certificate)` + +Tests whether this Certificate was validly signed by the subject of the given +certificate. Also tests that the issuer Identity of this Certificate and the +subject Identity of the other Certificate are equivalent. + +Parameters + + - `certificate` -- another Certificate instance + +Returns a Boolean. + +### `Certificate#fingerprint([hashAlgo])` + +Returns the X509-style fingerprint of the entire certificate (as a Fingerprint +instance). This matches what a web-browser or similar would display as the +certificate fingerprint and should not be confused with the fingerprint of the +subject's public key. + +Parameters + + - `hashAlgo` -- an optional String, any hash function name + +### `Certificate#toBuffer([format])` + +Serializes the Certificate to a Buffer and returns it. + +Parameters + + - `format` -- an optional String, output format, one of `'openssh'`, `'pem'` or + `'x509'`. Defaults to `'x509'`. + +Returns a Buffer. + +### `Certificate#toString([format])` + + - `format` -- an optional String, output format, one of `'openssh'`, `'pem'` or + `'x509'`. Defaults to `'pem'`. + +Returns a String. + +## Certificate identities + +### `identityForHost(hostname)` + +Constructs a host-type Identity for a given hostname. + +Parameters + + - `hostname` -- the fully qualified DNS name of the host + +Returns an Identity instance. + +### `identityForUser(uid)` + +Constructs a user-type Identity for a given UID. + +Parameters + + - `uid` -- a String, user identifier (login name) + +Returns an Identity instance. + +### `identityForEmail(email)` + +Constructs an email-type Identity for a given email address. + +Parameters + + - `email` -- a String, email address + +Returns an Identity instance. + +### `identityFromDN(dn)` + +Parses an LDAP-style DN string (e.g. `'CN=foo, C=US'`) and turns it into an +Identity instance. + +Parameters + + - `dn` -- a String + +Returns an Identity instance. + +### `identityFromArray(arr)` + +Constructs an Identity from an array of DN components (see `Identity#toArray()` +for the format). + +Parameters + + - `arr` -- an Array of Objects, DN components with `name` and `value` + +Returns an Identity instance. + + +Supported attributes in DNs: + +| Attribute name | OID | +| -------------- | --- | +| `cn` | `2.5.4.3` | +| `o` | `2.5.4.10` | +| `ou` | `2.5.4.11` | +| `l` | `2.5.4.7` | +| `s` | `2.5.4.8` | +| `c` | `2.5.4.6` | +| `sn` | `2.5.4.4` | +| `postalCode` | `2.5.4.17` | +| `serialNumber` | `2.5.4.5` | +| `street` | `2.5.4.9` | +| `x500UniqueIdentifier` | `2.5.4.45` | +| `role` | `2.5.4.72` | +| `telephoneNumber` | `2.5.4.20` | +| `description` | `2.5.4.13` | +| `dc` | `0.9.2342.19200300.100.1.25` | +| `uid` | `0.9.2342.19200300.100.1.1` | +| `mail` | `0.9.2342.19200300.100.1.3` | +| `title` | `2.5.4.12` | +| `gn` | `2.5.4.42` | +| `initials` | `2.5.4.43` | +| `pseudonym` | `2.5.4.65` | + +### `Identity#toString()` + +Returns the identity as an LDAP-style DN string. +e.g. `'CN=foo, O=bar corp, C=us'` + +### `Identity#type` + +The type of identity. One of `'host'`, `'user'`, `'email'` or `'unknown'` + +### `Identity#hostname` +### `Identity#uid` +### `Identity#email` + +Set when `type` is `'host'`, `'user'`, or `'email'`, respectively. Strings. + +### `Identity#cn` + +The value of the first `CN=` in the DN, if any. It's probably better to use +the `#get()` method instead of this property. + +### `Identity#get(name[, asArray])` + +Returns the value of a named attribute in the Identity DN. If there is no +attribute of the given name, returns `undefined`. If multiple components +of the DN contain an attribute of this name, an exception is thrown unless +the `asArray` argument is given as `true` -- then they will be returned as +an Array in the same order they appear in the DN. + +Parameters + + - `name` -- a String + - `asArray` -- an optional Boolean + +### `Identity#toArray()` + +Returns the Identity as an Array of DN component objects. This looks like: + +```js +[ { + "name": "cn", + "value": "Joe Bloggs" +}, +{ + "name": "o", + "value": "Organisation Ltd" +} ] +``` + +Each object has a `name` and a `value` property. The returned objects may be +safely modified. + +Errors +------ + +### `InvalidAlgorithmError` + +The specified algorithm is not valid, either because it is not supported, or +because it was not included on a list of allowed algorithms. + +Thrown by `Fingerprint.parse`, `Key#fingerprint`. + +Properties + +- `algorithm` -- the algorithm that could not be validated + +### `FingerprintFormatError` + +The fingerprint string given could not be parsed as a supported fingerprint +format, or the specified fingerprint format is invalid. + +Thrown by `Fingerprint.parse`, `Fingerprint#toString`. + +Properties + +- `fingerprint` -- if caused by a fingerprint, the string value given +- `format` -- if caused by an invalid format specification, the string value given + +### `KeyParseError` + +The key data given could not be parsed as a valid key. + +Properties + +- `keyName` -- `filename` that was given to `parseKey` +- `format` -- the `format` that was trying to parse the key (see `parseKey`) +- `innerErr` -- the inner Error thrown by the format parser + +### `KeyEncryptedError` + +The key is encrypted with a symmetric key (ie, it is password protected). The +parsing operation would succeed if it was given the `passphrase` option. + +Properties + +- `keyName` -- `filename` that was given to `parseKey` +- `format` -- the `format` that was trying to parse the key (currently can only + be `"pem"`) + +### `CertificateParseError` + +The certificate data given could not be parsed as a valid certificate. + +Properties + +- `certName` -- `filename` that was given to `parseCertificate` +- `format` -- the `format` that was trying to parse the key + (see `parseCertificate`) +- `innerErr` -- the inner Error thrown by the format parser + +Friends of sshpk +---------------- + + * [`sshpk-agent`](https://github.com/arekinath/node-sshpk-agent) is a library + for speaking the `ssh-agent` protocol from node.js, which uses `sshpk` diff --git a/packages/字体精简工具/node_modules/sshpk/bin/sshpk-conv b/packages/字体精简工具/node_modules/sshpk/bin/sshpk-conv new file mode 100644 index 0000000..e839ede --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/bin/sshpk-conv @@ -0,0 +1,243 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2018 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var tty = require('tty'); +var readline = require('readline'); +var getPassword = require('getpass').getPass; + +var options = [ + { + names: ['outformat', 't'], + type: 'string', + help: 'Output format' + }, + { + names: ['informat', 'T'], + type: 'string', + help: 'Input format' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input file name (default stdin)' + }, + { + names: ['out', 'o'], + type: 'string', + help: 'Output file name (default stdout)' + }, + { + names: ['private', 'p'], + type: 'bool', + help: 'Produce a private key as output' + }, + { + names: ['derive', 'd'], + type: 'string', + help: 'Output a new key derived from this one, with given algo' + }, + { + names: ['identify', 'i'], + type: 'bool', + help: 'Print key metadata instead of converting' + }, + { + names: ['fingerprint', 'F'], + type: 'bool', + help: 'Output key fingerprint' + }, + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash function to use for key fingeprint with -F' + }, + { + names: ['spki', 's'], + type: 'bool', + help: 'With -F, generates an SPKI fingerprint instead of SSH' + }, + { + names: ['comment', 'c'], + type: 'string', + help: 'Set key comment, if output format supports' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-conv: error: %s', e.message); + process.exit(1); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-conv: converts between SSH key formats\n'); + console.error(help); + console.error('\navailable key formats:'); + console.error(' - pem, pkcs1 eg id_rsa'); + console.error(' - ssh eg id_rsa.pub'); + console.error(' - pkcs8 format you want for openssl'); + console.error(' - openssh like output of ssh-keygen -o'); + console.error(' - rfc4253 raw OpenSSH wire format'); + console.error(' - dnssec dnssec-keygen format'); + console.error(' - putty PuTTY ppk format'); + console.error('\navailable fingerprint formats:'); + console.error(' - hex colon-separated hex for SSH'); + console.error(' straight hex for SPKI'); + console.error(' - base64 SHA256:* format from OpenSSH'); + process.exit(1); + } + + /* + * Key derivation can only be done on private keys, so use of the -d + * option necessarily implies -p. + */ + if (opts.derive) + opts.private = true; + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + ifError(e, 'error opening input file'); + } + + var outFile = process.stdout; + + try { + if (opts.out && !opts.identify) { + fs.accessSync(path.dirname(opts.out), fs.W_OK); + outFile = fs.createWriteStream(opts.out); + } + } catch (e) { + ifError(e, 'error opening output file'); + } + + var bufs = []; + inFile.on('readable', function () { + var data; + while ((data = inFile.read())) + bufs.push(data); + }); + var parseOpts = {}; + parseOpts.filename = inFileName; + inFile.on('end', function processKey() { + var buf = Buffer.concat(bufs); + var fmt = 'auto'; + if (opts.informat) + fmt = opts.informat; + var f = sshpk.parseKey; + if (opts.private) + f = sshpk.parsePrivateKey; + try { + var key = f(buf, fmt, parseOpts); + } catch (e) { + if (e.name === 'KeyEncryptedError') { + getPassword(function (err, pw) { + if (err) + ifError(err); + parseOpts.passphrase = pw; + processKey(); + }); + return; + } + ifError(e); + } + + if (opts.derive) + key = key.derive(opts.derive); + + if (opts.comment) + key.comment = opts.comment; + + if (opts.identify) { + var kind = 'public'; + if (sshpk.PrivateKey.isPrivateKey(key)) + kind = 'private'; + console.log('%s: a %d bit %s %s key', inFileName, + key.size, key.type.toUpperCase(), kind); + if (key.type === 'ecdsa') + console.log('ECDSA curve: %s', key.curve); + if (key.comment) + console.log('Comment: %s', key.comment); + console.log('SHA256 fingerprint: ' + + key.fingerprint('sha256').toString()); + console.log('MD5 fingerprint: ' + + key.fingerprint('md5').toString()); + console.log('SPKI-SHA256 fingerprint: ' + + key.fingerprint('sha256', 'spki').toString()); + process.exit(0); + return; + } + + if (opts.fingerprint) { + var hash = opts.hash; + var type = opts.spki ? 'spki' : 'ssh'; + var format = opts.outformat; + var fp = key.fingerprint(hash, type).toString(format); + outFile.write(fp); + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + return; + } + + fmt = undefined; + if (opts.outformat) + fmt = opts.outformat; + outFile.write(key.toBuffer(fmt)); + if (fmt === 'ssh' || + (!opts.private && fmt === undefined)) + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + }); +} + +function ifError(e, txt) { + if (txt) + txt = txt + ': '; + else + txt = ''; + console.error('sshpk-conv: ' + txt + e.name + ': ' + e.message); + if (process.env['DEBUG'] || process.env['V']) { + console.error(e.stack); + if (e.innerErr) + console.error(e.innerErr.stack); + } + process.exit(1); +} diff --git a/packages/字体精简工具/node_modules/sshpk/bin/sshpk-sign b/packages/字体精简工具/node_modules/sshpk/bin/sshpk-sign new file mode 100644 index 0000000..673fc98 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/bin/sshpk-sign @@ -0,0 +1,191 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2015 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var getPassword = require('getpass').getPass; + +var options = [ + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash algorithm (sha1, sha256, sha384, sha512)' + }, + { + names: ['verbose', 'v'], + type: 'bool', + help: 'Display verbose info about key and hash used' + }, + { + names: ['identity', 'i'], + type: 'string', + help: 'Path to key to use' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input filename' + }, + { + names: ['out', 'o'], + type: 'string', + help: 'Output filename' + }, + { + names: ['format', 't'], + type: 'string', + help: 'Signature format (asn1, ssh, raw)' + }, + { + names: ['binary', 'b'], + type: 'bool', + help: 'Output raw binary instead of base64' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +var parseOpts = {}; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-sign: error: %s', e.message); + process.exit(1); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-sign: sign data using an SSH key\n'); + console.error(help); + process.exit(1); + } + + if (!opts.identity) { + var help = parser.help({}).trimRight(); + console.error('sshpk-sign: the -i or --identity option ' + + 'is required\n'); + console.error(help); + process.exit(1); + } + + var keyData = fs.readFileSync(opts.identity); + parseOpts.filename = opts.identity; + + run(); +} + +function run() { + var key; + try { + key = sshpk.parsePrivateKey(keyData, 'auto', parseOpts); + } catch (e) { + if (e.name === 'KeyEncryptedError') { + getPassword(function (err, pw) { + parseOpts.passphrase = pw; + run(); + }); + return; + } + console.error('sshpk-sign: error loading private key "' + + opts.identity + '": ' + e.name + ': ' + e.message); + process.exit(1); + } + + var hash = opts.hash || key.defaultHashAlgorithm(); + + var signer; + try { + signer = key.createSign(hash); + } catch (e) { + console.error('sshpk-sign: error creating signer: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + if (opts.verbose) { + console.error('sshpk-sign: using %s-%s with a %d bit key', + key.type, hash, key.size); + } + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + console.error('sshpk-sign: error opening input file' + + ': ' + e.name + ': ' + e.message); + process.exit(1); + } + + var outFile = process.stdout; + + try { + if (opts.out && !opts.identify) { + fs.accessSync(path.dirname(opts.out), fs.W_OK); + outFile = fs.createWriteStream(opts.out); + } + } catch (e) { + console.error('sshpk-sign: error opening output file' + + ': ' + e.name + ': ' + e.message); + process.exit(1); + } + + inFile.pipe(signer); + inFile.on('end', function () { + var sig; + try { + sig = signer.sign(); + } catch (e) { + console.error('sshpk-sign: error signing data: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + var fmt = opts.format || 'asn1'; + var output; + try { + output = sig.toBuffer(fmt); + if (!opts.binary) + output = output.toString('base64'); + } catch (e) { + console.error('sshpk-sign: error converting signature' + + ' to ' + fmt + ' format: ' + e.name + ': ' + + e.message); + process.exit(1); + } + + outFile.write(output); + if (!opts.binary) + outFile.write('\n'); + outFile.once('drain', function () { + process.exit(0); + }); + }); +} diff --git a/packages/字体精简工具/node_modules/sshpk/bin/sshpk-verify b/packages/字体精简工具/node_modules/sshpk/bin/sshpk-verify new file mode 100644 index 0000000..fc71a82 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/bin/sshpk-verify @@ -0,0 +1,167 @@ +#!/usr/bin/env node +// -*- mode: js -*- +// vim: set filetype=javascript : +// Copyright 2015 Joyent, Inc. All rights reserved. + +var dashdash = require('dashdash'); +var sshpk = require('../lib/index'); +var fs = require('fs'); +var path = require('path'); +var Buffer = require('safer-buffer').Buffer; + +var options = [ + { + names: ['hash', 'H'], + type: 'string', + help: 'Hash algorithm (sha1, sha256, sha384, sha512)' + }, + { + names: ['verbose', 'v'], + type: 'bool', + help: 'Display verbose info about key and hash used' + }, + { + names: ['identity', 'i'], + type: 'string', + help: 'Path to (public) key to use' + }, + { + names: ['file', 'f'], + type: 'string', + help: 'Input filename' + }, + { + names: ['format', 't'], + type: 'string', + help: 'Signature format (asn1, ssh, raw)' + }, + { + names: ['signature', 's'], + type: 'string', + help: 'base64-encoded signature data' + }, + { + names: ['help', 'h'], + type: 'bool', + help: 'Shows this help text' + } +]; + +if (require.main === module) { + var parser = dashdash.createParser({ + options: options + }); + + try { + var opts = parser.parse(process.argv); + } catch (e) { + console.error('sshpk-verify: error: %s', e.message); + process.exit(3); + } + + if (opts.help || opts._args.length > 1) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: sign data using an SSH key\n'); + console.error(help); + process.exit(3); + } + + if (!opts.identity) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: the -i or --identity option ' + + 'is required\n'); + console.error(help); + process.exit(3); + } + + if (!opts.signature) { + var help = parser.help({}).trimRight(); + console.error('sshpk-verify: the -s or --signature option ' + + 'is required\n'); + console.error(help); + process.exit(3); + } + + var keyData = fs.readFileSync(opts.identity); + + var key; + try { + key = sshpk.parseKey(keyData); + } catch (e) { + console.error('sshpk-verify: error loading key "' + + opts.identity + '": ' + e.name + ': ' + e.message); + process.exit(2); + } + + var fmt = opts.format || 'asn1'; + var sigData = Buffer.from(opts.signature, 'base64'); + + var sig; + try { + sig = sshpk.parseSignature(sigData, key.type, fmt); + } catch (e) { + console.error('sshpk-verify: error parsing signature: ' + + e.name + ': ' + e.message); + process.exit(2); + } + + var hash = opts.hash || key.defaultHashAlgorithm(); + + var verifier; + try { + verifier = key.createVerify(hash); + } catch (e) { + console.error('sshpk-verify: error creating verifier: ' + + e.name + ': ' + e.message); + process.exit(2); + } + + if (opts.verbose) { + console.error('sshpk-verify: using %s-%s with a %d bit key', + key.type, hash, key.size); + } + + var inFile = process.stdin; + var inFileName = 'stdin'; + + var inFilePath; + if (opts.file) { + inFilePath = opts.file; + } else if (opts._args.length === 1) { + inFilePath = opts._args[0]; + } + + if (inFilePath) + inFileName = path.basename(inFilePath); + + try { + if (inFilePath) { + fs.accessSync(inFilePath, fs.R_OK); + inFile = fs.createReadStream(inFilePath); + } + } catch (e) { + console.error('sshpk-verify: error opening input file' + + ': ' + e.name + ': ' + e.message); + process.exit(2); + } + + inFile.pipe(verifier); + inFile.on('end', function () { + var ret; + try { + ret = verifier.verify(sig); + } catch (e) { + console.error('sshpk-verify: error verifying data: ' + + e.name + ': ' + e.message); + process.exit(1); + } + + if (ret) { + console.error('OK'); + process.exit(0); + } + + console.error('NOT OK'); + process.exit(1); + }); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/algs.js b/packages/字体精简工具/node_modules/sshpk/lib/algs.js new file mode 100644 index 0000000..3b01e7d --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/algs.js @@ -0,0 +1,168 @@ +// Copyright 2015 Joyent, Inc. + +var Buffer = require('safer-buffer').Buffer; + +var algInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y'], + sizePart: 'p' + }, + 'rsa': { + parts: ['e', 'n'], + sizePart: 'n' + }, + 'ecdsa': { + parts: ['curve', 'Q'], + sizePart: 'Q' + }, + 'ed25519': { + parts: ['A'], + sizePart: 'A' + } +}; +algInfo['curve25519'] = algInfo['ed25519']; + +var algPrivInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y', 'x'] + }, + 'rsa': { + parts: ['n', 'e', 'd', 'iqmp', 'p', 'q'] + }, + 'ecdsa': { + parts: ['curve', 'Q', 'd'] + }, + 'ed25519': { + parts: ['A', 'k'] + } +}; +algPrivInfo['curve25519'] = algPrivInfo['ed25519']; + +var hashAlgs = { + 'md5': true, + 'sha1': true, + 'sha256': true, + 'sha384': true, + 'sha512': true +}; + +/* + * Taken from + * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf + */ +var curves = { + 'nistp256': { + size: 256, + pkcs8oid: '1.2.840.10045.3.1.7', + p: Buffer.from(('00' + + 'ffffffff 00000001 00000000 00000000' + + '00000000 ffffffff ffffffff ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF 00000001 00000000 00000000' + + '00000000 FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + '5ac635d8 aa3a93e7 b3ebbd55 769886bc' + + '651d06b0 cc53b0f6 3bce3c3e 27d2604b'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'c49d3608 86e70493 6a6678e1 139d26b7' + + '819f7e90'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff 00000000 ffffffff ffffffff' + + 'bce6faad a7179e84 f3b9cac2 fc632551'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '6b17d1f2 e12c4247 f8bce6e5 63a440f2' + + '77037d81 2deb33a0 f4a13945 d898c296' + + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' + + '2bce3357 6b315ece cbb64068 37bf51f5'). + replace(/ /g, ''), 'hex') + }, + 'nistp384': { + size: 384, + pkcs8oid: '1.3.132.0.34', + p: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffe' + + 'ffffffff 00000000 00000000 ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' + + 'FFFFFFFF 00000000 00000000 FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + 'b3312fa7 e23ee7e4 988e056b e3f82d19' + + '181d9c6e fe814112 0314088f 5013875a' + + 'c656398d 8a2ed19d 2a85c8ed d3ec2aef'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'a335926a a319a27a 1d00896a 6773a482' + + '7acdac73'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff c7634d81 f4372ddf' + + '581a0db2 48b0a77a ecec196a ccc52973'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + 'aa87ca22 be8b0537 8eb1c71e f320ad74' + + '6e1d3b62 8ba79b98 59f741e0 82542a38' + + '5502f25d bf55296c 3a545e38 72760ab7' + + '3617de4a 96262c6f 5d9e98bf 9292dc29' + + 'f8f41dbd 289a147c e9da3113 b5f0b8c0' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f'). + replace(/ /g, ''), 'hex') + }, + 'nistp521': { + size: 521, + pkcs8oid: '1.3.132.0.35', + p: Buffer.from(( + '01ffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffff').replace(/ /g, ''), 'hex'), + a: Buffer.from(('01FF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(('51' + + '953eb961 8e1c9a1f 929a21a0 b68540ee' + + 'a2da725b 99b315f3 b8b48991 8ef109e1' + + '56193951 ec7e937b 1652c0bd 3bb1bf07' + + '3573df88 3d2c34f1 ef451fd4 6b503f00'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'd09e8800 291cb853 96cc6717 393284aa' + + 'a0da64ba').replace(/ /g, ''), 'hex'), + n: Buffer.from(('01ff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffa' + + '51868783 bf2f966b 7fcc0148 f709a5d0' + + '3bb5c9b8 899c47ae bb6fb71e 91386409'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' + + '9c648139 053fb521 f828af60 6b4d3dba' + + 'a14b5e77 efe75928 fe1dc127 a2ffa8de' + + '3348b3c1 856a429b f97e7e31 c2e5bd66' + + '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' + + '98f54449 579b4468 17afbd17 273e662c' + + '97ee7299 5ef42640 c550b901 3fad0761' + + '353c7086 a272c240 88be9476 9fd16650'). + replace(/ /g, ''), 'hex') + } +}; + +module.exports = { + info: algInfo, + privInfo: algPrivInfo, + hashAlgs: hashAlgs, + curves: curves +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/certificate.js b/packages/字体精简工具/node_modules/sshpk/lib/certificate.js new file mode 100644 index 0000000..6932357 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/certificate.js @@ -0,0 +1,410 @@ +// Copyright 2016 Joyent, Inc. + +module.exports = Certificate; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var Key = require('./key'); +var PrivateKey = require('./private-key'); +var Identity = require('./identity'); + +var formats = {}; +formats['openssh'] = require('./formats/openssh-cert'); +formats['x509'] = require('./formats/x509'); +formats['pem'] = require('./formats/x509-pem'); + +var CertificateParseError = errs.CertificateParseError; +var InvalidAlgorithmError = errs.InvalidAlgorithmError; + +function Certificate(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.subjects, 'options.subjects'); + utils.assertCompatible(opts.subjects[0], Identity, [1, 0], + 'options.subjects'); + utils.assertCompatible(opts.subjectKey, Key, [1, 0], + 'options.subjectKey'); + utils.assertCompatible(opts.issuer, Identity, [1, 0], 'options.issuer'); + if (opts.issuerKey !== undefined) { + utils.assertCompatible(opts.issuerKey, Key, [1, 0], + 'options.issuerKey'); + } + assert.object(opts.signatures, 'options.signatures'); + assert.buffer(opts.serial, 'options.serial'); + assert.date(opts.validFrom, 'options.validFrom'); + assert.date(opts.validUntil, 'optons.validUntil'); + + assert.optionalArrayOfString(opts.purposes, 'options.purposes'); + + this._hashCache = {}; + + this.subjects = opts.subjects; + this.issuer = opts.issuer; + this.subjectKey = opts.subjectKey; + this.issuerKey = opts.issuerKey; + this.signatures = opts.signatures; + this.serial = opts.serial; + this.validFrom = opts.validFrom; + this.validUntil = opts.validUntil; + this.purposes = opts.purposes; +} + +Certificate.formats = formats; + +Certificate.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'x509'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + return (formats[format].write(this, options)); +}; + +Certificate.prototype.toString = function (format, options) { + if (format === undefined) + format = 'pem'; + return (this.toBuffer(format, options).toString()); +}; + +Certificate.prototype.fingerprint = function (algo) { + if (algo === undefined) + algo = 'sha256'; + assert.string(algo, 'algorithm'); + var opts = { + type: 'certificate', + hash: this.hash(algo), + algorithm: algo + }; + return (new Fingerprint(opts)); +}; + +Certificate.prototype.hash = function (algo) { + assert.string(algo, 'algorithm'); + algo = algo.toLowerCase(); + if (algs.hashAlgs[algo] === undefined) + throw (new InvalidAlgorithmError(algo)); + + if (this._hashCache[algo]) + return (this._hashCache[algo]); + + var hash = crypto.createHash(algo). + update(this.toBuffer('x509')).digest(); + this._hashCache[algo] = hash; + return (hash); +}; + +Certificate.prototype.isExpired = function (when) { + if (when === undefined) + when = new Date(); + return (!((when.getTime() >= this.validFrom.getTime()) && + (when.getTime() < this.validUntil.getTime()))); +}; + +Certificate.prototype.isSignedBy = function (issuerCert) { + utils.assertCompatible(issuerCert, Certificate, [1, 0], 'issuer'); + + if (!this.issuer.equals(issuerCert.subjects[0])) + return (false); + if (this.issuer.purposes && this.issuer.purposes.length > 0 && + this.issuer.purposes.indexOf('ca') === -1) { + return (false); + } + + return (this.isSignedByKey(issuerCert.subjectKey)); +}; + +Certificate.prototype.getExtension = function (keyOrOid) { + assert.string(keyOrOid, 'keyOrOid'); + var ext = this.getExtensions().filter(function (maybeExt) { + if (maybeExt.format === 'x509') + return (maybeExt.oid === keyOrOid); + if (maybeExt.format === 'openssh') + return (maybeExt.name === keyOrOid); + return (false); + })[0]; + return (ext); +}; + +Certificate.prototype.getExtensions = function () { + var exts = []; + var x509 = this.signatures.x509; + if (x509 && x509.extras && x509.extras.exts) { + x509.extras.exts.forEach(function (ext) { + ext.format = 'x509'; + exts.push(ext); + }); + } + var openssh = this.signatures.openssh; + if (openssh && openssh.exts) { + openssh.exts.forEach(function (ext) { + ext.format = 'openssh'; + exts.push(ext); + }); + } + return (exts); +}; + +Certificate.prototype.isSignedByKey = function (issuerKey) { + utils.assertCompatible(issuerKey, Key, [1, 2], 'issuerKey'); + + if (this.issuerKey !== undefined) { + return (this.issuerKey. + fingerprint('sha512').matches(issuerKey)); + } + + var fmt = Object.keys(this.signatures)[0]; + var valid = formats[fmt].verify(this, issuerKey); + if (valid) + this.issuerKey = issuerKey; + return (valid); +}; + +Certificate.prototype.signWith = function (key) { + utils.assertCompatible(key, PrivateKey, [1, 2], 'key'); + var fmts = Object.keys(formats); + var didOne = false; + for (var i = 0; i < fmts.length; ++i) { + if (fmts[i] !== 'pem') { + var ret = formats[fmts[i]].sign(this, key); + if (ret === true) + didOne = true; + } + } + if (!didOne) { + throw (new Error('Failed to sign the certificate for any ' + + 'available certificate formats')); + } +}; + +Certificate.createSelfSigned = function (subjectOrSubjects, key, options) { + var subjects; + if (Array.isArray(subjectOrSubjects)) + subjects = subjectOrSubjects; + else + subjects = [subjectOrSubjects]; + + assert.arrayOfObject(subjects); + subjects.forEach(function (subject) { + utils.assertCompatible(subject, Identity, [1, 0], 'subject'); + }); + + utils.assertCompatible(key, PrivateKey, [1, 2], 'private key'); + + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalObject(options.validFrom, 'options.validFrom'); + assert.optionalObject(options.validUntil, 'options.validUntil'); + var validFrom = options.validFrom; + var validUntil = options.validUntil; + if (validFrom === undefined) + validFrom = new Date(); + if (validUntil === undefined) { + assert.optionalNumber(options.lifetime, 'options.lifetime'); + var lifetime = options.lifetime; + if (lifetime === undefined) + lifetime = 10*365*24*3600; + validUntil = new Date(); + validUntil.setTime(validUntil.getTime() + lifetime*1000); + } + assert.optionalBuffer(options.serial, 'options.serial'); + var serial = options.serial; + if (serial === undefined) + serial = Buffer.from('0000000000000001', 'hex'); + + var purposes = options.purposes; + if (purposes === undefined) + purposes = []; + + if (purposes.indexOf('signature') === -1) + purposes.push('signature'); + + /* Self-signed certs are always CAs. */ + if (purposes.indexOf('ca') === -1) + purposes.push('ca'); + if (purposes.indexOf('crl') === -1) + purposes.push('crl'); + + /* + * If we weren't explicitly given any other purposes, do the sensible + * thing and add some basic ones depending on the subject type. + */ + if (purposes.length <= 3) { + var hostSubjects = subjects.filter(function (subject) { + return (subject.type === 'host'); + }); + var userSubjects = subjects.filter(function (subject) { + return (subject.type === 'user'); + }); + if (hostSubjects.length > 0) { + if (purposes.indexOf('serverAuth') === -1) + purposes.push('serverAuth'); + } + if (userSubjects.length > 0) { + if (purposes.indexOf('clientAuth') === -1) + purposes.push('clientAuth'); + } + if (userSubjects.length > 0 || hostSubjects.length > 0) { + if (purposes.indexOf('keyAgreement') === -1) + purposes.push('keyAgreement'); + if (key.type === 'rsa' && + purposes.indexOf('encryption') === -1) + purposes.push('encryption'); + } + } + + var cert = new Certificate({ + subjects: subjects, + issuer: subjects[0], + subjectKey: key.toPublic(), + issuerKey: key.toPublic(), + signatures: {}, + serial: serial, + validFrom: validFrom, + validUntil: validUntil, + purposes: purposes + }); + cert.signWith(key); + + return (cert); +}; + +Certificate.create = + function (subjectOrSubjects, key, issuer, issuerKey, options) { + var subjects; + if (Array.isArray(subjectOrSubjects)) + subjects = subjectOrSubjects; + else + subjects = [subjectOrSubjects]; + + assert.arrayOfObject(subjects); + subjects.forEach(function (subject) { + utils.assertCompatible(subject, Identity, [1, 0], 'subject'); + }); + + utils.assertCompatible(key, Key, [1, 0], 'key'); + if (PrivateKey.isPrivateKey(key)) + key = key.toPublic(); + utils.assertCompatible(issuer, Identity, [1, 0], 'issuer'); + utils.assertCompatible(issuerKey, PrivateKey, [1, 2], 'issuer key'); + + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalObject(options.validFrom, 'options.validFrom'); + assert.optionalObject(options.validUntil, 'options.validUntil'); + var validFrom = options.validFrom; + var validUntil = options.validUntil; + if (validFrom === undefined) + validFrom = new Date(); + if (validUntil === undefined) { + assert.optionalNumber(options.lifetime, 'options.lifetime'); + var lifetime = options.lifetime; + if (lifetime === undefined) + lifetime = 10*365*24*3600; + validUntil = new Date(); + validUntil.setTime(validUntil.getTime() + lifetime*1000); + } + assert.optionalBuffer(options.serial, 'options.serial'); + var serial = options.serial; + if (serial === undefined) + serial = Buffer.from('0000000000000001', 'hex'); + + var purposes = options.purposes; + if (purposes === undefined) + purposes = []; + + if (purposes.indexOf('signature') === -1) + purposes.push('signature'); + + if (options.ca === true) { + if (purposes.indexOf('ca') === -1) + purposes.push('ca'); + if (purposes.indexOf('crl') === -1) + purposes.push('crl'); + } + + var hostSubjects = subjects.filter(function (subject) { + return (subject.type === 'host'); + }); + var userSubjects = subjects.filter(function (subject) { + return (subject.type === 'user'); + }); + if (hostSubjects.length > 0) { + if (purposes.indexOf('serverAuth') === -1) + purposes.push('serverAuth'); + } + if (userSubjects.length > 0) { + if (purposes.indexOf('clientAuth') === -1) + purposes.push('clientAuth'); + } + if (userSubjects.length > 0 || hostSubjects.length > 0) { + if (purposes.indexOf('keyAgreement') === -1) + purposes.push('keyAgreement'); + if (key.type === 'rsa' && + purposes.indexOf('encryption') === -1) + purposes.push('encryption'); + } + + var cert = new Certificate({ + subjects: subjects, + issuer: issuer, + subjectKey: key, + issuerKey: issuerKey.toPublic(), + signatures: {}, + serial: serial, + validFrom: validFrom, + validUntil: validUntil, + purposes: purposes + }); + cert.signWith(issuerKey); + + return (cert); +}; + +Certificate.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + return (k); + } catch (e) { + throw (new CertificateParseError(options.filename, format, e)); + } +}; + +Certificate.isCertificate = function (obj, ver) { + return (utils.isCompatible(obj, Certificate, ver)); +}; + +/* + * API versions for Certificate: + * [1,0] -- initial ver + * [1,1] -- openssh format now unpacks extensions + */ +Certificate.prototype._sshpkApiVersion = [1, 1]; + +Certificate._oldVersionDetect = function (obj) { + return ([1, 0]); +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/dhe.js b/packages/字体精简工具/node_modules/sshpk/lib/dhe.js new file mode 100644 index 0000000..a3c8032 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/dhe.js @@ -0,0 +1,397 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + DiffieHellman: DiffieHellman, + generateECDSA: generateECDSA, + generateED25519: generateED25519 +}; + +var assert = require('assert-plus'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var utils = require('./utils'); +var nacl = require('tweetnacl'); + +var Key = require('./key'); +var PrivateKey = require('./private-key'); + +var CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined); + +var ecdh = require('ecc-jsbn'); +var ec = require('ecc-jsbn/lib/ec'); +var jsbn = require('jsbn').BigInteger; + +function DiffieHellman(key) { + utils.assertCompatible(key, Key, [1, 4], 'key'); + this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]); + this._algo = key.type; + this._curve = key.curve; + this._key = key; + if (key.type === 'dsa') { + if (!CRYPTO_HAVE_ECDH) { + throw (new Error('Due to bugs in the node 0.10 ' + + 'crypto API, node 0.12.x or later is required ' + + 'to use DH')); + } + this._dh = crypto.createDiffieHellman( + key.part.p.data, undefined, + key.part.g.data, undefined); + this._p = key.part.p; + this._g = key.part.g; + if (this._isPriv) + this._dh.setPrivateKey(key.part.x.data); + this._dh.setPublicKey(key.part.y.data); + + } else if (key.type === 'ecdsa') { + if (!CRYPTO_HAVE_ECDH) { + this._ecParams = new X9ECParameters(this._curve); + + if (this._isPriv) { + this._priv = new ECPrivate( + this._ecParams, key.part.d.data); + } + return; + } + + var curve = { + 'nistp256': 'prime256v1', + 'nistp384': 'secp384r1', + 'nistp521': 'secp521r1' + }[key.curve]; + this._dh = crypto.createECDH(curve); + if (typeof (this._dh) !== 'object' || + typeof (this._dh.setPrivateKey) !== 'function') { + CRYPTO_HAVE_ECDH = false; + DiffieHellman.call(this, key); + return; + } + if (this._isPriv) + this._dh.setPrivateKey(key.part.d.data); + this._dh.setPublicKey(key.part.Q.data); + + } else if (key.type === 'curve25519') { + if (this._isPriv) { + utils.assertCompatible(key, PrivateKey, [1, 5], 'key'); + this._priv = key.part.k.data; + } + + } else { + throw (new Error('DH not supported for ' + key.type + ' keys')); + } +} + +DiffieHellman.prototype.getPublicKey = function () { + if (this._isPriv) + return (this._key.toPublic()); + return (this._key); +}; + +DiffieHellman.prototype.getPrivateKey = function () { + if (this._isPriv) + return (this._key); + else + return (undefined); +}; +DiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey; + +DiffieHellman.prototype._keyCheck = function (pk, isPub) { + assert.object(pk, 'key'); + if (!isPub) + utils.assertCompatible(pk, PrivateKey, [1, 3], 'key'); + utils.assertCompatible(pk, Key, [1, 4], 'key'); + + if (pk.type !== this._algo) { + throw (new Error('A ' + pk.type + ' key cannot be used in ' + + this._algo + ' Diffie-Hellman')); + } + + if (pk.curve !== this._curve) { + throw (new Error('A key from the ' + pk.curve + ' curve ' + + 'cannot be used with a ' + this._curve + + ' Diffie-Hellman')); + } + + if (pk.type === 'dsa') { + assert.deepEqual(pk.part.p, this._p, + 'DSA key prime does not match'); + assert.deepEqual(pk.part.g, this._g, + 'DSA key generator does not match'); + } +}; + +DiffieHellman.prototype.setKey = function (pk) { + this._keyCheck(pk); + + if (pk.type === 'dsa') { + this._dh.setPrivateKey(pk.part.x.data); + this._dh.setPublicKey(pk.part.y.data); + + } else if (pk.type === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + this._dh.setPrivateKey(pk.part.d.data); + this._dh.setPublicKey(pk.part.Q.data); + } else { + this._priv = new ECPrivate( + this._ecParams, pk.part.d.data); + } + + } else if (pk.type === 'curve25519') { + var k = pk.part.k; + if (!pk.part.k) + k = pk.part.r; + this._priv = k.data; + if (this._priv[0] === 0x00) + this._priv = this._priv.slice(1); + this._priv = this._priv.slice(0, 32); + } + this._key = pk; + this._isPriv = true; +}; +DiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey; + +DiffieHellman.prototype.computeSecret = function (otherpk) { + this._keyCheck(otherpk, true); + if (!this._isPriv) + throw (new Error('DH exchange has not been initialized with ' + + 'a private key yet')); + + var pub; + if (this._algo === 'dsa') { + return (this._dh.computeSecret( + otherpk.part.y.data)); + + } else if (this._algo === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + return (this._dh.computeSecret( + otherpk.part.Q.data)); + } else { + pub = new ECPublic( + this._ecParams, otherpk.part.Q.data); + return (this._priv.deriveSharedSecret(pub)); + } + + } else if (this._algo === 'curve25519') { + pub = otherpk.part.A.data; + while (pub[0] === 0x00 && pub.length > 32) + pub = pub.slice(1); + var priv = this._priv; + assert.strictEqual(pub.length, 32); + assert.strictEqual(priv.length, 32); + + var secret = nacl.box.before(new Uint8Array(pub), + new Uint8Array(priv)); + + return (Buffer.from(secret)); + } + + throw (new Error('Invalid algorithm: ' + this._algo)); +}; + +DiffieHellman.prototype.generateKey = function () { + var parts = []; + var priv, pub; + if (this._algo === 'dsa') { + this._dh.generateKeys(); + + parts.push({name: 'p', data: this._p.data}); + parts.push({name: 'q', data: this._key.part.q.data}); + parts.push({name: 'g', data: this._g.data}); + parts.push({name: 'y', data: this._dh.getPublicKey()}); + parts.push({name: 'x', data: this._dh.getPrivateKey()}); + this._key = new PrivateKey({ + type: 'dsa', + parts: parts + }); + this._isPriv = true; + return (this._key); + + } else if (this._algo === 'ecdsa') { + if (CRYPTO_HAVE_ECDH) { + this._dh.generateKeys(); + + parts.push({name: 'curve', + data: Buffer.from(this._curve)}); + parts.push({name: 'Q', data: this._dh.getPublicKey()}); + parts.push({name: 'd', data: this._dh.getPrivateKey()}); + this._key = new PrivateKey({ + type: 'ecdsa', + curve: this._curve, + parts: parts + }); + this._isPriv = true; + return (this._key); + + } else { + var n = this._ecParams.getN(); + var r = new jsbn(crypto.randomBytes(n.bitLength())); + var n1 = n.subtract(jsbn.ONE); + priv = r.mod(n1).add(jsbn.ONE); + pub = this._ecParams.getG().multiply(priv); + + priv = Buffer.from(priv.toByteArray()); + pub = Buffer.from(this._ecParams.getCurve(). + encodePointHex(pub), 'hex'); + + this._priv = new ECPrivate(this._ecParams, priv); + + parts.push({name: 'curve', + data: Buffer.from(this._curve)}); + parts.push({name: 'Q', data: pub}); + parts.push({name: 'd', data: priv}); + + this._key = new PrivateKey({ + type: 'ecdsa', + curve: this._curve, + parts: parts + }); + this._isPriv = true; + return (this._key); + } + + } else if (this._algo === 'curve25519') { + var pair = nacl.box.keyPair(); + priv = Buffer.from(pair.secretKey); + pub = Buffer.from(pair.publicKey); + priv = Buffer.concat([priv, pub]); + assert.strictEqual(priv.length, 64); + assert.strictEqual(pub.length, 32); + + parts.push({name: 'A', data: pub}); + parts.push({name: 'k', data: priv}); + this._key = new PrivateKey({ + type: 'curve25519', + parts: parts + }); + this._isPriv = true; + return (this._key); + } + + throw (new Error('Invalid algorithm: ' + this._algo)); +}; +DiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey; + +/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */ + +function X9ECParameters(name) { + var params = algs.curves[name]; + assert.object(params); + + var p = new jsbn(params.p); + var a = new jsbn(params.a); + var b = new jsbn(params.b); + var n = new jsbn(params.n); + var h = jsbn.ONE; + var curve = new ec.ECCurveFp(p, a, b); + var G = curve.decodePointHex(params.G.toString('hex')); + + this.curve = curve; + this.g = G; + this.n = n; + this.h = h; +} +X9ECParameters.prototype.getCurve = function () { return (this.curve); }; +X9ECParameters.prototype.getG = function () { return (this.g); }; +X9ECParameters.prototype.getN = function () { return (this.n); }; +X9ECParameters.prototype.getH = function () { return (this.h); }; + +function ECPublic(params, buffer) { + this._params = params; + if (buffer[0] === 0x00) + buffer = buffer.slice(1); + this._pub = params.getCurve().decodePointHex(buffer.toString('hex')); +} + +function ECPrivate(params, buffer) { + this._params = params; + this._priv = new jsbn(utils.mpNormalize(buffer)); +} +ECPrivate.prototype.deriveSharedSecret = function (pubKey) { + assert.ok(pubKey instanceof ECPublic); + var S = pubKey._pub.multiply(this._priv); + return (Buffer.from(S.getX().toBigInteger().toByteArray())); +}; + +function generateED25519() { + var pair = nacl.sign.keyPair(); + var priv = Buffer.from(pair.secretKey); + var pub = Buffer.from(pair.publicKey); + assert.strictEqual(priv.length, 64); + assert.strictEqual(pub.length, 32); + + var parts = []; + parts.push({name: 'A', data: pub}); + parts.push({name: 'k', data: priv.slice(0, 32)}); + var key = new PrivateKey({ + type: 'ed25519', + parts: parts + }); + return (key); +} + +/* Generates a new ECDSA private key on a given curve. */ +function generateECDSA(curve) { + var parts = []; + var key; + + if (CRYPTO_HAVE_ECDH) { + /* + * Node crypto doesn't expose key generation directly, but the + * ECDH instances can generate keys. It turns out this just + * calls into the OpenSSL generic key generator, and we can + * read its output happily without doing an actual DH. So we + * use that here. + */ + var osCurve = { + 'nistp256': 'prime256v1', + 'nistp384': 'secp384r1', + 'nistp521': 'secp521r1' + }[curve]; + + var dh = crypto.createECDH(osCurve); + dh.generateKeys(); + + parts.push({name: 'curve', + data: Buffer.from(curve)}); + parts.push({name: 'Q', data: dh.getPublicKey()}); + parts.push({name: 'd', data: dh.getPrivateKey()}); + + key = new PrivateKey({ + type: 'ecdsa', + curve: curve, + parts: parts + }); + return (key); + } else { + + var ecParams = new X9ECParameters(curve); + + /* This algorithm taken from FIPS PUB 186-4 (section B.4.1) */ + var n = ecParams.getN(); + /* + * The crypto.randomBytes() function can only give us whole + * bytes, so taking a nod from X9.62, we round up. + */ + var cByteLen = Math.ceil((n.bitLength() + 64) / 8); + var c = new jsbn(crypto.randomBytes(cByteLen)); + + var n1 = n.subtract(jsbn.ONE); + var priv = c.mod(n1).add(jsbn.ONE); + var pub = ecParams.getG().multiply(priv); + + priv = Buffer.from(priv.toByteArray()); + pub = Buffer.from(ecParams.getCurve(). + encodePointHex(pub), 'hex'); + + parts.push({name: 'curve', data: Buffer.from(curve)}); + parts.push({name: 'Q', data: pub}); + parts.push({name: 'd', data: priv}); + + key = new PrivateKey({ + type: 'ecdsa', + curve: curve, + parts: parts + }); + return (key); + } +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/ed-compat.js b/packages/字体精简工具/node_modules/sshpk/lib/ed-compat.js new file mode 100644 index 0000000..70732e1 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/ed-compat.js @@ -0,0 +1,92 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + Verifier: Verifier, + Signer: Signer +}; + +var nacl = require('tweetnacl'); +var stream = require('stream'); +var util = require('util'); +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var Signature = require('./signature'); + +function Verifier(key, hashAlgo) { + if (hashAlgo.toLowerCase() !== 'sha512') + throw (new Error('ED25519 only supports the use of ' + + 'SHA-512 hashes')); + + this.key = key; + this.chunks = []; + + stream.Writable.call(this, {}); +} +util.inherits(Verifier, stream.Writable); + +Verifier.prototype._write = function (chunk, enc, cb) { + this.chunks.push(chunk); + cb(); +}; + +Verifier.prototype.update = function (chunk) { + if (typeof (chunk) === 'string') + chunk = Buffer.from(chunk, 'binary'); + this.chunks.push(chunk); +}; + +Verifier.prototype.verify = function (signature, fmt) { + var sig; + if (Signature.isSignature(signature, [2, 0])) { + if (signature.type !== 'ed25519') + return (false); + sig = signature.toBuffer('raw'); + + } else if (typeof (signature) === 'string') { + sig = Buffer.from(signature, 'base64'); + + } else if (Signature.isSignature(signature, [1, 0])) { + throw (new Error('signature was created by too old ' + + 'a version of sshpk and cannot be verified')); + } + + assert.buffer(sig); + return (nacl.sign.detached.verify( + new Uint8Array(Buffer.concat(this.chunks)), + new Uint8Array(sig), + new Uint8Array(this.key.part.A.data))); +}; + +function Signer(key, hashAlgo) { + if (hashAlgo.toLowerCase() !== 'sha512') + throw (new Error('ED25519 only supports the use of ' + + 'SHA-512 hashes')); + + this.key = key; + this.chunks = []; + + stream.Writable.call(this, {}); +} +util.inherits(Signer, stream.Writable); + +Signer.prototype._write = function (chunk, enc, cb) { + this.chunks.push(chunk); + cb(); +}; + +Signer.prototype.update = function (chunk) { + if (typeof (chunk) === 'string') + chunk = Buffer.from(chunk, 'binary'); + this.chunks.push(chunk); +}; + +Signer.prototype.sign = function () { + var sig = nacl.sign.detached( + new Uint8Array(Buffer.concat(this.chunks)), + new Uint8Array(Buffer.concat([ + this.key.part.k.data, this.key.part.A.data]))); + var sigBuf = Buffer.from(sig); + var sigObj = Signature.parse(sigBuf, 'ed25519', 'raw'); + sigObj.hashAlgorithm = 'sha512'; + return (sigObj); +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/errors.js b/packages/字体精简工具/node_modules/sshpk/lib/errors.js new file mode 100644 index 0000000..1cc09ec --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/errors.js @@ -0,0 +1,84 @@ +// Copyright 2015 Joyent, Inc. + +var assert = require('assert-plus'); +var util = require('util'); + +function FingerprintFormatError(fp, format) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, FingerprintFormatError); + this.name = 'FingerprintFormatError'; + this.fingerprint = fp; + this.format = format; + this.message = 'Fingerprint format is not supported, or is invalid: '; + if (fp !== undefined) + this.message += ' fingerprint = ' + fp; + if (format !== undefined) + this.message += ' format = ' + format; +} +util.inherits(FingerprintFormatError, Error); + +function InvalidAlgorithmError(alg) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, InvalidAlgorithmError); + this.name = 'InvalidAlgorithmError'; + this.algorithm = alg; + this.message = 'Algorithm "' + alg + '" is not supported'; +} +util.inherits(InvalidAlgorithmError, Error); + +function KeyParseError(name, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, KeyParseError); + this.name = 'KeyParseError'; + this.format = format; + this.keyName = name; + this.innerErr = innerErr; + this.message = 'Failed to parse ' + name + ' as a valid ' + format + + ' format key: ' + innerErr.message; +} +util.inherits(KeyParseError, Error); + +function SignatureParseError(type, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, SignatureParseError); + this.name = 'SignatureParseError'; + this.type = type; + this.format = format; + this.innerErr = innerErr; + this.message = 'Failed to parse the given data as a ' + type + + ' signature in ' + format + ' format: ' + innerErr.message; +} +util.inherits(SignatureParseError, Error); + +function CertificateParseError(name, format, innerErr) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, CertificateParseError); + this.name = 'CertificateParseError'; + this.format = format; + this.certName = name; + this.innerErr = innerErr; + this.message = 'Failed to parse ' + name + ' as a valid ' + format + + ' format certificate: ' + innerErr.message; +} +util.inherits(CertificateParseError, Error); + +function KeyEncryptedError(name, format) { + if (Error.captureStackTrace) + Error.captureStackTrace(this, KeyEncryptedError); + this.name = 'KeyEncryptedError'; + this.format = format; + this.keyName = name; + this.message = 'The ' + format + ' format key ' + name + ' is ' + + 'encrypted (password-protected), and no passphrase was ' + + 'provided in `options`'; +} +util.inherits(KeyEncryptedError, Error); + +module.exports = { + FingerprintFormatError: FingerprintFormatError, + InvalidAlgorithmError: InvalidAlgorithmError, + KeyParseError: KeyParseError, + SignatureParseError: SignatureParseError, + KeyEncryptedError: KeyEncryptedError, + CertificateParseError: CertificateParseError +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/fingerprint.js b/packages/字体精简工具/node_modules/sshpk/lib/fingerprint.js new file mode 100644 index 0000000..0004b37 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/fingerprint.js @@ -0,0 +1,220 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = Fingerprint; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var errs = require('./errors'); +var Key = require('./key'); +var PrivateKey = require('./private-key'); +var Certificate = require('./certificate'); +var utils = require('./utils'); + +var FingerprintFormatError = errs.FingerprintFormatError; +var InvalidAlgorithmError = errs.InvalidAlgorithmError; + +function Fingerprint(opts) { + assert.object(opts, 'options'); + assert.string(opts.type, 'options.type'); + assert.buffer(opts.hash, 'options.hash'); + assert.string(opts.algorithm, 'options.algorithm'); + + this.algorithm = opts.algorithm.toLowerCase(); + if (algs.hashAlgs[this.algorithm] !== true) + throw (new InvalidAlgorithmError(this.algorithm)); + + this.hash = opts.hash; + this.type = opts.type; + this.hashType = opts.hashType; +} + +Fingerprint.prototype.toString = function (format) { + if (format === undefined) { + if (this.algorithm === 'md5' || this.hashType === 'spki') + format = 'hex'; + else + format = 'base64'; + } + assert.string(format); + + switch (format) { + case 'hex': + if (this.hashType === 'spki') + return (this.hash.toString('hex')); + return (addColons(this.hash.toString('hex'))); + case 'base64': + if (this.hashType === 'spki') + return (this.hash.toString('base64')); + return (sshBase64Format(this.algorithm, + this.hash.toString('base64'))); + default: + throw (new FingerprintFormatError(undefined, format)); + } +}; + +Fingerprint.prototype.matches = function (other) { + assert.object(other, 'key or certificate'); + if (this.type === 'key' && this.hashType !== 'ssh') { + utils.assertCompatible(other, Key, [1, 7], 'key with spki'); + if (PrivateKey.isPrivateKey(other)) { + utils.assertCompatible(other, PrivateKey, [1, 6], + 'privatekey with spki support'); + } + } else if (this.type === 'key') { + utils.assertCompatible(other, Key, [1, 0], 'key'); + } else { + utils.assertCompatible(other, Certificate, [1, 0], + 'certificate'); + } + + var theirHash = other.hash(this.algorithm, this.hashType); + var theirHash2 = crypto.createHash(this.algorithm). + update(theirHash).digest('base64'); + + if (this.hash2 === undefined) + this.hash2 = crypto.createHash(this.algorithm). + update(this.hash).digest('base64'); + + return (this.hash2 === theirHash2); +}; + +/*JSSTYLED*/ +var base64RE = /^[A-Za-z0-9+\/=]+$/; +/*JSSTYLED*/ +var hexRE = /^[a-fA-F0-9]+$/; + +Fingerprint.parse = function (fp, options) { + assert.string(fp, 'fingerprint'); + + var alg, hash, enAlgs; + if (Array.isArray(options)) { + enAlgs = options; + options = {}; + } + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + if (options.enAlgs !== undefined) + enAlgs = options.enAlgs; + if (options.algorithms !== undefined) + enAlgs = options.algorithms; + assert.optionalArrayOfString(enAlgs, 'algorithms'); + + var hashType = 'ssh'; + if (options.hashType !== undefined) + hashType = options.hashType; + assert.string(hashType, 'options.hashType'); + + var parts = fp.split(':'); + if (parts.length == 2) { + alg = parts[0].toLowerCase(); + if (!base64RE.test(parts[1])) + throw (new FingerprintFormatError(fp)); + try { + hash = Buffer.from(parts[1], 'base64'); + } catch (e) { + throw (new FingerprintFormatError(fp)); + } + } else if (parts.length > 2) { + alg = 'md5'; + if (parts[0].toLowerCase() === 'md5') + parts = parts.slice(1); + parts = parts.map(function (p) { + while (p.length < 2) + p = '0' + p; + if (p.length > 2) + throw (new FingerprintFormatError(fp)); + return (p); + }); + parts = parts.join(''); + if (!hexRE.test(parts) || parts.length % 2 !== 0) + throw (new FingerprintFormatError(fp)); + try { + hash = Buffer.from(parts, 'hex'); + } catch (e) { + throw (new FingerprintFormatError(fp)); + } + } else { + if (hexRE.test(fp)) { + hash = Buffer.from(fp, 'hex'); + } else if (base64RE.test(fp)) { + hash = Buffer.from(fp, 'base64'); + } else { + throw (new FingerprintFormatError(fp)); + } + + switch (hash.length) { + case 32: + alg = 'sha256'; + break; + case 16: + alg = 'md5'; + break; + case 20: + alg = 'sha1'; + break; + case 64: + alg = 'sha512'; + break; + default: + throw (new FingerprintFormatError(fp)); + } + + /* Plain hex/base64: guess it's probably SPKI unless told. */ + if (options.hashType === undefined) + hashType = 'spki'; + } + + if (alg === undefined) + throw (new FingerprintFormatError(fp)); + + if (algs.hashAlgs[alg] === undefined) + throw (new InvalidAlgorithmError(alg)); + + if (enAlgs !== undefined) { + enAlgs = enAlgs.map(function (a) { return a.toLowerCase(); }); + if (enAlgs.indexOf(alg) === -1) + throw (new InvalidAlgorithmError(alg)); + } + + return (new Fingerprint({ + algorithm: alg, + hash: hash, + type: options.type || 'key', + hashType: hashType + })); +}; + +function addColons(s) { + /*JSSTYLED*/ + return (s.replace(/(.{2})(?=.)/g, '$1:')); +} + +function base64Strip(s) { + /*JSSTYLED*/ + return (s.replace(/=*$/, '')); +} + +function sshBase64Format(alg, h) { + return (alg.toUpperCase() + ':' + base64Strip(h)); +} + +Fingerprint.isFingerprint = function (obj, ver) { + return (utils.isCompatible(obj, Fingerprint, ver)); +}; + +/* + * API versions for Fingerprint: + * [1,0] -- initial ver + * [1,1] -- first tagged ver + * [1,2] -- hashType and spki support + */ +Fingerprint.prototype._sshpkApiVersion = [1, 2]; + +Fingerprint._oldVersionDetect = function (obj) { + assert.func(obj.toString); + assert.func(obj.matches); + return ([1, 0]); +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/auto.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/auto.js new file mode 100644 index 0000000..f32cd96 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/auto.js @@ -0,0 +1,124 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var pem = require('./pem'); +var ssh = require('./ssh'); +var rfc4253 = require('./rfc4253'); +var dnssec = require('./dnssec'); +var putty = require('./putty'); + +var DNSSEC_PRIVKEY_HEADER_PREFIX = 'Private-key-format: v1'; + +function read(buf, options) { + if (typeof (buf) === 'string') { + if (buf.trim().match(/^[-]+[ ]*BEGIN/)) + return (pem.read(buf, options)); + if (buf.match(/^\s*ssh-[a-z]/)) + return (ssh.read(buf, options)); + if (buf.match(/^\s*ecdsa-/)) + return (ssh.read(buf, options)); + if (buf.match(/^putty-user-key-file-2:/i)) + return (putty.read(buf, options)); + if (findDNSSECHeader(buf)) + return (dnssec.read(buf, options)); + buf = Buffer.from(buf, 'binary'); + } else { + assert.buffer(buf); + if (findPEMHeader(buf)) + return (pem.read(buf, options)); + if (findSSHHeader(buf)) + return (ssh.read(buf, options)); + if (findPuTTYHeader(buf)) + return (putty.read(buf, options)); + if (findDNSSECHeader(buf)) + return (dnssec.read(buf, options)); + } + if (buf.readUInt32BE(0) < buf.length) + return (rfc4253.read(buf, options)); + throw (new Error('Failed to auto-detect format of key')); +} + +function findPuTTYHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) + ++offset; + if (offset + 22 <= buf.length && + buf.slice(offset, offset + 22).toString('ascii').toLowerCase() === + 'putty-user-key-file-2:') + return (true); + return (false); +} + +function findSSHHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9)) + ++offset; + if (offset + 4 <= buf.length && + buf.slice(offset, offset + 4).toString('ascii') === 'ssh-') + return (true); + if (offset + 6 <= buf.length && + buf.slice(offset, offset + 6).toString('ascii') === 'ecdsa-') + return (true); + return (false); +} + +function findPEMHeader(buf) { + var offset = 0; + while (offset < buf.length && + (buf[offset] === 32 || buf[offset] === 10)) + ++offset; + if (buf[offset] !== 45) + return (false); + while (offset < buf.length && + (buf[offset] === 45)) + ++offset; + while (offset < buf.length && + (buf[offset] === 32)) + ++offset; + if (offset + 5 > buf.length || + buf.slice(offset, offset + 5).toString('ascii') !== 'BEGIN') + return (false); + return (true); +} + +function findDNSSECHeader(buf) { + // private case first + if (buf.length <= DNSSEC_PRIVKEY_HEADER_PREFIX.length) + return (false); + var headerCheck = buf.slice(0, DNSSEC_PRIVKEY_HEADER_PREFIX.length); + if (headerCheck.toString('ascii') === DNSSEC_PRIVKEY_HEADER_PREFIX) + return (true); + + // public-key RFC3110 ? + // 'domain.com. IN KEY ...' or 'domain.com. IN DNSKEY ...' + // skip any comment-lines + if (typeof (buf) !== 'string') { + buf = buf.toString('ascii'); + } + var lines = buf.split('\n'); + var line = 0; + /* JSSTYLED */ + while (lines[line].match(/^\;/)) + line++; + if (lines[line].toString('ascii').match(/\. IN KEY /)) + return (true); + if (lines[line].toString('ascii').match(/\. IN DNSKEY /)) + return (true); + return (false); +} + +function write(key, options) { + throw (new Error('"auto" format cannot be used for writing')); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/dnssec.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/dnssec.js new file mode 100644 index 0000000..a74ea9c --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/dnssec.js @@ -0,0 +1,287 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var utils = require('../utils'); +var SSHBuffer = require('../ssh-buffer'); +var Dhe = require('../dhe'); + +var supportedAlgos = { + 'rsa-sha1' : 5, + 'rsa-sha256' : 8, + 'rsa-sha512' : 10, + 'ecdsa-p256-sha256' : 13, + 'ecdsa-p384-sha384' : 14 + /* + * ed25519 is hypothetically supported with id 15 + * but the common tools available don't appear to be + * capable of generating/using ed25519 keys + */ +}; + +var supportedAlgosById = {}; +Object.keys(supportedAlgos).forEach(function (k) { + supportedAlgosById[supportedAlgos[k]] = k.toUpperCase(); +}); + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + var lines = buf.split('\n'); + if (lines[0].match(/^Private-key-format\: v1/)) { + var algElems = lines[1].split(' '); + var algoNum = parseInt(algElems[1], 10); + var algoName = algElems[2]; + if (!supportedAlgosById[algoNum]) + throw (new Error('Unsupported algorithm: ' + algoName)); + return (readDNSSECPrivateKey(algoNum, lines.slice(2))); + } + + // skip any comment-lines + var line = 0; + /* JSSTYLED */ + while (lines[line].match(/^\;/)) + line++; + // we should now have *one single* line left with our KEY on it. + if ((lines[line].match(/\. IN KEY /) || + lines[line].match(/\. IN DNSKEY /)) && lines[line+1].length === 0) { + return (readRFC3110(lines[line])); + } + throw (new Error('Cannot parse dnssec key')); +} + +function readRFC3110(keyString) { + var elems = keyString.split(' '); + //unused var flags = parseInt(elems[3], 10); + //unused var protocol = parseInt(elems[4], 10); + var algorithm = parseInt(elems[5], 10); + if (!supportedAlgosById[algorithm]) + throw (new Error('Unsupported algorithm: ' + algorithm)); + var base64key = elems.slice(6, elems.length).join(); + var keyBuffer = Buffer.from(base64key, 'base64'); + if (supportedAlgosById[algorithm].match(/^RSA-/)) { + // join the rest of the body into a single base64-blob + var publicExponentLen = keyBuffer.readUInt8(0); + if (publicExponentLen != 3 && publicExponentLen != 1) + throw (new Error('Cannot parse dnssec key: ' + + 'unsupported exponent length')); + + var publicExponent = keyBuffer.slice(1, publicExponentLen+1); + publicExponent = utils.mpNormalize(publicExponent); + var modulus = keyBuffer.slice(1+publicExponentLen); + modulus = utils.mpNormalize(modulus); + // now, make the key + var rsaKey = { + type: 'rsa', + parts: [] + }; + rsaKey.parts.push({ name: 'e', data: publicExponent}); + rsaKey.parts.push({ name: 'n', data: modulus}); + return (new Key(rsaKey)); + } + if (supportedAlgosById[algorithm] === 'ECDSA-P384-SHA384' || + supportedAlgosById[algorithm] === 'ECDSA-P256-SHA256') { + var curve = 'nistp384'; + var size = 384; + if (supportedAlgosById[algorithm].match(/^ECDSA-P256-SHA256/)) { + curve = 'nistp256'; + size = 256; + } + + var ecdsaKey = { + type: 'ecdsa', + curve: curve, + size: size, + parts: [ + {name: 'curve', data: Buffer.from(curve) }, + {name: 'Q', data: utils.ecNormalize(keyBuffer) } + ] + }; + return (new Key(ecdsaKey)); + } + throw (new Error('Unsupported algorithm: ' + + supportedAlgosById[algorithm])); +} + +function elementToBuf(e) { + return (Buffer.from(e.split(' ')[1], 'base64')); +} + +function readDNSSECRSAPrivateKey(elements) { + var rsaParams = {}; + elements.forEach(function (element) { + if (element.split(' ')[0] === 'Modulus:') + rsaParams['n'] = elementToBuf(element); + else if (element.split(' ')[0] === 'PublicExponent:') + rsaParams['e'] = elementToBuf(element); + else if (element.split(' ')[0] === 'PrivateExponent:') + rsaParams['d'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Prime1:') + rsaParams['p'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Prime2:') + rsaParams['q'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Exponent1:') + rsaParams['dmodp'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Exponent2:') + rsaParams['dmodq'] = elementToBuf(element); + else if (element.split(' ')[0] === 'Coefficient:') + rsaParams['iqmp'] = elementToBuf(element); + }); + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'e', data: utils.mpNormalize(rsaParams['e'])}, + { name: 'n', data: utils.mpNormalize(rsaParams['n'])}, + { name: 'd', data: utils.mpNormalize(rsaParams['d'])}, + { name: 'p', data: utils.mpNormalize(rsaParams['p'])}, + { name: 'q', data: utils.mpNormalize(rsaParams['q'])}, + { name: 'dmodp', + data: utils.mpNormalize(rsaParams['dmodp'])}, + { name: 'dmodq', + data: utils.mpNormalize(rsaParams['dmodq'])}, + { name: 'iqmp', + data: utils.mpNormalize(rsaParams['iqmp'])} + ] + }; + return (new PrivateKey(key)); +} + +function readDNSSECPrivateKey(alg, elements) { + if (supportedAlgosById[alg].match(/^RSA-/)) { + return (readDNSSECRSAPrivateKey(elements)); + } + if (supportedAlgosById[alg] === 'ECDSA-P384-SHA384' || + supportedAlgosById[alg] === 'ECDSA-P256-SHA256') { + var d = Buffer.from(elements[0].split(' ')[1], 'base64'); + var curve = 'nistp384'; + var size = 384; + if (supportedAlgosById[alg] === 'ECDSA-P256-SHA256') { + curve = 'nistp256'; + size = 256; + } + // DNSSEC generates the public-key on the fly (go calculate it) + var publicKey = utils.publicFromPrivateECDSA(curve, d); + var Q = publicKey.part['Q'].data; + var ecdsaKey = { + type: 'ecdsa', + curve: curve, + size: size, + parts: [ + {name: 'curve', data: Buffer.from(curve) }, + {name: 'd', data: d }, + {name: 'Q', data: Q } + ] + }; + return (new PrivateKey(ecdsaKey)); + } + throw (new Error('Unsupported algorithm: ' + supportedAlgosById[alg])); +} + +function dnssecTimestamp(date) { + var year = date.getFullYear() + ''; //stringify + var month = (date.getMonth() + 1); + var timestampStr = year + month + date.getUTCDate(); + timestampStr += '' + date.getUTCHours() + date.getUTCMinutes(); + timestampStr += date.getUTCSeconds(); + return (timestampStr); +} + +function rsaAlgFromOptions(opts) { + if (!opts || !opts.hashAlgo || opts.hashAlgo === 'sha1') + return ('5 (RSASHA1)'); + else if (opts.hashAlgo === 'sha256') + return ('8 (RSASHA256)'); + else if (opts.hashAlgo === 'sha512') + return ('10 (RSASHA512)'); + else + throw (new Error('Unknown or unsupported hash: ' + + opts.hashAlgo)); +} + +function writeRSA(key, options) { + // if we're missing parts, add them. + if (!key.part.dmodp || !key.part.dmodq) { + utils.addRSAMissing(key); + } + + var out = ''; + out += 'Private-key-format: v1.3\n'; + out += 'Algorithm: ' + rsaAlgFromOptions(options) + '\n'; + var n = utils.mpDenormalize(key.part['n'].data); + out += 'Modulus: ' + n.toString('base64') + '\n'; + var e = utils.mpDenormalize(key.part['e'].data); + out += 'PublicExponent: ' + e.toString('base64') + '\n'; + var d = utils.mpDenormalize(key.part['d'].data); + out += 'PrivateExponent: ' + d.toString('base64') + '\n'; + var p = utils.mpDenormalize(key.part['p'].data); + out += 'Prime1: ' + p.toString('base64') + '\n'; + var q = utils.mpDenormalize(key.part['q'].data); + out += 'Prime2: ' + q.toString('base64') + '\n'; + var dmodp = utils.mpDenormalize(key.part['dmodp'].data); + out += 'Exponent1: ' + dmodp.toString('base64') + '\n'; + var dmodq = utils.mpDenormalize(key.part['dmodq'].data); + out += 'Exponent2: ' + dmodq.toString('base64') + '\n'; + var iqmp = utils.mpDenormalize(key.part['iqmp'].data); + out += 'Coefficient: ' + iqmp.toString('base64') + '\n'; + // Assume that we're valid as-of now + var timestamp = new Date(); + out += 'Created: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n'; + return (Buffer.from(out, 'ascii')); +} + +function writeECDSA(key, options) { + var out = ''; + out += 'Private-key-format: v1.3\n'; + + if (key.curve === 'nistp256') { + out += 'Algorithm: 13 (ECDSAP256SHA256)\n'; + } else if (key.curve === 'nistp384') { + out += 'Algorithm: 14 (ECDSAP384SHA384)\n'; + } else { + throw (new Error('Unsupported curve')); + } + var base64Key = key.part['d'].data.toString('base64'); + out += 'PrivateKey: ' + base64Key + '\n'; + + // Assume that we're valid as-of now + var timestamp = new Date(); + out += 'Created: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Publish: ' + dnssecTimestamp(timestamp) + '\n'; + out += 'Activate: ' + dnssecTimestamp(timestamp) + '\n'; + + return (Buffer.from(out, 'ascii')); +} + +function write(key, options) { + if (PrivateKey.isPrivateKey(key)) { + if (key.type === 'rsa') { + return (writeRSA(key, options)); + } else if (key.type === 'ecdsa') { + return (writeECDSA(key, options)); + } else { + throw (new Error('Unsupported algorithm: ' + key.type)); + } + } else if (Key.isKey(key)) { + /* + * RFC3110 requires a keyname, and a keytype, which we + * don't really have a mechanism for specifying such + * additional metadata. + */ + throw (new Error('Format "dnssec" only supports ' + + 'writing private keys')); + } else { + throw (new Error('key is not a Key or PrivateKey')); + } +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/openssh-cert.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/openssh-cert.js new file mode 100644 index 0000000..766f3d3 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/openssh-cert.js @@ -0,0 +1,352 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + verify: verify, + sign: sign, + signAsync: signAsync, + write: write, + + /* Internal private API */ + fromBuffer: fromBuffer, + toBuffer: toBuffer +}; + +var assert = require('assert-plus'); +var SSHBuffer = require('../ssh-buffer'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var Identity = require('../identity'); +var rfc4253 = require('./rfc4253'); +var Signature = require('../signature'); +var utils = require('../utils'); +var Certificate = require('../certificate'); + +function verify(cert, key) { + /* + * We always give an issuerKey, so if our verify() is being called then + * there was no signature. Return false. + */ + return (false); +} + +var TYPES = { + 'user': 1, + 'host': 2 +}; +Object.keys(TYPES).forEach(function (k) { TYPES[TYPES[k]] = k; }); + +var ECDSA_ALGO = /^ecdsa-sha2-([^@-]+)-cert-v01@openssh.com$/; + +function read(buf, options) { + if (Buffer.isBuffer(buf)) + buf = buf.toString('ascii'); + var parts = buf.trim().split(/[ \t\n]+/g); + if (parts.length < 2 || parts.length > 3) + throw (new Error('Not a valid SSH certificate line')); + + var algo = parts[0]; + var data = parts[1]; + + data = Buffer.from(data, 'base64'); + return (fromBuffer(data, algo)); +} + +function fromBuffer(data, algo, partial) { + var sshbuf = new SSHBuffer({ buffer: data }); + var innerAlgo = sshbuf.readString(); + if (algo !== undefined && innerAlgo !== algo) + throw (new Error('SSH certificate algorithm mismatch')); + if (algo === undefined) + algo = innerAlgo; + + var cert = {}; + cert.signatures = {}; + cert.signatures.openssh = {}; + + cert.signatures.openssh.nonce = sshbuf.readBuffer(); + + var key = {}; + var parts = (key.parts = []); + key.type = getAlg(algo); + + var partCount = algs.info[key.type].parts.length; + while (parts.length < partCount) + parts.push(sshbuf.readPart()); + assert.ok(parts.length >= 1, 'key must have at least one part'); + + var algInfo = algs.info[key.type]; + if (key.type === 'ecdsa') { + var res = ECDSA_ALGO.exec(algo); + assert.ok(res !== null); + assert.strictEqual(res[1], parts[0].data.toString()); + } + + for (var i = 0; i < algInfo.parts.length; ++i) { + parts[i].name = algInfo.parts[i]; + if (parts[i].name !== 'curve' && + algInfo.normalize !== false) { + var p = parts[i]; + p.data = utils.mpNormalize(p.data); + } + } + + cert.subjectKey = new Key(key); + + cert.serial = sshbuf.readInt64(); + + var type = TYPES[sshbuf.readInt()]; + assert.string(type, 'valid cert type'); + + cert.signatures.openssh.keyId = sshbuf.readString(); + + var principals = []; + var pbuf = sshbuf.readBuffer(); + var psshbuf = new SSHBuffer({ buffer: pbuf }); + while (!psshbuf.atEnd()) + principals.push(psshbuf.readString()); + if (principals.length === 0) + principals = ['*']; + + cert.subjects = principals.map(function (pr) { + if (type === 'user') + return (Identity.forUser(pr)); + else if (type === 'host') + return (Identity.forHost(pr)); + throw (new Error('Unknown identity type ' + type)); + }); + + cert.validFrom = int64ToDate(sshbuf.readInt64()); + cert.validUntil = int64ToDate(sshbuf.readInt64()); + + var exts = []; + var extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); + var ext; + while (!extbuf.atEnd()) { + ext = { critical: true }; + ext.name = extbuf.readString(); + ext.data = extbuf.readBuffer(); + exts.push(ext); + } + extbuf = new SSHBuffer({ buffer: sshbuf.readBuffer() }); + while (!extbuf.atEnd()) { + ext = { critical: false }; + ext.name = extbuf.readString(); + ext.data = extbuf.readBuffer(); + exts.push(ext); + } + cert.signatures.openssh.exts = exts; + + /* reserved */ + sshbuf.readBuffer(); + + var signingKeyBuf = sshbuf.readBuffer(); + cert.issuerKey = rfc4253.read(signingKeyBuf); + + /* + * OpenSSH certs don't give the identity of the issuer, just their + * public key. So, we use an Identity that matches anything. The + * isSignedBy() function will later tell you if the key matches. + */ + cert.issuer = Identity.forHost('**'); + + var sigBuf = sshbuf.readBuffer(); + cert.signatures.openssh.signature = + Signature.parse(sigBuf, cert.issuerKey.type, 'ssh'); + + if (partial !== undefined) { + partial.remainder = sshbuf.remainder(); + partial.consumed = sshbuf._offset; + } + + return (new Certificate(cert)); +} + +function int64ToDate(buf) { + var i = buf.readUInt32BE(0) * 4294967296; + i += buf.readUInt32BE(4); + var d = new Date(); + d.setTime(i * 1000); + d.sourceInt64 = buf; + return (d); +} + +function dateToInt64(date) { + if (date.sourceInt64 !== undefined) + return (date.sourceInt64); + var i = Math.round(date.getTime() / 1000); + var upper = Math.floor(i / 4294967296); + var lower = Math.floor(i % 4294967296); + var buf = Buffer.alloc(8); + buf.writeUInt32BE(upper, 0); + buf.writeUInt32BE(lower, 4); + return (buf); +} + +function sign(cert, key) { + if (cert.signatures.openssh === undefined) + cert.signatures.openssh = {}; + try { + var blob = toBuffer(cert, true); + } catch (e) { + delete (cert.signatures.openssh); + return (false); + } + var sig = cert.signatures.openssh; + var hashAlgo = undefined; + if (key.type === 'rsa' || key.type === 'dsa') + hashAlgo = 'sha1'; + var signer = key.createSign(hashAlgo); + signer.write(blob); + sig.signature = signer.sign(); + return (true); +} + +function signAsync(cert, signer, done) { + if (cert.signatures.openssh === undefined) + cert.signatures.openssh = {}; + try { + var blob = toBuffer(cert, true); + } catch (e) { + delete (cert.signatures.openssh); + done(e); + return; + } + var sig = cert.signatures.openssh; + + signer(blob, function (err, signature) { + if (err) { + done(err); + return; + } + try { + /* + * This will throw if the signature isn't of a + * type/algo that can be used for SSH. + */ + signature.toBuffer('ssh'); + } catch (e) { + done(e); + return; + } + sig.signature = signature; + done(); + }); +} + +function write(cert, options) { + if (options === undefined) + options = {}; + + var blob = toBuffer(cert); + var out = getCertType(cert.subjectKey) + ' ' + blob.toString('base64'); + if (options.comment) + out = out + ' ' + options.comment; + return (out); +} + + +function toBuffer(cert, noSig) { + assert.object(cert.signatures.openssh, 'signature for openssh format'); + var sig = cert.signatures.openssh; + + if (sig.nonce === undefined) + sig.nonce = crypto.randomBytes(16); + var buf = new SSHBuffer({}); + buf.writeString(getCertType(cert.subjectKey)); + buf.writeBuffer(sig.nonce); + + var key = cert.subjectKey; + var algInfo = algs.info[key.type]; + algInfo.parts.forEach(function (part) { + buf.writePart(key.part[part]); + }); + + buf.writeInt64(cert.serial); + + var type = cert.subjects[0].type; + assert.notStrictEqual(type, 'unknown'); + cert.subjects.forEach(function (id) { + assert.strictEqual(id.type, type); + }); + type = TYPES[type]; + buf.writeInt(type); + + if (sig.keyId === undefined) { + sig.keyId = cert.subjects[0].type + '_' + + (cert.subjects[0].uid || cert.subjects[0].hostname); + } + buf.writeString(sig.keyId); + + var sub = new SSHBuffer({}); + cert.subjects.forEach(function (id) { + if (type === TYPES.host) + sub.writeString(id.hostname); + else if (type === TYPES.user) + sub.writeString(id.uid); + }); + buf.writeBuffer(sub.toBuffer()); + + buf.writeInt64(dateToInt64(cert.validFrom)); + buf.writeInt64(dateToInt64(cert.validUntil)); + + var exts = sig.exts; + if (exts === undefined) + exts = []; + + var extbuf = new SSHBuffer({}); + exts.forEach(function (ext) { + if (ext.critical !== true) + return; + extbuf.writeString(ext.name); + extbuf.writeBuffer(ext.data); + }); + buf.writeBuffer(extbuf.toBuffer()); + + extbuf = new SSHBuffer({}); + exts.forEach(function (ext) { + if (ext.critical === true) + return; + extbuf.writeString(ext.name); + extbuf.writeBuffer(ext.data); + }); + buf.writeBuffer(extbuf.toBuffer()); + + /* reserved */ + buf.writeBuffer(Buffer.alloc(0)); + + sub = rfc4253.write(cert.issuerKey); + buf.writeBuffer(sub); + + if (!noSig) + buf.writeBuffer(sig.signature.toBuffer('ssh')); + + return (buf.toBuffer()); +} + +function getAlg(certType) { + if (certType === 'ssh-rsa-cert-v01@openssh.com') + return ('rsa'); + if (certType === 'ssh-dss-cert-v01@openssh.com') + return ('dsa'); + if (certType.match(ECDSA_ALGO)) + return ('ecdsa'); + if (certType === 'ssh-ed25519-cert-v01@openssh.com') + return ('ed25519'); + throw (new Error('Unsupported cert type ' + certType)); +} + +function getCertType(key) { + if (key.type === 'rsa') + return ('ssh-rsa-cert-v01@openssh.com'); + if (key.type === 'dsa') + return ('ssh-dss-cert-v01@openssh.com'); + if (key.type === 'ecdsa') + return ('ecdsa-sha2-' + key.curve + '-cert-v01@openssh.com'); + if (key.type === 'ed25519') + return ('ssh-ed25519-cert-v01@openssh.com'); + throw (new Error('Unsupported key type ' + key.type)); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/pem.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/pem.js new file mode 100644 index 0000000..bbe78fc --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/pem.js @@ -0,0 +1,290 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var crypto = require('crypto'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var pkcs1 = require('./pkcs1'); +var pkcs8 = require('./pkcs8'); +var sshpriv = require('./ssh-private'); +var rfc4253 = require('./rfc4253'); + +var errors = require('../errors'); + +var OID_PBES2 = '1.2.840.113549.1.5.13'; +var OID_PBKDF2 = '1.2.840.113549.1.5.12'; + +var OID_TO_CIPHER = { + '1.2.840.113549.3.7': '3des-cbc', + '2.16.840.1.101.3.4.1.2': 'aes128-cbc', + '2.16.840.1.101.3.4.1.42': 'aes256-cbc' +}; +var CIPHER_TO_OID = {}; +Object.keys(OID_TO_CIPHER).forEach(function (k) { + CIPHER_TO_OID[OID_TO_CIPHER[k]] = k; +}); + +var OID_TO_HASH = { + '1.2.840.113549.2.7': 'sha1', + '1.2.840.113549.2.9': 'sha256', + '1.2.840.113549.2.11': 'sha512' +}; +var HASH_TO_OID = {}; +Object.keys(OID_TO_HASH).forEach(function (k) { + HASH_TO_OID[OID_TO_HASH[k]] = k; +}); + +/* + * For reading we support both PKCS#1 and PKCS#8. If we find a private key, + * we just take the public component of it and use that. + */ +function read(buf, options, forceType) { + var input = buf; + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var lines = buf.trim().split(/[\r\n]+/g); + + var m; + var si = -1; + while (!m && si < lines.length) { + m = lines[++si].match(/*JSSTYLED*/ + /[-]+[ ]*BEGIN ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); + } + assert.ok(m, 'invalid PEM header'); + + var m2; + var ei = lines.length; + while (!m2 && ei > 0) { + m2 = lines[--ei].match(/*JSSTYLED*/ + /[-]+[ ]*END ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/); + } + assert.ok(m2, 'invalid PEM footer'); + + /* Begin and end banners must match key type */ + assert.equal(m[2], m2[2]); + var type = m[2].toLowerCase(); + + var alg; + if (m[1]) { + /* They also must match algorithms, if given */ + assert.equal(m[1], m2[1], 'PEM header and footer mismatch'); + alg = m[1].trim(); + } + + lines = lines.slice(si, ei + 1); + + var headers = {}; + while (true) { + lines = lines.slice(1); + m = lines[0].match(/*JSSTYLED*/ + /^([A-Za-z0-9-]+): (.+)$/); + if (!m) + break; + headers[m[1].toLowerCase()] = m[2]; + } + + /* Chop off the first and last lines */ + lines = lines.slice(0, -1).join(''); + buf = Buffer.from(lines, 'base64'); + + var cipher, key, iv; + if (headers['proc-type']) { + var parts = headers['proc-type'].split(','); + if (parts[0] === '4' && parts[1] === 'ENCRYPTED') { + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from( + options.passphrase, 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'PEM')); + } else { + parts = headers['dek-info'].split(','); + assert.ok(parts.length === 2); + cipher = parts[0].toLowerCase(); + iv = Buffer.from(parts[1], 'hex'); + key = utils.opensslKeyDeriv(cipher, iv, + options.passphrase, 1).key; + } + } + } + + if (alg && alg.toLowerCase() === 'encrypted') { + var eder = new asn1.BerReader(buf); + var pbesEnd; + eder.readSequence(); + + eder.readSequence(); + pbesEnd = eder.offset + eder.length; + + var method = eder.readOID(); + if (method !== OID_PBES2) { + throw (new Error('Unsupported PEM/PKCS8 encryption ' + + 'scheme: ' + method)); + } + + eder.readSequence(); /* PBES2-params */ + + eder.readSequence(); /* keyDerivationFunc */ + var kdfEnd = eder.offset + eder.length; + var kdfOid = eder.readOID(); + if (kdfOid !== OID_PBKDF2) + throw (new Error('Unsupported PBES2 KDF: ' + kdfOid)); + eder.readSequence(); + var salt = eder.readString(asn1.Ber.OctetString, true); + var iterations = eder.readInt(); + var hashAlg = 'sha1'; + if (eder.offset < kdfEnd) { + eder.readSequence(); + var hashAlgOid = eder.readOID(); + hashAlg = OID_TO_HASH[hashAlgOid]; + if (hashAlg === undefined) { + throw (new Error('Unsupported PBKDF2 hash: ' + + hashAlgOid)); + } + } + eder._offset = kdfEnd; + + eder.readSequence(); /* encryptionScheme */ + var cipherOid = eder.readOID(); + cipher = OID_TO_CIPHER[cipherOid]; + if (cipher === undefined) { + throw (new Error('Unsupported PBES2 cipher: ' + + cipherOid)); + } + iv = eder.readString(asn1.Ber.OctetString, true); + + eder._offset = pbesEnd; + buf = eder.readString(asn1.Ber.OctetString, true); + + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from( + options.passphrase, 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'PEM')); + } + + var cinfo = utils.opensshCipherInfo(cipher); + + cipher = cinfo.opensslName; + key = utils.pbkdf2(hashAlg, salt, iterations, cinfo.keySize, + options.passphrase); + alg = undefined; + } + + if (cipher && key && iv) { + var cipherStream = crypto.createDecipheriv(cipher, key, iv); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + if (e.toString().indexOf('bad decrypt') !== -1) { + throw (new Error('Incorrect passphrase ' + + 'supplied, could not decrypt key')); + } + throw (e); + }); + cipherStream.write(buf); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + buf = Buffer.concat(chunks); + } + + /* The new OpenSSH internal format abuses PEM headers */ + if (alg && alg.toLowerCase() === 'openssh') + return (sshpriv.readSSHPrivate(type, buf, options)); + if (alg && alg.toLowerCase() === 'ssh2') + return (rfc4253.readType(type, buf, options)); + + var der = new asn1.BerReader(buf); + der.originalInput = input; + + /* + * All of the PEM file types start with a sequence tag, so chop it + * off here + */ + der.readSequence(); + + /* PKCS#1 type keys name an algorithm in the banner explicitly */ + if (alg) { + if (forceType) + assert.strictEqual(forceType, 'pkcs1'); + return (pkcs1.readPkcs1(alg, type, der)); + } else { + if (forceType) + assert.strictEqual(forceType, 'pkcs8'); + return (pkcs8.readPkcs8(alg, type, der)); + } +} + +function write(key, options, type) { + assert.object(key); + + var alg = { + 'ecdsa': 'EC', + 'rsa': 'RSA', + 'dsa': 'DSA', + 'ed25519': 'EdDSA' + }[key.type]; + var header; + + var der = new asn1.BerWriter(); + + if (PrivateKey.isPrivateKey(key)) { + if (type && type === 'pkcs8') { + header = 'PRIVATE KEY'; + pkcs8.writePkcs8(der, key); + } else { + if (type) + assert.strictEqual(type, 'pkcs1'); + header = alg + ' PRIVATE KEY'; + pkcs1.writePkcs1(der, key); + } + + } else if (Key.isKey(key)) { + if (type && type === 'pkcs1') { + header = alg + ' PUBLIC KEY'; + pkcs1.writePkcs1(der, key); + } else { + if (type) + assert.strictEqual(type, 'pkcs8'); + header = 'PUBLIC KEY'; + pkcs8.writePkcs8(der, key); + } + + } else { + throw (new Error('key is not a Key or PrivateKey')); + } + + var tmp = der.buffer.toString('base64'); + var len = tmp.length + (tmp.length / 64) + + 18 + 16 + header.length*2 + 10; + var buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 64; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/pkcs1.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/pkcs1.js new file mode 100644 index 0000000..bc48550 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/pkcs1.js @@ -0,0 +1,373 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + readPkcs1: readPkcs1, + write: write, + writePkcs1: writePkcs1 +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); + +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); + +var pkcs8 = require('./pkcs8'); +var readECDSACurve = pkcs8.readECDSACurve; + +function read(buf, options) { + return (pem.read(buf, options, 'pkcs1')); +} + +function write(key, options) { + return (pem.write(key, options, 'pkcs1')); +} + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function readPkcs1(alg, type, der) { + switch (alg) { + case 'RSA': + if (type === 'public') + return (readPkcs1RSAPublic(der)); + else if (type === 'private') + return (readPkcs1RSAPrivate(der)); + throw (new Error('Unknown key type: ' + type)); + case 'DSA': + if (type === 'public') + return (readPkcs1DSAPublic(der)); + else if (type === 'private') + return (readPkcs1DSAPrivate(der)); + throw (new Error('Unknown key type: ' + type)); + case 'EC': + case 'ECDSA': + if (type === 'private') + return (readPkcs1ECDSAPrivate(der)); + else if (type === 'public') + return (readPkcs1ECDSAPublic(der)); + throw (new Error('Unknown key type: ' + type)); + case 'EDDSA': + case 'EdDSA': + if (type === 'private') + return (readPkcs1EdDSAPrivate(der)); + throw (new Error(type + ' keys not supported with EdDSA')); + default: + throw (new Error('Unknown key algo: ' + alg)); + } +} + +function readPkcs1RSAPublic(der) { + // modulus and exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'exponent'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'e', data: e }, + { name: 'n', data: n } + ] + }; + + return (new Key(key)); +} + +function readPkcs1RSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version[0], 0); + + // modulus then public exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'public exponent'); + var d = readMPInt(der, 'private exponent'); + var p = readMPInt(der, 'prime1'); + var q = readMPInt(der, 'prime2'); + var dmodp = readMPInt(der, 'exponent1'); + var dmodq = readMPInt(der, 'exponent2'); + var iqmp = readMPInt(der, 'iqmp'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'n', data: n }, + { name: 'e', data: e }, + { name: 'd', data: d }, + { name: 'iqmp', data: iqmp }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'dmodp', data: dmodp }, + { name: 'dmodq', data: dmodq } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1DSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 0); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + var y = readMPInt(der, 'y'); + var x = readMPInt(der, 'x'); + + // now, make the key + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y }, + { name: 'x', data: x } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1EdDSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 1); + + // private key + var k = der.readString(asn1.Ber.OctetString, true); + + der.readSequence(0xa0); + var oid = der.readOID(); + assert.strictEqual(oid, '1.3.101.112', 'the ed25519 curve identifier'); + + der.readSequence(0xa1); + var A = utils.readBitString(der); + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: k } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs1DSAPublic(der) { + var y = readMPInt(der, 'y'); + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + var key = { + type: 'dsa', + parts: [ + { name: 'y', data: y }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g } + ] + }; + + return (new Key(key)); +} + +function readPkcs1ECDSAPublic(der) { + der.readSequence(); + + var oid = der.readOID(); + assert.strictEqual(oid, '1.2.840.10045.2.1', 'must be ecPublicKey'); + + var curveOid = der.readOID(); + + var curve; + var curves = Object.keys(algs.curves); + for (var j = 0; j < curves.length; ++j) { + var c = curves[j]; + var cd = algs.curves[c]; + if (cd.pkcs8oid === curveOid) { + curve = c; + break; + } + } + assert.string(curve, 'a known ECDSA named curve'); + + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curve) }, + { name: 'Q', data: Q } + ] + }; + + return (new Key(key)); +} + +function readPkcs1ECDSAPrivate(der) { + var version = readMPInt(der, 'version'); + assert.strictEqual(version.readUInt8(0), 1); + + // private key + var d = der.readString(asn1.Ber.OctetString, true); + + der.readSequence(0xa0); + var curve = readECDSACurve(der); + assert.string(curve, 'a known elliptic curve'); + + der.readSequence(0xa1); + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curve) }, + { name: 'Q', data: Q }, + { name: 'd', data: d } + ] + }; + + return (new PrivateKey(key)); +} + +function writePkcs1(der, key) { + der.startSequence(); + + switch (key.type) { + case 'rsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1RSAPrivate(der, key); + else + writePkcs1RSAPublic(der, key); + break; + case 'dsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1DSAPrivate(der, key); + else + writePkcs1DSAPublic(der, key); + break; + case 'ecdsa': + if (PrivateKey.isPrivateKey(key)) + writePkcs1ECDSAPrivate(der, key); + else + writePkcs1ECDSAPublic(der, key); + break; + case 'ed25519': + if (PrivateKey.isPrivateKey(key)) + writePkcs1EdDSAPrivate(der, key); + else + writePkcs1EdDSAPublic(der, key); + break; + default: + throw (new Error('Unknown key algo: ' + key.type)); + } + + der.endSequence(); +} + +function writePkcs1RSAPublic(der, key) { + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); +} + +function writePkcs1RSAPrivate(der, key) { + var ver = Buffer.from([0]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.writeBuffer(key.part.d.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + if (!key.part.dmodp || !key.part.dmodq) + utils.addRSAMissing(key); + der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); + der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); + der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); +} + +function writePkcs1DSAPrivate(der, key) { + var ver = Buffer.from([0]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.writeBuffer(key.part.x.data, asn1.Ber.Integer); +} + +function writePkcs1DSAPublic(der, key) { + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); +} + +function writePkcs1ECDSAPublic(der, key) { + der.startSequence(); + + der.writeOID('1.2.840.10045.2.1'); /* ecPublicKey */ + var curve = key.part.curve.data.toString(); + var curveOid = algs.curves[curve].pkcs8oid; + assert.string(curveOid, 'a known ECDSA named curve'); + der.writeOID(curveOid); + + der.endSequence(); + + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); +} + +function writePkcs1ECDSAPrivate(der, key) { + var ver = Buffer.from([1]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); + + der.startSequence(0xa0); + var curve = key.part.curve.data.toString(); + var curveOid = algs.curves[curve].pkcs8oid; + assert.string(curveOid, 'a known ECDSA named curve'); + der.writeOID(curveOid); + der.endSequence(); + + der.startSequence(0xa1); + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); + der.endSequence(); +} + +function writePkcs1EdDSAPrivate(der, key) { + var ver = Buffer.from([1]); + der.writeBuffer(ver, asn1.Ber.Integer); + + der.writeBuffer(key.part.k.data, asn1.Ber.OctetString); + + der.startSequence(0xa0); + der.writeOID('1.3.101.112'); + der.endSequence(); + + der.startSequence(0xa1); + utils.writeBitString(der, key.part.A.data); + der.endSequence(); +} + +function writePkcs1EdDSAPublic(der, key) { + throw (new Error('Public keys are not supported for EdDSA PKCS#1')); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/pkcs8.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/pkcs8.js new file mode 100644 index 0000000..2ca3ca7 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/pkcs8.js @@ -0,0 +1,631 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + readPkcs8: readPkcs8, + write: write, + writePkcs8: writePkcs8, + pkcs8ToBuffer: pkcs8ToBuffer, + + readECDSACurve: readECDSACurve, + writeECDSACurve: writeECDSACurve +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); + +function read(buf, options) { + return (pem.read(buf, options, 'pkcs8')); +} + +function write(key, options) { + return (pem.write(key, options, 'pkcs8')); +} + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function readPkcs8(alg, type, der) { + /* Private keys in pkcs#8 format have a weird extra int */ + if (der.peek() === asn1.Ber.Integer) { + assert.strictEqual(type, 'private', + 'unexpected Integer at start of public key'); + der.readString(asn1.Ber.Integer, true); + } + + der.readSequence(); + var next = der.offset + der.length; + + var oid = der.readOID(); + switch (oid) { + case '1.2.840.113549.1.1.1': + der._offset = next; + if (type === 'public') + return (readPkcs8RSAPublic(der)); + else + return (readPkcs8RSAPrivate(der)); + case '1.2.840.10040.4.1': + if (type === 'public') + return (readPkcs8DSAPublic(der)); + else + return (readPkcs8DSAPrivate(der)); + case '1.2.840.10045.2.1': + if (type === 'public') + return (readPkcs8ECDSAPublic(der)); + else + return (readPkcs8ECDSAPrivate(der)); + case '1.3.101.112': + if (type === 'public') { + return (readPkcs8EdDSAPublic(der)); + } else { + return (readPkcs8EdDSAPrivate(der)); + } + case '1.3.101.110': + if (type === 'public') { + return (readPkcs8X25519Public(der)); + } else { + return (readPkcs8X25519Private(der)); + } + default: + throw (new Error('Unknown key type OID ' + oid)); + } +} + +function readPkcs8RSAPublic(der) { + // bit string sequence + der.readSequence(asn1.Ber.BitString); + der.readByte(); + der.readSequence(); + + // modulus + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'exponent'); + + // now, make the key + var key = { + type: 'rsa', + source: der.originalInput, + parts: [ + { name: 'e', data: e }, + { name: 'n', data: n } + ] + }; + + return (new Key(key)); +} + +function readPkcs8RSAPrivate(der) { + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + + var ver = readMPInt(der, 'version'); + assert.equal(ver[0], 0x0, 'unknown RSA private key version'); + + // modulus then public exponent + var n = readMPInt(der, 'modulus'); + var e = readMPInt(der, 'public exponent'); + var d = readMPInt(der, 'private exponent'); + var p = readMPInt(der, 'prime1'); + var q = readMPInt(der, 'prime2'); + var dmodp = readMPInt(der, 'exponent1'); + var dmodq = readMPInt(der, 'exponent2'); + var iqmp = readMPInt(der, 'iqmp'); + + // now, make the key + var key = { + type: 'rsa', + parts: [ + { name: 'n', data: n }, + { name: 'e', data: e }, + { name: 'd', data: d }, + { name: 'iqmp', data: iqmp }, + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'dmodp', data: dmodp }, + { name: 'dmodq', data: dmodq } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8DSAPublic(der) { + der.readSequence(); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + // bit string sequence + der.readSequence(asn1.Ber.BitString); + der.readByte(); + + var y = readMPInt(der, 'y'); + + // now, make the key + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y } + ] + }; + + return (new Key(key)); +} + +function readPkcs8DSAPrivate(der) { + der.readSequence(); + + var p = readMPInt(der, 'p'); + var q = readMPInt(der, 'q'); + var g = readMPInt(der, 'g'); + + der.readSequence(asn1.Ber.OctetString); + var x = readMPInt(der, 'x'); + + /* The pkcs#8 format does not include the public key */ + var y = utils.calculateDSAPublic(g, p, x); + + var key = { + type: 'dsa', + parts: [ + { name: 'p', data: p }, + { name: 'q', data: q }, + { name: 'g', data: g }, + { name: 'y', data: y }, + { name: 'x', data: x } + ] + }; + + return (new PrivateKey(key)); +} + +function readECDSACurve(der) { + var curveName, curveNames; + var j, c, cd; + + if (der.peek() === asn1.Ber.OID) { + var oid = der.readOID(); + + curveNames = Object.keys(algs.curves); + for (j = 0; j < curveNames.length; ++j) { + c = curveNames[j]; + cd = algs.curves[c]; + if (cd.pkcs8oid === oid) { + curveName = c; + break; + } + } + + } else { + // ECParameters sequence + der.readSequence(); + var version = der.readString(asn1.Ber.Integer, true); + assert.strictEqual(version[0], 1, 'ECDSA key not version 1'); + + var curve = {}; + + // FieldID sequence + der.readSequence(); + var fieldTypeOid = der.readOID(); + assert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1', + 'ECDSA key is not from a prime-field'); + var p = curve.p = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + /* + * p always starts with a 1 bit, so count the zeros to get its + * real size. + */ + curve.size = p.length * 8 - utils.countZeros(p); + + // Curve sequence + der.readSequence(); + curve.a = utils.mpNormalize( + der.readString(asn1.Ber.OctetString, true)); + curve.b = utils.mpNormalize( + der.readString(asn1.Ber.OctetString, true)); + if (der.peek() === asn1.Ber.BitString) + curve.s = der.readString(asn1.Ber.BitString, true); + + // Combined Gx and Gy + curve.G = der.readString(asn1.Ber.OctetString, true); + assert.strictEqual(curve.G[0], 0x4, + 'uncompressed G is required'); + + curve.n = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + curve.h = utils.mpNormalize( + der.readString(asn1.Ber.Integer, true)); + assert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' + + 'required'); + + curveNames = Object.keys(algs.curves); + var ks = Object.keys(curve); + for (j = 0; j < curveNames.length; ++j) { + c = curveNames[j]; + cd = algs.curves[c]; + var equal = true; + for (var i = 0; i < ks.length; ++i) { + var k = ks[i]; + if (cd[k] === undefined) + continue; + if (typeof (cd[k]) === 'object' && + cd[k].equals !== undefined) { + if (!cd[k].equals(curve[k])) { + equal = false; + break; + } + } else if (Buffer.isBuffer(cd[k])) { + if (cd[k].toString('binary') + !== curve[k].toString('binary')) { + equal = false; + break; + } + } else { + if (cd[k] !== curve[k]) { + equal = false; + break; + } + } + } + if (equal) { + curveName = c; + break; + } + } + } + return (curveName); +} + +function readPkcs8ECDSAPrivate(der) { + var curveName = readECDSACurve(der); + assert.string(curveName, 'a known elliptic curve'); + + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + + var version = readMPInt(der, 'version'); + assert.equal(version[0], 1, 'unknown version of ECDSA key'); + + var d = der.readString(asn1.Ber.OctetString, true); + var Q; + + if (der.peek() == 0xa0) { + der.readSequence(0xa0); + der._offset += der.length; + } + if (der.peek() == 0xa1) { + der.readSequence(0xa1); + Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + } + + if (Q === undefined) { + var pub = utils.publicFromPrivateECDSA(curveName, d); + Q = pub.part.Q.data; + } + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curveName) }, + { name: 'Q', data: Q }, + { name: 'd', data: d } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8ECDSAPublic(der) { + var curveName = readECDSACurve(der); + assert.string(curveName, 'a known elliptic curve'); + + var Q = der.readString(asn1.Ber.BitString, true); + Q = utils.ecNormalize(Q); + + var key = { + type: 'ecdsa', + parts: [ + { name: 'curve', data: Buffer.from(curveName) }, + { name: 'Q', data: Q } + ] + }; + + return (new Key(key)); +} + +function readPkcs8EdDSAPublic(der) { + if (der.peek() === 0x00) + der.readByte(); + + var A = utils.readBitString(der); + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) } + ] + }; + + return (new Key(key)); +} + +function readPkcs8X25519Public(der) { + var A = utils.readBitString(der); + + var key = { + type: 'curve25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) } + ] + }; + + return (new Key(key)); +} + +function readPkcs8EdDSAPrivate(der) { + if (der.peek() === 0x00) + der.readByte(); + + der.readSequence(asn1.Ber.OctetString); + var k = der.readString(asn1.Ber.OctetString, true); + k = utils.zeroPadToLength(k, 32); + + var A; + if (der.peek() === asn1.Ber.BitString) { + A = utils.readBitString(der); + A = utils.zeroPadToLength(A, 32); + } else { + A = utils.calculateED25519Public(k); + } + + var key = { + type: 'ed25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: utils.zeroPadToLength(k, 32) } + ] + }; + + return (new PrivateKey(key)); +} + +function readPkcs8X25519Private(der) { + if (der.peek() === 0x00) + der.readByte(); + + der.readSequence(asn1.Ber.OctetString); + var k = der.readString(asn1.Ber.OctetString, true); + k = utils.zeroPadToLength(k, 32); + + var A = utils.calculateX25519Public(k); + + var key = { + type: 'curve25519', + parts: [ + { name: 'A', data: utils.zeroPadToLength(A, 32) }, + { name: 'k', data: utils.zeroPadToLength(k, 32) } + ] + }; + + return (new PrivateKey(key)); +} + +function pkcs8ToBuffer(key) { + var der = new asn1.BerWriter(); + writePkcs8(der, key); + return (der.buffer); +} + +function writePkcs8(der, key) { + der.startSequence(); + + if (PrivateKey.isPrivateKey(key)) { + var sillyInt = Buffer.from([0]); + der.writeBuffer(sillyInt, asn1.Ber.Integer); + } + + der.startSequence(); + switch (key.type) { + case 'rsa': + der.writeOID('1.2.840.113549.1.1.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8RSAPrivate(key, der); + else + writePkcs8RSAPublic(key, der); + break; + case 'dsa': + der.writeOID('1.2.840.10040.4.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8DSAPrivate(key, der); + else + writePkcs8DSAPublic(key, der); + break; + case 'ecdsa': + der.writeOID('1.2.840.10045.2.1'); + if (PrivateKey.isPrivateKey(key)) + writePkcs8ECDSAPrivate(key, der); + else + writePkcs8ECDSAPublic(key, der); + break; + case 'ed25519': + der.writeOID('1.3.101.112'); + if (PrivateKey.isPrivateKey(key)) + throw (new Error('Ed25519 private keys in pkcs8 ' + + 'format are not supported')); + writePkcs8EdDSAPublic(key, der); + break; + default: + throw (new Error('Unsupported key type: ' + key.type)); + } + + der.endSequence(); +} + +function writePkcs8RSAPrivate(key, der) { + der.writeNull(); + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + + var version = Buffer.from([0]); + der.writeBuffer(version, asn1.Ber.Integer); + + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.writeBuffer(key.part.d.data, asn1.Ber.Integer); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + if (!key.part.dmodp || !key.part.dmodq) + utils.addRSAMissing(key); + der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer); + der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer); + der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer); + + der.endSequence(); + der.endSequence(); +} + +function writePkcs8RSAPublic(key, der) { + der.writeNull(); + der.endSequence(); + + der.startSequence(asn1.Ber.BitString); + der.writeByte(0x00); + + der.startSequence(); + der.writeBuffer(key.part.n.data, asn1.Ber.Integer); + der.writeBuffer(key.part.e.data, asn1.Ber.Integer); + der.endSequence(); + + der.endSequence(); +} + +function writePkcs8DSAPrivate(key, der) { + der.startSequence(); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.endSequence(); + + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.writeBuffer(key.part.x.data, asn1.Ber.Integer); + der.endSequence(); +} + +function writePkcs8DSAPublic(key, der) { + der.startSequence(); + der.writeBuffer(key.part.p.data, asn1.Ber.Integer); + der.writeBuffer(key.part.q.data, asn1.Ber.Integer); + der.writeBuffer(key.part.g.data, asn1.Ber.Integer); + der.endSequence(); + der.endSequence(); + + der.startSequence(asn1.Ber.BitString); + der.writeByte(0x00); + der.writeBuffer(key.part.y.data, asn1.Ber.Integer); + der.endSequence(); +} + +function writeECDSACurve(key, der) { + var curve = algs.curves[key.curve]; + if (curve.pkcs8oid) { + /* This one has a name in pkcs#8, so just write the oid */ + der.writeOID(curve.pkcs8oid); + + } else { + // ECParameters sequence + der.startSequence(); + + var version = Buffer.from([1]); + der.writeBuffer(version, asn1.Ber.Integer); + + // FieldID sequence + der.startSequence(); + der.writeOID('1.2.840.10045.1.1'); // prime-field + der.writeBuffer(curve.p, asn1.Ber.Integer); + der.endSequence(); + + // Curve sequence + der.startSequence(); + var a = curve.p; + if (a[0] === 0x0) + a = a.slice(1); + der.writeBuffer(a, asn1.Ber.OctetString); + der.writeBuffer(curve.b, asn1.Ber.OctetString); + der.writeBuffer(curve.s, asn1.Ber.BitString); + der.endSequence(); + + der.writeBuffer(curve.G, asn1.Ber.OctetString); + der.writeBuffer(curve.n, asn1.Ber.Integer); + var h = curve.h; + if (!h) { + h = Buffer.from([1]); + } + der.writeBuffer(h, asn1.Ber.Integer); + + // ECParameters + der.endSequence(); + } +} + +function writePkcs8ECDSAPublic(key, der) { + writeECDSACurve(key, der); + der.endSequence(); + + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); +} + +function writePkcs8ECDSAPrivate(key, der) { + writeECDSACurve(key, der); + der.endSequence(); + + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + + var version = Buffer.from([1]); + der.writeBuffer(version, asn1.Ber.Integer); + + der.writeBuffer(key.part.d.data, asn1.Ber.OctetString); + + der.startSequence(0xa1); + var Q = utils.ecNormalize(key.part.Q.data, true); + der.writeBuffer(Q, asn1.Ber.BitString); + der.endSequence(); + + der.endSequence(); + der.endSequence(); +} + +function writePkcs8EdDSAPublic(key, der) { + der.endSequence(); + + utils.writeBitString(der, key.part.A.data); +} + +function writePkcs8EdDSAPrivate(key, der) { + der.endSequence(); + + var k = utils.mpNormalize(key.part.k.data, true); + der.startSequence(asn1.Ber.OctetString); + der.writeBuffer(k, asn1.Ber.OctetString); + der.endSequence(); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/putty.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/putty.js new file mode 100644 index 0000000..344419f --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/putty.js @@ -0,0 +1,99 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var rfc4253 = require('./rfc4253'); +var Key = require('../key'); + +var errors = require('../errors'); + +function read(buf, options) { + var lines = buf.toString('ascii').split(/[\r\n]+/); + var found = false; + var parts; + var si = 0; + while (si < lines.length) { + parts = splitHeader(lines[si++]); + if (parts && + parts[0].toLowerCase() === 'putty-user-key-file-2') { + found = true; + break; + } + } + if (!found) { + throw (new Error('No PuTTY format first line found')); + } + var alg = parts[1]; + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'encryption'); + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'comment'); + var comment = parts[1]; + + parts = splitHeader(lines[si++]); + assert.equal(parts[0].toLowerCase(), 'public-lines'); + var publicLines = parseInt(parts[1], 10); + if (!isFinite(publicLines) || publicLines < 0 || + publicLines > lines.length) { + throw (new Error('Invalid public-lines count')); + } + + var publicBuf = Buffer.from( + lines.slice(si, si + publicLines).join(''), 'base64'); + var keyType = rfc4253.algToKeyType(alg); + var key = rfc4253.read(publicBuf); + if (key.type !== keyType) { + throw (new Error('Outer key algorithm mismatch')); + } + key.comment = comment; + return (key); +} + +function splitHeader(line) { + var idx = line.indexOf(':'); + if (idx === -1) + return (null); + var header = line.slice(0, idx); + ++idx; + while (line[idx] === ' ') + ++idx; + var rest = line.slice(idx); + return ([header, rest]); +} + +function write(key, options) { + assert.object(key); + if (!Key.isKey(key)) + throw (new Error('Must be a public key')); + + var alg = rfc4253.keyTypeToAlg(key); + var buf = rfc4253.write(key); + var comment = key.comment || ''; + + var b64 = buf.toString('base64'); + var lines = wrap(b64, 64); + + lines.unshift('Public-Lines: ' + lines.length); + lines.unshift('Comment: ' + comment); + lines.unshift('Encryption: none'); + lines.unshift('PuTTY-User-Key-File-2: ' + alg); + + return (Buffer.from(lines.join('\n') + '\n')); +} + +function wrap(txt, len) { + var lines = []; + var pos = 0; + while (pos < txt.length) { + lines.push(txt.slice(pos, pos + 64)); + pos += 64; + } + return (lines); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/rfc4253.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/rfc4253.js new file mode 100644 index 0000000..52fddcb --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/rfc4253.js @@ -0,0 +1,166 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read.bind(undefined, false, undefined), + readType: read.bind(undefined, false), + write: write, + /* semi-private api, used by sshpk-agent */ + readPartial: read.bind(undefined, true), + + /* shared with ssh format */ + readInternal: read, + keyTypeToAlg: keyTypeToAlg, + algToKeyType: algToKeyType +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var SSHBuffer = require('../ssh-buffer'); + +function algToKeyType(alg) { + assert.string(alg); + if (alg === 'ssh-dss') + return ('dsa'); + else if (alg === 'ssh-rsa') + return ('rsa'); + else if (alg === 'ssh-ed25519') + return ('ed25519'); + else if (alg === 'ssh-curve25519') + return ('curve25519'); + else if (alg.match(/^ecdsa-sha2-/)) + return ('ecdsa'); + else + throw (new Error('Unknown algorithm ' + alg)); +} + +function keyTypeToAlg(key) { + assert.object(key); + if (key.type === 'dsa') + return ('ssh-dss'); + else if (key.type === 'rsa') + return ('ssh-rsa'); + else if (key.type === 'ed25519') + return ('ssh-ed25519'); + else if (key.type === 'curve25519') + return ('ssh-curve25519'); + else if (key.type === 'ecdsa') + return ('ecdsa-sha2-' + key.part.curve.data.toString()); + else + throw (new Error('Unknown key type ' + key.type)); +} + +function read(partial, type, buf, options) { + if (typeof (buf) === 'string') + buf = Buffer.from(buf); + assert.buffer(buf, 'buf'); + + var key = {}; + + var parts = key.parts = []; + var sshbuf = new SSHBuffer({buffer: buf}); + + var alg = sshbuf.readString(); + assert.ok(!sshbuf.atEnd(), 'key must have at least one part'); + + key.type = algToKeyType(alg); + + var partCount = algs.info[key.type].parts.length; + if (type && type === 'private') + partCount = algs.privInfo[key.type].parts.length; + + while (!sshbuf.atEnd() && parts.length < partCount) + parts.push(sshbuf.readPart()); + while (!partial && !sshbuf.atEnd()) + parts.push(sshbuf.readPart()); + + assert.ok(parts.length >= 1, + 'key must have at least one part'); + assert.ok(partial || sshbuf.atEnd(), + 'leftover bytes at end of key'); + + var Constructor = Key; + var algInfo = algs.info[key.type]; + if (type === 'private' || algInfo.parts.length !== parts.length) { + algInfo = algs.privInfo[key.type]; + Constructor = PrivateKey; + } + assert.strictEqual(algInfo.parts.length, parts.length); + + if (key.type === 'ecdsa') { + var res = /^ecdsa-sha2-(.+)$/.exec(alg); + assert.ok(res !== null); + assert.strictEqual(res[1], parts[0].data.toString()); + } + + var normalized = true; + for (var i = 0; i < algInfo.parts.length; ++i) { + var p = parts[i]; + p.name = algInfo.parts[i]; + /* + * OpenSSH stores ed25519 "private" keys as seed + public key + * concat'd together (k followed by A). We want to keep them + * separate for other formats that don't do this. + */ + if (key.type === 'ed25519' && p.name === 'k') + p.data = p.data.slice(0, 32); + + if (p.name !== 'curve' && algInfo.normalize !== false) { + var nd; + if (key.type === 'ed25519') { + nd = utils.zeroPadToLength(p.data, 32); + } else { + nd = utils.mpNormalize(p.data); + } + if (nd.toString('binary') !== + p.data.toString('binary')) { + p.data = nd; + normalized = false; + } + } + } + + if (normalized) + key._rfc4253Cache = sshbuf.toBuffer(); + + if (partial && typeof (partial) === 'object') { + partial.remainder = sshbuf.remainder(); + partial.consumed = sshbuf._offset; + } + + return (new Constructor(key)); +} + +function write(key, options) { + assert.object(key); + + var alg = keyTypeToAlg(key); + var i; + + var algInfo = algs.info[key.type]; + if (PrivateKey.isPrivateKey(key)) + algInfo = algs.privInfo[key.type]; + var parts = algInfo.parts; + + var buf = new SSHBuffer({}); + + buf.writeString(alg); + + for (i = 0; i < parts.length; ++i) { + var data = key.part[parts[i]].data; + if (algInfo.normalize !== false) { + if (key.type === 'ed25519') + data = utils.zeroPadToLength(data, 32); + else + data = utils.mpNormalize(data); + } + if (key.type === 'ed25519' && parts[i] === 'k') + data = Buffer.concat([data, key.part.A.data]); + buf.writeBuffer(data); + } + + return (buf.toBuffer()); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/ssh-private.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/ssh-private.js new file mode 100644 index 0000000..5e7eed8 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/ssh-private.js @@ -0,0 +1,262 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + readSSHPrivate: readSSHPrivate, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var crypto = require('crypto'); + +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var rfc4253 = require('./rfc4253'); +var SSHBuffer = require('../ssh-buffer'); +var errors = require('../errors'); + +var bcrypt; + +function read(buf, options) { + return (pem.read(buf, options)); +} + +var MAGIC = 'openssh-key-v1'; + +function readSSHPrivate(type, buf, options) { + buf = new SSHBuffer({buffer: buf}); + + var magic = buf.readCString(); + assert.strictEqual(magic, MAGIC, 'bad magic string'); + + var cipher = buf.readString(); + var kdf = buf.readString(); + var kdfOpts = buf.readBuffer(); + + var nkeys = buf.readInt(); + if (nkeys !== 1) { + throw (new Error('OpenSSH-format key file contains ' + + 'multiple keys: this is unsupported.')); + } + + var pubKey = buf.readBuffer(); + + if (type === 'public') { + assert.ok(buf.atEnd(), 'excess bytes left after key'); + return (rfc4253.read(pubKey)); + } + + var privKeyBlob = buf.readBuffer(); + assert.ok(buf.atEnd(), 'excess bytes left after key'); + + var kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts }); + switch (kdf) { + case 'none': + if (cipher !== 'none') { + throw (new Error('OpenSSH-format key uses KDF "none" ' + + 'but specifies a cipher other than "none"')); + } + break; + case 'bcrypt': + var salt = kdfOptsBuf.readBuffer(); + var rounds = kdfOptsBuf.readInt(); + var cinf = utils.opensshCipherInfo(cipher); + if (bcrypt === undefined) { + bcrypt = require('bcrypt-pbkdf'); + } + + if (typeof (options.passphrase) === 'string') { + options.passphrase = Buffer.from(options.passphrase, + 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'OpenSSH')); + } + + var pass = new Uint8Array(options.passphrase); + var salti = new Uint8Array(salt); + /* Use the pbkdf to derive both the key and the IV. */ + var out = new Uint8Array(cinf.keySize + cinf.blockSize); + var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, + out, out.length, rounds); + if (res !== 0) { + throw (new Error('bcrypt_pbkdf function returned ' + + 'failure, parameters invalid')); + } + out = Buffer.from(out); + var ckey = out.slice(0, cinf.keySize); + var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); + var cipherStream = crypto.createDecipheriv(cinf.opensslName, + ckey, iv); + cipherStream.setAutoPadding(false); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + if (e.toString().indexOf('bad decrypt') !== -1) { + throw (new Error('Incorrect passphrase ' + + 'supplied, could not decrypt key')); + } + throw (e); + }); + cipherStream.write(privKeyBlob); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + privKeyBlob = Buffer.concat(chunks); + break; + default: + throw (new Error( + 'OpenSSH-format key uses unknown KDF "' + kdf + '"')); + } + + buf = new SSHBuffer({buffer: privKeyBlob}); + + var checkInt1 = buf.readInt(); + var checkInt2 = buf.readInt(); + if (checkInt1 !== checkInt2) { + throw (new Error('Incorrect passphrase supplied, could not ' + + 'decrypt key')); + } + + var ret = {}; + var key = rfc4253.readInternal(ret, 'private', buf.remainder()); + + buf.skip(ret.consumed); + + var comment = buf.readString(); + key.comment = comment; + + return (key); +} + +function write(key, options) { + var pubKey; + if (PrivateKey.isPrivateKey(key)) + pubKey = key.toPublic(); + else + pubKey = key; + + var cipher = 'none'; + var kdf = 'none'; + var kdfopts = Buffer.alloc(0); + var cinf = { blockSize: 8 }; + var passphrase; + if (options !== undefined) { + passphrase = options.passphrase; + if (typeof (passphrase) === 'string') + passphrase = Buffer.from(passphrase, 'utf-8'); + if (passphrase !== undefined) { + assert.buffer(passphrase, 'options.passphrase'); + assert.optionalString(options.cipher, 'options.cipher'); + cipher = options.cipher; + if (cipher === undefined) + cipher = 'aes128-ctr'; + cinf = utils.opensshCipherInfo(cipher); + kdf = 'bcrypt'; + } + } + + var privBuf; + if (PrivateKey.isPrivateKey(key)) { + privBuf = new SSHBuffer({}); + var checkInt = crypto.randomBytes(4).readUInt32BE(0); + privBuf.writeInt(checkInt); + privBuf.writeInt(checkInt); + privBuf.write(key.toBuffer('rfc4253')); + privBuf.writeString(key.comment || ''); + + var n = 1; + while (privBuf._offset % cinf.blockSize !== 0) + privBuf.writeChar(n++); + privBuf = privBuf.toBuffer(); + } + + switch (kdf) { + case 'none': + break; + case 'bcrypt': + var salt = crypto.randomBytes(16); + var rounds = 16; + var kdfssh = new SSHBuffer({}); + kdfssh.writeBuffer(salt); + kdfssh.writeInt(rounds); + kdfopts = kdfssh.toBuffer(); + + if (bcrypt === undefined) { + bcrypt = require('bcrypt-pbkdf'); + } + var pass = new Uint8Array(passphrase); + var salti = new Uint8Array(salt); + /* Use the pbkdf to derive both the key and the IV. */ + var out = new Uint8Array(cinf.keySize + cinf.blockSize); + var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, + out, out.length, rounds); + if (res !== 0) { + throw (new Error('bcrypt_pbkdf function returned ' + + 'failure, parameters invalid')); + } + out = Buffer.from(out); + var ckey = out.slice(0, cinf.keySize); + var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); + + var cipherStream = crypto.createCipheriv(cinf.opensslName, + ckey, iv); + cipherStream.setAutoPadding(false); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + throw (e); + }); + cipherStream.write(privBuf); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + privBuf = Buffer.concat(chunks); + break; + default: + throw (new Error('Unsupported kdf ' + kdf)); + } + + var buf = new SSHBuffer({}); + + buf.writeCString(MAGIC); + buf.writeString(cipher); /* cipher */ + buf.writeString(kdf); /* kdf */ + buf.writeBuffer(kdfopts); /* kdfoptions */ + + buf.writeInt(1); /* nkeys */ + buf.writeBuffer(pubKey.toBuffer('rfc4253')); + + if (privBuf) + buf.writeBuffer(privBuf); + + buf = buf.toBuffer(); + + var header; + if (PrivateKey.isPrivateKey(key)) + header = 'OPENSSH PRIVATE KEY'; + else + header = 'OPENSSH PUBLIC KEY'; + + var tmp = buf.toString('base64'); + var len = tmp.length + (tmp.length / 70) + + 18 + 16 + header.length*2 + 10; + buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 70; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/ssh.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/ssh.js new file mode 100644 index 0000000..c8e9c93 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/ssh.js @@ -0,0 +1,115 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + read: read, + write: write +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var rfc4253 = require('./rfc4253'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); + +var sshpriv = require('./ssh-private'); + +/*JSSTYLED*/ +var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([ \t]+([^ \t][^\n]*[\n]*)?)?$/; +/*JSSTYLED*/ +var SSHKEY_RE2 = /^([a-z0-9-]+)[ \t\n]+([a-zA-Z0-9+\/][a-zA-Z0-9+\/ \t\n=]*)([^a-zA-Z0-9+\/ \t\n=].*)?$/; + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var trimmed = buf.trim().replace(/[\\\r]/g, ''); + var m = trimmed.match(SSHKEY_RE); + if (!m) + m = trimmed.match(SSHKEY_RE2); + assert.ok(m, 'key must match regex'); + + var type = rfc4253.algToKeyType(m[1]); + var kbuf = Buffer.from(m[2], 'base64'); + + /* + * This is a bit tricky. If we managed to parse the key and locate the + * key comment with the regex, then do a non-partial read and assert + * that we have consumed all bytes. If we couldn't locate the key + * comment, though, there may be whitespace shenanigans going on that + * have conjoined the comment to the rest of the key. We do a partial + * read in this case to try to make the best out of a sorry situation. + */ + var key; + var ret = {}; + if (m[4]) { + try { + key = rfc4253.read(kbuf); + + } catch (e) { + m = trimmed.match(SSHKEY_RE2); + assert.ok(m, 'key must match regex'); + kbuf = Buffer.from(m[2], 'base64'); + key = rfc4253.readInternal(ret, 'public', kbuf); + } + } else { + key = rfc4253.readInternal(ret, 'public', kbuf); + } + + assert.strictEqual(type, key.type); + + if (m[4] && m[4].length > 0) { + key.comment = m[4]; + + } else if (ret.consumed) { + /* + * Now the magic: trying to recover the key comment when it's + * gotten conjoined to the key or otherwise shenanigan'd. + * + * Work out how much base64 we used, then drop all non-base64 + * chars from the beginning up to this point in the the string. + * Then offset in this and try to make up for missing = chars. + */ + var data = m[2] + (m[3] ? m[3] : ''); + var realOffset = Math.ceil(ret.consumed / 3) * 4; + data = data.slice(0, realOffset - 2). /*JSSTYLED*/ + replace(/[^a-zA-Z0-9+\/=]/g, '') + + data.slice(realOffset - 2); + + var padding = ret.consumed % 3; + if (padding > 0 && + data.slice(realOffset - 1, realOffset) !== '=') + realOffset--; + while (data.slice(realOffset, realOffset + 1) === '=') + realOffset++; + + /* Finally, grab what we think is the comment & clean it up. */ + var trailer = data.slice(realOffset); + trailer = trailer.replace(/[\r\n]/g, ' '). + replace(/^\s+/, ''); + if (trailer.match(/^[a-zA-Z0-9]/)) + key.comment = trailer; + } + + return (key); +} + +function write(key, options) { + assert.object(key); + if (!Key.isKey(key)) + throw (new Error('Must be a public key')); + + var parts = []; + var alg = rfc4253.keyTypeToAlg(key); + parts.push(alg); + + var buf = rfc4253.write(key); + parts.push(buf.toString('base64')); + + if (key.comment) + parts.push(key.comment); + + return (Buffer.from(parts.join(' '))); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/x509-pem.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/x509-pem.js new file mode 100644 index 0000000..3155ef0 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/x509-pem.js @@ -0,0 +1,88 @@ +// Copyright 2016 Joyent, Inc. + +var x509 = require('./x509'); + +module.exports = { + read: read, + verify: x509.verify, + sign: x509.sign, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var Identity = require('../identity'); +var Signature = require('../signature'); +var Certificate = require('../certificate'); + +function read(buf, options) { + if (typeof (buf) !== 'string') { + assert.buffer(buf, 'buf'); + buf = buf.toString('ascii'); + } + + var lines = buf.trim().split(/[\r\n]+/g); + + var m; + var si = -1; + while (!m && si < lines.length) { + m = lines[++si].match(/*JSSTYLED*/ + /[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/); + } + assert.ok(m, 'invalid PEM header'); + + var m2; + var ei = lines.length; + while (!m2 && ei > 0) { + m2 = lines[--ei].match(/*JSSTYLED*/ + /[-]+[ ]*END CERTIFICATE[ ]*[-]+/); + } + assert.ok(m2, 'invalid PEM footer'); + + lines = lines.slice(si, ei + 1); + + var headers = {}; + while (true) { + lines = lines.slice(1); + m = lines[0].match(/*JSSTYLED*/ + /^([A-Za-z0-9-]+): (.+)$/); + if (!m) + break; + headers[m[1].toLowerCase()] = m[2]; + } + + /* Chop off the first and last lines */ + lines = lines.slice(0, -1).join(''); + buf = Buffer.from(lines, 'base64'); + + return (x509.read(buf, options)); +} + +function write(cert, options) { + var dbuf = x509.write(cert, options); + + var header = 'CERTIFICATE'; + var tmp = dbuf.toString('base64'); + var len = tmp.length + (tmp.length / 64) + + 18 + 16 + header.length*2 + 10; + var buf = Buffer.alloc(len); + var o = 0; + o += buf.write('-----BEGIN ' + header + '-----\n', o); + for (var i = 0; i < tmp.length; ) { + var limit = i + 64; + if (limit > tmp.length) + limit = tmp.length; + o += buf.write(tmp.slice(i, limit), o); + buf[o++] = 10; + i = limit; + } + o += buf.write('-----END ' + header + '-----\n', o); + + return (buf.slice(0, o)); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/formats/x509.js b/packages/字体精简工具/node_modules/sshpk/lib/formats/x509.js new file mode 100644 index 0000000..0144c44 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/formats/x509.js @@ -0,0 +1,752 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = { + read: read, + verify: verify, + sign: sign, + signAsync: signAsync, + write: write +}; + +var assert = require('assert-plus'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('../algs'); +var utils = require('../utils'); +var Key = require('../key'); +var PrivateKey = require('../private-key'); +var pem = require('./pem'); +var Identity = require('../identity'); +var Signature = require('../signature'); +var Certificate = require('../certificate'); +var pkcs8 = require('./pkcs8'); + +/* + * This file is based on RFC5280 (X.509). + */ + +/* Helper to read in a single mpint */ +function readMPInt(der, nm) { + assert.strictEqual(der.peek(), asn1.Ber.Integer, + nm + ' is not an Integer'); + return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true))); +} + +function verify(cert, key) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + var algParts = sig.algo.split('-'); + if (algParts[0] !== key.type) + return (false); + + var blob = sig.cache; + if (blob === undefined) { + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + blob = der.buffer; + } + + var verifier = key.createVerify(algParts[1]); + verifier.write(blob); + return (verifier.verify(sig.signature)); +} + +function Local(i) { + return (asn1.Ber.Context | asn1.Ber.Constructor | i); +} + +function Context(i) { + return (asn1.Ber.Context | i); +} + +var SIGN_ALGS = { + 'rsa-md5': '1.2.840.113549.1.1.4', + 'rsa-sha1': '1.2.840.113549.1.1.5', + 'rsa-sha256': '1.2.840.113549.1.1.11', + 'rsa-sha384': '1.2.840.113549.1.1.12', + 'rsa-sha512': '1.2.840.113549.1.1.13', + 'dsa-sha1': '1.2.840.10040.4.3', + 'dsa-sha256': '2.16.840.1.101.3.4.3.2', + 'ecdsa-sha1': '1.2.840.10045.4.1', + 'ecdsa-sha256': '1.2.840.10045.4.3.2', + 'ecdsa-sha384': '1.2.840.10045.4.3.3', + 'ecdsa-sha512': '1.2.840.10045.4.3.4', + 'ed25519-sha512': '1.3.101.112' +}; +Object.keys(SIGN_ALGS).forEach(function (k) { + SIGN_ALGS[SIGN_ALGS[k]] = k; +}); +SIGN_ALGS['1.3.14.3.2.3'] = 'rsa-md5'; +SIGN_ALGS['1.3.14.3.2.29'] = 'rsa-sha1'; + +var EXTS = { + 'issuerKeyId': '2.5.29.35', + 'altName': '2.5.29.17', + 'basicConstraints': '2.5.29.19', + 'keyUsage': '2.5.29.15', + 'extKeyUsage': '2.5.29.37' +}; + +function read(buf, options) { + if (typeof (buf) === 'string') { + buf = Buffer.from(buf, 'binary'); + } + assert.buffer(buf, 'buf'); + + var der = new asn1.BerReader(buf); + + der.readSequence(); + if (Math.abs(der.length - der.remain) > 1) { + throw (new Error('DER sequence does not contain whole byte ' + + 'stream')); + } + + var tbsStart = der.offset; + der.readSequence(); + var sigOffset = der.offset + der.length; + var tbsEnd = sigOffset; + + if (der.peek() === Local(0)) { + der.readSequence(Local(0)); + var version = der.readInt(); + assert.ok(version <= 3, + 'only x.509 versions up to v3 supported'); + } + + var cert = {}; + cert.signatures = {}; + var sig = (cert.signatures.x509 = {}); + sig.extras = {}; + + cert.serial = readMPInt(der, 'serial'); + + der.readSequence(); + var after = der.offset + der.length; + var certAlgOid = der.readOID(); + var certAlg = SIGN_ALGS[certAlgOid]; + if (certAlg === undefined) + throw (new Error('unknown signature algorithm ' + certAlgOid)); + + der._offset = after; + cert.issuer = Identity.parseAsn1(der); + + der.readSequence(); + cert.validFrom = readDate(der); + cert.validUntil = readDate(der); + + cert.subjects = [Identity.parseAsn1(der)]; + + der.readSequence(); + after = der.offset + der.length; + cert.subjectKey = pkcs8.readPkcs8(undefined, 'public', der); + der._offset = after; + + /* issuerUniqueID */ + if (der.peek() === Local(1)) { + der.readSequence(Local(1)); + sig.extras.issuerUniqueID = + buf.slice(der.offset, der.offset + der.length); + der._offset += der.length; + } + + /* subjectUniqueID */ + if (der.peek() === Local(2)) { + der.readSequence(Local(2)); + sig.extras.subjectUniqueID = + buf.slice(der.offset, der.offset + der.length); + der._offset += der.length; + } + + /* extensions */ + if (der.peek() === Local(3)) { + der.readSequence(Local(3)); + var extEnd = der.offset + der.length; + der.readSequence(); + + while (der.offset < extEnd) + readExtension(cert, buf, der); + + assert.strictEqual(der.offset, extEnd); + } + + assert.strictEqual(der.offset, sigOffset); + + der.readSequence(); + after = der.offset + der.length; + var sigAlgOid = der.readOID(); + var sigAlg = SIGN_ALGS[sigAlgOid]; + if (sigAlg === undefined) + throw (new Error('unknown signature algorithm ' + sigAlgOid)); + der._offset = after; + + var sigData = der.readString(asn1.Ber.BitString, true); + if (sigData[0] === 0) + sigData = sigData.slice(1); + var algParts = sigAlg.split('-'); + + sig.signature = Signature.parse(sigData, algParts[0], 'asn1'); + sig.signature.hashAlgorithm = algParts[1]; + sig.algo = sigAlg; + sig.cache = buf.slice(tbsStart, tbsEnd); + + return (new Certificate(cert)); +} + +function readDate(der) { + if (der.peek() === asn1.Ber.UTCTime) { + return (utcTimeToDate(der.readString(asn1.Ber.UTCTime))); + } else if (der.peek() === asn1.Ber.GeneralizedTime) { + return (gTimeToDate(der.readString(asn1.Ber.GeneralizedTime))); + } else { + throw (new Error('Unsupported date format')); + } +} + +function writeDate(der, date) { + if (date.getUTCFullYear() >= 2050 || date.getUTCFullYear() < 1950) { + der.writeString(dateToGTime(date), asn1.Ber.GeneralizedTime); + } else { + der.writeString(dateToUTCTime(date), asn1.Ber.UTCTime); + } +} + +/* RFC5280, section 4.2.1.6 (GeneralName type) */ +var ALTNAME = { + OtherName: Local(0), + RFC822Name: Context(1), + DNSName: Context(2), + X400Address: Local(3), + DirectoryName: Local(4), + EDIPartyName: Local(5), + URI: Context(6), + IPAddress: Context(7), + OID: Context(8) +}; + +/* RFC5280, section 4.2.1.12 (KeyPurposeId) */ +var EXTPURPOSE = { + 'serverAuth': '1.3.6.1.5.5.7.3.1', + 'clientAuth': '1.3.6.1.5.5.7.3.2', + 'codeSigning': '1.3.6.1.5.5.7.3.3', + + /* See https://github.com/joyent/oid-docs/blob/master/root.md */ + 'joyentDocker': '1.3.6.1.4.1.38678.1.4.1', + 'joyentCmon': '1.3.6.1.4.1.38678.1.4.2' +}; +var EXTPURPOSE_REV = {}; +Object.keys(EXTPURPOSE).forEach(function (k) { + EXTPURPOSE_REV[EXTPURPOSE[k]] = k; +}); + +var KEYUSEBITS = [ + 'signature', 'identity', 'keyEncryption', + 'encryption', 'keyAgreement', 'ca', 'crl' +]; + +function readExtension(cert, buf, der) { + der.readSequence(); + var after = der.offset + der.length; + var extId = der.readOID(); + var id; + var sig = cert.signatures.x509; + if (!sig.extras.exts) + sig.extras.exts = []; + + var critical; + if (der.peek() === asn1.Ber.Boolean) + critical = der.readBoolean(); + + switch (extId) { + case (EXTS.basicConstraints): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + var bcEnd = der.offset + der.length; + var ca = false; + if (der.peek() === asn1.Ber.Boolean) + ca = der.readBoolean(); + if (cert.purposes === undefined) + cert.purposes = []; + if (ca === true) + cert.purposes.push('ca'); + var bc = { oid: extId, critical: critical }; + if (der.offset < bcEnd && der.peek() === asn1.Ber.Integer) + bc.pathLen = der.readInt(); + sig.extras.exts.push(bc); + break; + case (EXTS.extKeyUsage): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + if (cert.purposes === undefined) + cert.purposes = []; + var ekEnd = der.offset + der.length; + while (der.offset < ekEnd) { + var oid = der.readOID(); + cert.purposes.push(EXTPURPOSE_REV[oid] || oid); + } + /* + * This is a bit of a hack: in the case where we have a cert + * that's only allowed to do serverAuth or clientAuth (and not + * the other), we want to make sure all our Subjects are of + * the right type. But we already parsed our Subjects and + * decided if they were hosts or users earlier (since it appears + * first in the cert). + * + * So we go through and mutate them into the right kind here if + * it doesn't match. This might not be hugely beneficial, as it + * seems that single-purpose certs are not often seen in the + * wild. + */ + if (cert.purposes.indexOf('serverAuth') !== -1 && + cert.purposes.indexOf('clientAuth') === -1) { + cert.subjects.forEach(function (ide) { + if (ide.type !== 'host') { + ide.type = 'host'; + ide.hostname = ide.uid || + ide.email || + ide.components[0].value; + } + }); + } else if (cert.purposes.indexOf('clientAuth') !== -1 && + cert.purposes.indexOf('serverAuth') === -1) { + cert.subjects.forEach(function (ide) { + if (ide.type !== 'user') { + ide.type = 'user'; + ide.uid = ide.hostname || + ide.email || + ide.components[0].value; + } + }); + } + sig.extras.exts.push({ oid: extId, critical: critical }); + break; + case (EXTS.keyUsage): + der.readSequence(asn1.Ber.OctetString); + var bits = der.readString(asn1.Ber.BitString, true); + var setBits = readBitField(bits, KEYUSEBITS); + setBits.forEach(function (bit) { + if (cert.purposes === undefined) + cert.purposes = []; + if (cert.purposes.indexOf(bit) === -1) + cert.purposes.push(bit); + }); + sig.extras.exts.push({ oid: extId, critical: critical, + bits: bits }); + break; + case (EXTS.altName): + der.readSequence(asn1.Ber.OctetString); + der.readSequence(); + var aeEnd = der.offset + der.length; + while (der.offset < aeEnd) { + switch (der.peek()) { + case ALTNAME.OtherName: + case ALTNAME.EDIPartyName: + der.readSequence(); + der._offset += der.length; + break; + case ALTNAME.OID: + der.readOID(ALTNAME.OID); + break; + case ALTNAME.RFC822Name: + /* RFC822 specifies email addresses */ + var email = der.readString(ALTNAME.RFC822Name); + id = Identity.forEmail(email); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + case ALTNAME.DirectoryName: + der.readSequence(ALTNAME.DirectoryName); + id = Identity.parseAsn1(der); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + case ALTNAME.DNSName: + var host = der.readString( + ALTNAME.DNSName); + id = Identity.forHost(host); + if (!cert.subjects[0].equals(id)) + cert.subjects.push(id); + break; + default: + der.readString(der.peek()); + break; + } + } + sig.extras.exts.push({ oid: extId, critical: critical }); + break; + default: + sig.extras.exts.push({ + oid: extId, + critical: critical, + data: der.readString(asn1.Ber.OctetString, true) + }); + break; + } + + der._offset = after; +} + +var UTCTIME_RE = + /^([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; +function utcTimeToDate(t) { + var m = t.match(UTCTIME_RE); + assert.ok(m, 'timestamps must be in UTC'); + var d = new Date(); + + var thisYear = d.getUTCFullYear(); + var century = Math.floor(thisYear / 100) * 100; + + var year = parseInt(m[1], 10); + if (thisYear % 100 < 50 && year >= 60) + year += (century - 1); + else + year += century; + d.setUTCFullYear(year, parseInt(m[2], 10) - 1, parseInt(m[3], 10)); + d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); + if (m[6] && m[6].length > 0) + d.setUTCSeconds(parseInt(m[6], 10)); + return (d); +} + +var GTIME_RE = + /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/; +function gTimeToDate(t) { + var m = t.match(GTIME_RE); + assert.ok(m); + var d = new Date(); + + d.setUTCFullYear(parseInt(m[1], 10), parseInt(m[2], 10) - 1, + parseInt(m[3], 10)); + d.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10)); + if (m[6] && m[6].length > 0) + d.setUTCSeconds(parseInt(m[6], 10)); + return (d); +} + +function zeroPad(n, m) { + if (m === undefined) + m = 2; + var s = '' + n; + while (s.length < m) + s = '0' + s; + return (s); +} + +function dateToUTCTime(d) { + var s = ''; + s += zeroPad(d.getUTCFullYear() % 100); + s += zeroPad(d.getUTCMonth() + 1); + s += zeroPad(d.getUTCDate()); + s += zeroPad(d.getUTCHours()); + s += zeroPad(d.getUTCMinutes()); + s += zeroPad(d.getUTCSeconds()); + s += 'Z'; + return (s); +} + +function dateToGTime(d) { + var s = ''; + s += zeroPad(d.getUTCFullYear(), 4); + s += zeroPad(d.getUTCMonth() + 1); + s += zeroPad(d.getUTCDate()); + s += zeroPad(d.getUTCHours()); + s += zeroPad(d.getUTCMinutes()); + s += zeroPad(d.getUTCSeconds()); + s += 'Z'; + return (s); +} + +function sign(cert, key) { + if (cert.signatures.x509 === undefined) + cert.signatures.x509 = {}; + var sig = cert.signatures.x509; + + sig.algo = key.type + '-' + key.defaultHashAlgorithm(); + if (SIGN_ALGS[sig.algo] === undefined) + return (false); + + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + var blob = der.buffer; + sig.cache = blob; + + var signer = key.createSign(); + signer.write(blob); + cert.signatures.x509.signature = signer.sign(); + + return (true); +} + +function signAsync(cert, signer, done) { + if (cert.signatures.x509 === undefined) + cert.signatures.x509 = {}; + var sig = cert.signatures.x509; + + var der = new asn1.BerWriter(); + writeTBSCert(cert, der); + var blob = der.buffer; + sig.cache = blob; + + signer(blob, function (err, signature) { + if (err) { + done(err); + return; + } + sig.algo = signature.type + '-' + signature.hashAlgorithm; + if (SIGN_ALGS[sig.algo] === undefined) { + done(new Error('Invalid signing algorithm "' + + sig.algo + '"')); + return; + } + sig.signature = signature; + done(); + }); +} + +function write(cert, options) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + var der = new asn1.BerWriter(); + der.startSequence(); + if (sig.cache) { + der._ensure(sig.cache.length); + sig.cache.copy(der._buf, der._offset); + der._offset += sig.cache.length; + } else { + writeTBSCert(cert, der); + } + + der.startSequence(); + der.writeOID(SIGN_ALGS[sig.algo]); + if (sig.algo.match(/^rsa-/)) + der.writeNull(); + der.endSequence(); + + var sigData = sig.signature.toBuffer('asn1'); + var data = Buffer.alloc(sigData.length + 1); + data[0] = 0; + sigData.copy(data, 1); + der.writeBuffer(data, asn1.Ber.BitString); + der.endSequence(); + + return (der.buffer); +} + +function writeTBSCert(cert, der) { + var sig = cert.signatures.x509; + assert.object(sig, 'x509 signature'); + + der.startSequence(); + + der.startSequence(Local(0)); + der.writeInt(2); + der.endSequence(); + + der.writeBuffer(utils.mpNormalize(cert.serial), asn1.Ber.Integer); + + der.startSequence(); + der.writeOID(SIGN_ALGS[sig.algo]); + if (sig.algo.match(/^rsa-/)) + der.writeNull(); + der.endSequence(); + + cert.issuer.toAsn1(der); + + der.startSequence(); + writeDate(der, cert.validFrom); + writeDate(der, cert.validUntil); + der.endSequence(); + + var subject = cert.subjects[0]; + var altNames = cert.subjects.slice(1); + subject.toAsn1(der); + + pkcs8.writePkcs8(der, cert.subjectKey); + + if (sig.extras && sig.extras.issuerUniqueID) { + der.writeBuffer(sig.extras.issuerUniqueID, Local(1)); + } + + if (sig.extras && sig.extras.subjectUniqueID) { + der.writeBuffer(sig.extras.subjectUniqueID, Local(2)); + } + + if (altNames.length > 0 || subject.type === 'host' || + (cert.purposes !== undefined && cert.purposes.length > 0) || + (sig.extras && sig.extras.exts)) { + der.startSequence(Local(3)); + der.startSequence(); + + var exts = []; + if (cert.purposes !== undefined && cert.purposes.length > 0) { + exts.push({ + oid: EXTS.basicConstraints, + critical: true + }); + exts.push({ + oid: EXTS.keyUsage, + critical: true + }); + exts.push({ + oid: EXTS.extKeyUsage, + critical: true + }); + } + exts.push({ oid: EXTS.altName }); + if (sig.extras && sig.extras.exts) + exts = sig.extras.exts; + + for (var i = 0; i < exts.length; ++i) { + der.startSequence(); + der.writeOID(exts[i].oid); + + if (exts[i].critical !== undefined) + der.writeBoolean(exts[i].critical); + + if (exts[i].oid === EXTS.altName) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + if (subject.type === 'host') { + der.writeString(subject.hostname, + Context(2)); + } + for (var j = 0; j < altNames.length; ++j) { + if (altNames[j].type === 'host') { + der.writeString( + altNames[j].hostname, + ALTNAME.DNSName); + } else if (altNames[j].type === + 'email') { + der.writeString( + altNames[j].email, + ALTNAME.RFC822Name); + } else { + /* + * Encode anything else as a + * DN style name for now. + */ + der.startSequence( + ALTNAME.DirectoryName); + altNames[j].toAsn1(der); + der.endSequence(); + } + } + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.basicConstraints) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + var ca = (cert.purposes.indexOf('ca') !== -1); + var pathLen = exts[i].pathLen; + der.writeBoolean(ca); + if (pathLen !== undefined) + der.writeInt(pathLen); + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.extKeyUsage) { + der.startSequence(asn1.Ber.OctetString); + der.startSequence(); + cert.purposes.forEach(function (purpose) { + if (purpose === 'ca') + return; + if (KEYUSEBITS.indexOf(purpose) !== -1) + return; + var oid = purpose; + if (EXTPURPOSE[purpose] !== undefined) + oid = EXTPURPOSE[purpose]; + der.writeOID(oid); + }); + der.endSequence(); + der.endSequence(); + } else if (exts[i].oid === EXTS.keyUsage) { + der.startSequence(asn1.Ber.OctetString); + /* + * If we parsed this certificate from a byte + * stream (i.e. we didn't generate it in sshpk) + * then we'll have a ".bits" property on the + * ext with the original raw byte contents. + * + * If we have this, use it here instead of + * regenerating it. This guarantees we output + * the same data we parsed, so signatures still + * validate. + */ + if (exts[i].bits !== undefined) { + der.writeBuffer(exts[i].bits, + asn1.Ber.BitString); + } else { + var bits = writeBitField(cert.purposes, + KEYUSEBITS); + der.writeBuffer(bits, + asn1.Ber.BitString); + } + der.endSequence(); + } else { + der.writeBuffer(exts[i].data, + asn1.Ber.OctetString); + } + + der.endSequence(); + } + + der.endSequence(); + der.endSequence(); + } + + der.endSequence(); +} + +/* + * Reads an ASN.1 BER bitfield out of the Buffer produced by doing + * `BerReader#readString(asn1.Ber.BitString)`. That function gives us the raw + * contents of the BitString tag, which is a count of unused bits followed by + * the bits as a right-padded byte string. + * + * `bits` is the Buffer, `bitIndex` should contain an array of string names + * for the bits in the string, ordered starting with bit #0 in the ASN.1 spec. + * + * Returns an array of Strings, the names of the bits that were set to 1. + */ +function readBitField(bits, bitIndex) { + var bitLen = 8 * (bits.length - 1) - bits[0]; + var setBits = {}; + for (var i = 0; i < bitLen; ++i) { + var byteN = 1 + Math.floor(i / 8); + var bit = 7 - (i % 8); + var mask = 1 << bit; + var bitVal = ((bits[byteN] & mask) !== 0); + var name = bitIndex[i]; + if (bitVal && typeof (name) === 'string') { + setBits[name] = true; + } + } + return (Object.keys(setBits)); +} + +/* + * `setBits` is an array of strings, containing the names for each bit that + * sould be set to 1. `bitIndex` is same as in `readBitField()`. + * + * Returns a Buffer, ready to be written out with `BerWriter#writeString()`. + */ +function writeBitField(setBits, bitIndex) { + var bitLen = bitIndex.length; + var blen = Math.ceil(bitLen / 8); + var unused = blen * 8 - bitLen; + var bits = Buffer.alloc(1 + blen); // zero-filled + bits[0] = unused; + for (var i = 0; i < bitLen; ++i) { + var byteN = 1 + Math.floor(i / 8); + var bit = 7 - (i % 8); + var mask = 1 << bit; + var name = bitIndex[i]; + if (name === undefined) + continue; + var bitVal = (setBits.indexOf(name) !== -1); + if (bitVal) { + bits[byteN] |= mask; + } + } + return (bits); +} diff --git a/packages/字体精简工具/node_modules/sshpk/lib/identity.js b/packages/字体精简工具/node_modules/sshpk/lib/identity.js new file mode 100644 index 0000000..7d75b66 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/identity.js @@ -0,0 +1,373 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = Identity; + +var assert = require('assert-plus'); +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var asn1 = require('asn1'); +var Buffer = require('safer-buffer').Buffer; + +/*JSSTYLED*/ +var DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\-]{0,62})(?:\.([*]|[a-z0-9][a-z0-9\-]{0,62}))*$/i; + +var oids = {}; +oids.cn = '2.5.4.3'; +oids.o = '2.5.4.10'; +oids.ou = '2.5.4.11'; +oids.l = '2.5.4.7'; +oids.s = '2.5.4.8'; +oids.c = '2.5.4.6'; +oids.sn = '2.5.4.4'; +oids.postalCode = '2.5.4.17'; +oids.serialNumber = '2.5.4.5'; +oids.street = '2.5.4.9'; +oids.x500UniqueIdentifier = '2.5.4.45'; +oids.role = '2.5.4.72'; +oids.telephoneNumber = '2.5.4.20'; +oids.description = '2.5.4.13'; +oids.dc = '0.9.2342.19200300.100.1.25'; +oids.uid = '0.9.2342.19200300.100.1.1'; +oids.mail = '0.9.2342.19200300.100.1.3'; +oids.title = '2.5.4.12'; +oids.gn = '2.5.4.42'; +oids.initials = '2.5.4.43'; +oids.pseudonym = '2.5.4.65'; +oids.emailAddress = '1.2.840.113549.1.9.1'; + +var unoids = {}; +Object.keys(oids).forEach(function (k) { + unoids[oids[k]] = k; +}); + +function Identity(opts) { + var self = this; + assert.object(opts, 'options'); + assert.arrayOfObject(opts.components, 'options.components'); + this.components = opts.components; + this.componentLookup = {}; + this.components.forEach(function (c) { + if (c.name && !c.oid) + c.oid = oids[c.name]; + if (c.oid && !c.name) + c.name = unoids[c.oid]; + if (self.componentLookup[c.name] === undefined) + self.componentLookup[c.name] = []; + self.componentLookup[c.name].push(c); + }); + if (this.componentLookup.cn && this.componentLookup.cn.length > 0) { + this.cn = this.componentLookup.cn[0].value; + } + assert.optionalString(opts.type, 'options.type'); + if (opts.type === undefined) { + if (this.components.length === 1 && + this.componentLookup.cn && + this.componentLookup.cn.length === 1 && + this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { + this.type = 'host'; + this.hostname = this.componentLookup.cn[0].value; + + } else if (this.componentLookup.dc && + this.components.length === this.componentLookup.dc.length) { + this.type = 'host'; + this.hostname = this.componentLookup.dc.map( + function (c) { + return (c.value); + }).join('.'); + + } else if (this.componentLookup.uid && + this.components.length === + this.componentLookup.uid.length) { + this.type = 'user'; + this.uid = this.componentLookup.uid[0].value; + + } else if (this.componentLookup.cn && + this.componentLookup.cn.length === 1 && + this.componentLookup.cn[0].value.match(DNS_NAME_RE)) { + this.type = 'host'; + this.hostname = this.componentLookup.cn[0].value; + + } else if (this.componentLookup.uid && + this.componentLookup.uid.length === 1) { + this.type = 'user'; + this.uid = this.componentLookup.uid[0].value; + + } else if (this.componentLookup.mail && + this.componentLookup.mail.length === 1) { + this.type = 'email'; + this.email = this.componentLookup.mail[0].value; + + } else if (this.componentLookup.cn && + this.componentLookup.cn.length === 1) { + this.type = 'user'; + this.uid = this.componentLookup.cn[0].value; + + } else { + this.type = 'unknown'; + } + } else { + this.type = opts.type; + if (this.type === 'host') + this.hostname = opts.hostname; + else if (this.type === 'user') + this.uid = opts.uid; + else if (this.type === 'email') + this.email = opts.email; + else + throw (new Error('Unknown type ' + this.type)); + } +} + +Identity.prototype.toString = function () { + return (this.components.map(function (c) { + var n = c.name.toUpperCase(); + /*JSSTYLED*/ + n = n.replace(/=/g, '\\='); + var v = c.value; + /*JSSTYLED*/ + v = v.replace(/,/g, '\\,'); + return (n + '=' + v); + }).join(', ')); +}; + +Identity.prototype.get = function (name, asArray) { + assert.string(name, 'name'); + var arr = this.componentLookup[name]; + if (arr === undefined || arr.length === 0) + return (undefined); + if (!asArray && arr.length > 1) + throw (new Error('Multiple values for attribute ' + name)); + if (!asArray) + return (arr[0].value); + return (arr.map(function (c) { + return (c.value); + })); +}; + +Identity.prototype.toArray = function (idx) { + return (this.components.map(function (c) { + return ({ + name: c.name, + value: c.value + }); + })); +}; + +/* + * These are from X.680 -- PrintableString allowed chars are in section 37.4 + * table 8. Spec for IA5Strings is "1,6 + SPACE + DEL" where 1 refers to + * ISO IR #001 (standard ASCII control characters) and 6 refers to ISO IR #006 + * (the basic ASCII character set). + */ +/* JSSTYLED */ +var NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\/:=?-]/; +/* JSSTYLED */ +var NOT_IA5 = /[^\x00-\x7f]/; + +Identity.prototype.toAsn1 = function (der, tag) { + der.startSequence(tag); + this.components.forEach(function (c) { + der.startSequence(asn1.Ber.Constructor | asn1.Ber.Set); + der.startSequence(); + der.writeOID(c.oid); + /* + * If we fit in a PrintableString, use that. Otherwise use an + * IA5String or UTF8String. + * + * If this identity was parsed from a DN, use the ASN.1 types + * from the original representation (otherwise this might not + * be a full match for the original in some validators). + */ + if (c.asn1type === asn1.Ber.Utf8String || + c.value.match(NOT_IA5)) { + var v = Buffer.from(c.value, 'utf8'); + der.writeBuffer(v, asn1.Ber.Utf8String); + + } else if (c.asn1type === asn1.Ber.IA5String || + c.value.match(NOT_PRINTABLE)) { + der.writeString(c.value, asn1.Ber.IA5String); + + } else { + var type = asn1.Ber.PrintableString; + if (c.asn1type !== undefined) + type = c.asn1type; + der.writeString(c.value, type); + } + der.endSequence(); + der.endSequence(); + }); + der.endSequence(); +}; + +function globMatch(a, b) { + if (a === '**' || b === '**') + return (true); + var aParts = a.split('.'); + var bParts = b.split('.'); + if (aParts.length !== bParts.length) + return (false); + for (var i = 0; i < aParts.length; ++i) { + if (aParts[i] === '*' || bParts[i] === '*') + continue; + if (aParts[i] !== bParts[i]) + return (false); + } + return (true); +} + +Identity.prototype.equals = function (other) { + if (!Identity.isIdentity(other, [1, 0])) + return (false); + if (other.components.length !== this.components.length) + return (false); + for (var i = 0; i < this.components.length; ++i) { + if (this.components[i].oid !== other.components[i].oid) + return (false); + if (!globMatch(this.components[i].value, + other.components[i].value)) { + return (false); + } + } + return (true); +}; + +Identity.forHost = function (hostname) { + assert.string(hostname, 'hostname'); + return (new Identity({ + type: 'host', + hostname: hostname, + components: [ { name: 'cn', value: hostname } ] + })); +}; + +Identity.forUser = function (uid) { + assert.string(uid, 'uid'); + return (new Identity({ + type: 'user', + uid: uid, + components: [ { name: 'uid', value: uid } ] + })); +}; + +Identity.forEmail = function (email) { + assert.string(email, 'email'); + return (new Identity({ + type: 'email', + email: email, + components: [ { name: 'mail', value: email } ] + })); +}; + +Identity.parseDN = function (dn) { + assert.string(dn, 'dn'); + var parts = ['']; + var idx = 0; + var rem = dn; + while (rem.length > 0) { + var m; + /*JSSTYLED*/ + if ((m = /^,/.exec(rem)) !== null) { + parts[++idx] = ''; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^\\,/.exec(rem)) !== null) { + parts[idx] += ','; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^\\./.exec(rem)) !== null) { + parts[idx] += m[0]; + rem = rem.slice(m[0].length); + /*JSSTYLED*/ + } else if ((m = /^[^\\,]+/.exec(rem)) !== null) { + parts[idx] += m[0]; + rem = rem.slice(m[0].length); + } else { + throw (new Error('Failed to parse DN')); + } + } + var cmps = parts.map(function (c) { + c = c.trim(); + var eqPos = c.indexOf('='); + while (eqPos > 0 && c.charAt(eqPos - 1) === '\\') + eqPos = c.indexOf('=', eqPos + 1); + if (eqPos === -1) { + throw (new Error('Failed to parse DN')); + } + /*JSSTYLED*/ + var name = c.slice(0, eqPos).toLowerCase().replace(/\\=/g, '='); + var value = c.slice(eqPos + 1); + return ({ name: name, value: value }); + }); + return (new Identity({ components: cmps })); +}; + +Identity.fromArray = function (components) { + assert.arrayOfObject(components, 'components'); + components.forEach(function (cmp) { + assert.object(cmp, 'component'); + assert.string(cmp.name, 'component.name'); + if (!Buffer.isBuffer(cmp.value) && + !(typeof (cmp.value) === 'string')) { + throw (new Error('Invalid component value')); + } + }); + return (new Identity({ components: components })); +}; + +Identity.parseAsn1 = function (der, top) { + var components = []; + der.readSequence(top); + var end = der.offset + der.length; + while (der.offset < end) { + der.readSequence(asn1.Ber.Constructor | asn1.Ber.Set); + var after = der.offset + der.length; + der.readSequence(); + var oid = der.readOID(); + var type = der.peek(); + var value; + switch (type) { + case asn1.Ber.PrintableString: + case asn1.Ber.IA5String: + case asn1.Ber.OctetString: + case asn1.Ber.T61String: + value = der.readString(type); + break; + case asn1.Ber.Utf8String: + value = der.readString(type, true); + value = value.toString('utf8'); + break; + case asn1.Ber.CharacterString: + case asn1.Ber.BMPString: + value = der.readString(type, true); + value = value.toString('utf16le'); + break; + default: + throw (new Error('Unknown asn1 type ' + type)); + } + components.push({ oid: oid, asn1type: type, value: value }); + der._offset = after; + } + der._offset = end; + return (new Identity({ + components: components + })); +}; + +Identity.isIdentity = function (obj, ver) { + return (utils.isCompatible(obj, Identity, ver)); +}; + +/* + * API versions for Identity: + * [1,0] -- initial ver + */ +Identity.prototype._sshpkApiVersion = [1, 0]; + +Identity._oldVersionDetect = function (obj) { + return ([1, 0]); +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/index.js b/packages/字体精简工具/node_modules/sshpk/lib/index.js new file mode 100644 index 0000000..f76db79 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/index.js @@ -0,0 +1,40 @@ +// Copyright 2015 Joyent, Inc. + +var Key = require('./key'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var PrivateKey = require('./private-key'); +var Certificate = require('./certificate'); +var Identity = require('./identity'); +var errs = require('./errors'); + +module.exports = { + /* top-level classes */ + Key: Key, + parseKey: Key.parse, + Fingerprint: Fingerprint, + parseFingerprint: Fingerprint.parse, + Signature: Signature, + parseSignature: Signature.parse, + PrivateKey: PrivateKey, + parsePrivateKey: PrivateKey.parse, + generatePrivateKey: PrivateKey.generate, + Certificate: Certificate, + parseCertificate: Certificate.parse, + createSelfSignedCertificate: Certificate.createSelfSigned, + createCertificate: Certificate.create, + Identity: Identity, + identityFromDN: Identity.parseDN, + identityForHost: Identity.forHost, + identityForUser: Identity.forUser, + identityForEmail: Identity.forEmail, + identityFromArray: Identity.fromArray, + + /* errors */ + FingerprintFormatError: errs.FingerprintFormatError, + InvalidAlgorithmError: errs.InvalidAlgorithmError, + KeyParseError: errs.KeyParseError, + SignatureParseError: errs.SignatureParseError, + KeyEncryptedError: errs.KeyEncryptedError, + CertificateParseError: errs.CertificateParseError +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/key.js b/packages/字体精简工具/node_modules/sshpk/lib/key.js new file mode 100644 index 0000000..706f834 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/key.js @@ -0,0 +1,294 @@ +// Copyright 2018 Joyent, Inc. + +module.exports = Key; + +var assert = require('assert-plus'); +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var DiffieHellman = require('./dhe').DiffieHellman; +var errs = require('./errors'); +var utils = require('./utils'); +var PrivateKey = require('./private-key'); +var edCompat; + +try { + edCompat = require('./ed-compat'); +} catch (e) { + /* Just continue through, and bail out if we try to use it. */ +} + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; + +var formats = {}; +formats['auto'] = require('./formats/auto'); +formats['pem'] = require('./formats/pem'); +formats['pkcs1'] = require('./formats/pkcs1'); +formats['pkcs8'] = require('./formats/pkcs8'); +formats['rfc4253'] = require('./formats/rfc4253'); +formats['ssh'] = require('./formats/ssh'); +formats['ssh-private'] = require('./formats/ssh-private'); +formats['openssh'] = formats['ssh-private']; +formats['dnssec'] = require('./formats/dnssec'); +formats['putty'] = require('./formats/putty'); +formats['ppk'] = formats['putty']; + +function Key(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.parts, 'options.parts'); + assert.string(opts.type, 'options.type'); + assert.optionalString(opts.comment, 'options.comment'); + + var algInfo = algs.info[opts.type]; + if (typeof (algInfo) !== 'object') + throw (new InvalidAlgorithmError(opts.type)); + + var partLookup = {}; + for (var i = 0; i < opts.parts.length; ++i) { + var part = opts.parts[i]; + partLookup[part.name] = part; + } + + this.type = opts.type; + this.parts = opts.parts; + this.part = partLookup; + this.comment = undefined; + this.source = opts.source; + + /* for speeding up hashing/fingerprint operations */ + this._rfc4253Cache = opts._rfc4253Cache; + this._hashCache = {}; + + var sz; + this.curve = undefined; + if (this.type === 'ecdsa') { + var curve = this.part.curve.data.toString(); + this.curve = curve; + sz = algs.curves[curve].size; + } else if (this.type === 'ed25519' || this.type === 'curve25519') { + sz = 256; + this.curve = 'curve25519'; + } else { + var szPart = this.part[algInfo.sizePart]; + sz = szPart.data.length; + sz = sz * 8 - utils.countZeros(szPart.data); + } + this.size = sz; +} + +Key.formats = formats; + +Key.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'ssh'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + if (format === 'rfc4253') { + if (this._rfc4253Cache === undefined) + this._rfc4253Cache = formats['rfc4253'].write(this); + return (this._rfc4253Cache); + } + + return (formats[format].write(this, options)); +}; + +Key.prototype.toString = function (format, options) { + return (this.toBuffer(format, options).toString()); +}; + +Key.prototype.hash = function (algo, type) { + assert.string(algo, 'algorithm'); + assert.optionalString(type, 'type'); + if (type === undefined) + type = 'ssh'; + algo = algo.toLowerCase(); + if (algs.hashAlgs[algo] === undefined) + throw (new InvalidAlgorithmError(algo)); + + var cacheKey = algo + '||' + type; + if (this._hashCache[cacheKey]) + return (this._hashCache[cacheKey]); + + var buf; + if (type === 'ssh') { + buf = this.toBuffer('rfc4253'); + } else if (type === 'spki') { + buf = formats.pkcs8.pkcs8ToBuffer(this); + } else { + throw (new Error('Hash type ' + type + ' not supported')); + } + var hash = crypto.createHash(algo).update(buf).digest(); + this._hashCache[cacheKey] = hash; + return (hash); +}; + +Key.prototype.fingerprint = function (algo, type) { + if (algo === undefined) + algo = 'sha256'; + if (type === undefined) + type = 'ssh'; + assert.string(algo, 'algorithm'); + assert.string(type, 'type'); + var opts = { + type: 'key', + hash: this.hash(algo, type), + algorithm: algo, + hashType: type + }; + return (new Fingerprint(opts)); +}; + +Key.prototype.defaultHashAlgorithm = function () { + var hashAlgo = 'sha1'; + if (this.type === 'rsa') + hashAlgo = 'sha256'; + if (this.type === 'dsa' && this.size > 1024) + hashAlgo = 'sha256'; + if (this.type === 'ed25519') + hashAlgo = 'sha512'; + if (this.type === 'ecdsa') { + if (this.size <= 256) + hashAlgo = 'sha256'; + else if (this.size <= 384) + hashAlgo = 'sha384'; + else + hashAlgo = 'sha512'; + } + return (hashAlgo); +}; + +Key.prototype.createVerify = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Verifier(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldVerify = v.verify.bind(v); + var key = this.toBuffer('pkcs8'); + var curve = this.curve; + var self = this; + v.verify = function (signature, fmt) { + if (Signature.isSignature(signature, [2, 0])) { + if (signature.type !== self.type) + return (false); + if (signature.hashAlgorithm && + signature.hashAlgorithm !== hashAlgo) + return (false); + if (signature.curve && self.type === 'ecdsa' && + signature.curve !== curve) + return (false); + return (oldVerify(key, signature.toBuffer('asn1'))); + + } else if (typeof (signature) === 'string' || + Buffer.isBuffer(signature)) { + return (oldVerify(key, signature, fmt)); + + /* + * Avoid doing this on valid arguments, walking the prototype + * chain can be quite slow. + */ + } else if (Signature.isSignature(signature, [1, 0])) { + throw (new Error('signature was created by too old ' + + 'a version of sshpk and cannot be verified')); + + } else { + throw (new TypeError('signature must be a string, ' + + 'Buffer, or Signature object')); + } + }; + return (v); +}; + +Key.prototype.createDiffieHellman = function () { + if (this.type === 'rsa') + throw (new Error('RSA keys do not support Diffie-Hellman')); + + return (new DiffieHellman(this)); +}; +Key.prototype.createDH = Key.prototype.createDiffieHellman; + +Key.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + if (k instanceof PrivateKey) + k = k.toPublic(); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +Key.isKey = function (obj, ver) { + return (utils.isCompatible(obj, Key, ver)); +}; + +/* + * API versions for Key: + * [1,0] -- initial ver, may take Signature for createVerify or may not + * [1,1] -- added pkcs1, pkcs8 formats + * [1,2] -- added auto, ssh-private, openssh formats + * [1,3] -- added defaultHashAlgorithm + * [1,4] -- added ed support, createDH + * [1,5] -- first explicitly tagged version + * [1,6] -- changed ed25519 part names + * [1,7] -- spki hash types + */ +Key.prototype._sshpkApiVersion = [1, 7]; + +Key._oldVersionDetect = function (obj) { + assert.func(obj.toBuffer); + assert.func(obj.fingerprint); + if (obj.createDH) + return ([1, 4]); + if (obj.defaultHashAlgorithm) + return ([1, 3]); + if (obj.formats['auto']) + return ([1, 2]); + if (obj.formats['pkcs1']) + return ([1, 1]); + return ([1, 0]); +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/private-key.js b/packages/字体精简工具/node_modules/sshpk/lib/private-key.js new file mode 100644 index 0000000..5600838 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/private-key.js @@ -0,0 +1,246 @@ +// Copyright 2017 Joyent, Inc. + +module.exports = PrivateKey; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var Fingerprint = require('./fingerprint'); +var Signature = require('./signature'); +var errs = require('./errors'); +var util = require('util'); +var utils = require('./utils'); +var dhe = require('./dhe'); +var generateECDSA = dhe.generateECDSA; +var generateED25519 = dhe.generateED25519; +var edCompat = require('./ed-compat'); +var nacl = require('tweetnacl'); + +var Key = require('./key'); + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; +var KeyEncryptedError = errs.KeyEncryptedError; + +var formats = {}; +formats['auto'] = require('./formats/auto'); +formats['pem'] = require('./formats/pem'); +formats['pkcs1'] = require('./formats/pkcs1'); +formats['pkcs8'] = require('./formats/pkcs8'); +formats['rfc4253'] = require('./formats/rfc4253'); +formats['ssh-private'] = require('./formats/ssh-private'); +formats['openssh'] = formats['ssh-private']; +formats['ssh'] = formats['ssh-private']; +formats['dnssec'] = require('./formats/dnssec'); + +function PrivateKey(opts) { + assert.object(opts, 'options'); + Key.call(this, opts); + + this._pubCache = undefined; +} +util.inherits(PrivateKey, Key); + +PrivateKey.formats = formats; + +PrivateKey.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'pkcs1'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + return (formats[format].write(this, options)); +}; + +PrivateKey.prototype.hash = function (algo, type) { + return (this.toPublic().hash(algo, type)); +}; + +PrivateKey.prototype.fingerprint = function (algo, type) { + return (this.toPublic().fingerprint(algo, type)); +}; + +PrivateKey.prototype.toPublic = function () { + if (this._pubCache) + return (this._pubCache); + + var algInfo = algs.info[this.type]; + var pubParts = []; + for (var i = 0; i < algInfo.parts.length; ++i) { + var p = algInfo.parts[i]; + pubParts.push(this.part[p]); + } + + this._pubCache = new Key({ + type: this.type, + source: this, + parts: pubParts + }); + if (this.comment) + this._pubCache.comment = this.comment; + return (this._pubCache); +}; + +PrivateKey.prototype.derive = function (newType) { + assert.string(newType, 'type'); + var priv, pub, pair; + + if (this.type === 'ed25519' && newType === 'curve25519') { + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'curve25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } else if (this.type === 'curve25519' && newType === 'ed25519') { + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'ed25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } + throw (new Error('Key derivation not supported from ' + this.type + + ' to ' + newType)); +}; + +PrivateKey.prototype.createVerify = function (hashAlgo) { + return (this.toPublic().createVerify(hashAlgo)); +}; + +PrivateKey.prototype.createSign = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Signer(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldSign = v.sign.bind(v); + var key = this.toBuffer('pkcs1'); + var type = this.type; + var curve = this.curve; + v.sign = function () { + var sig = oldSign(key); + if (typeof (sig) === 'string') + sig = Buffer.from(sig, 'binary'); + sig = Signature.parse(sig, type, 'asn1'); + sig.hashAlgorithm = hashAlgo; + sig.curve = curve; + return (sig); + }; + return (v); +}; + +PrivateKey.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + assert.ok(k instanceof PrivateKey, 'key is not a private key'); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +PrivateKey.isPrivateKey = function (obj, ver) { + return (utils.isCompatible(obj, PrivateKey, ver)); +}; + +PrivateKey.generate = function (type, options) { + if (options === undefined) + options = {}; + assert.object(options, 'options'); + + switch (type) { + case 'ecdsa': + if (options.curve === undefined) + options.curve = 'nistp256'; + assert.string(options.curve, 'options.curve'); + return (generateECDSA(options.curve)); + case 'ed25519': + return (generateED25519()); + default: + throw (new Error('Key generation not supported with key ' + + 'type "' + type + '"')); + } +}; + +/* + * API versions for PrivateKey: + * [1,0] -- initial ver + * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats + * [1,2] -- added defaultHashAlgorithm + * [1,3] -- added derive, ed, createDH + * [1,4] -- first tagged version + * [1,5] -- changed ed25519 part names and format + * [1,6] -- type arguments for hash() and fingerprint() + */ +PrivateKey.prototype._sshpkApiVersion = [1, 6]; + +PrivateKey._oldVersionDetect = function (obj) { + assert.func(obj.toPublic); + assert.func(obj.createSign); + if (obj.derive) + return ([1, 3]); + if (obj.defaultHashAlgorithm) + return ([1, 2]); + if (obj.formats['auto']) + return ([1, 1]); + return ([1, 0]); +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/signature.js b/packages/字体精简工具/node_modules/sshpk/lib/signature.js new file mode 100644 index 0000000..aa8fdbb --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/signature.js @@ -0,0 +1,314 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = Signature; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var algs = require('./algs'); +var crypto = require('crypto'); +var errs = require('./errors'); +var utils = require('./utils'); +var asn1 = require('asn1'); +var SSHBuffer = require('./ssh-buffer'); + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var SignatureParseError = errs.SignatureParseError; + +function Signature(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.parts, 'options.parts'); + assert.string(opts.type, 'options.type'); + + var partLookup = {}; + for (var i = 0; i < opts.parts.length; ++i) { + var part = opts.parts[i]; + partLookup[part.name] = part; + } + + this.type = opts.type; + this.hashAlgorithm = opts.hashAlgo; + this.curve = opts.curve; + this.parts = opts.parts; + this.part = partLookup; +} + +Signature.prototype.toBuffer = function (format) { + if (format === undefined) + format = 'asn1'; + assert.string(format, 'format'); + + var buf; + var stype = 'ssh-' + this.type; + + switch (this.type) { + case 'rsa': + switch (this.hashAlgorithm) { + case 'sha256': + stype = 'rsa-sha2-256'; + break; + case 'sha512': + stype = 'rsa-sha2-512'; + break; + case 'sha1': + case undefined: + break; + default: + throw (new Error('SSH signature ' + + 'format does not support hash ' + + 'algorithm ' + this.hashAlgorithm)); + } + if (format === 'ssh') { + buf = new SSHBuffer({}); + buf.writeString(stype); + buf.writePart(this.part.sig); + return (buf.toBuffer()); + } else { + return (this.part.sig.data); + } + break; + + case 'ed25519': + if (format === 'ssh') { + buf = new SSHBuffer({}); + buf.writeString(stype); + buf.writePart(this.part.sig); + return (buf.toBuffer()); + } else { + return (this.part.sig.data); + } + break; + + case 'dsa': + case 'ecdsa': + var r, s; + if (format === 'asn1') { + var der = new asn1.BerWriter(); + der.startSequence(); + r = utils.mpNormalize(this.part.r.data); + s = utils.mpNormalize(this.part.s.data); + der.writeBuffer(r, asn1.Ber.Integer); + der.writeBuffer(s, asn1.Ber.Integer); + der.endSequence(); + return (der.buffer); + } else if (format === 'ssh' && this.type === 'dsa') { + buf = new SSHBuffer({}); + buf.writeString('ssh-dss'); + r = this.part.r.data; + if (r.length > 20 && r[0] === 0x00) + r = r.slice(1); + s = this.part.s.data; + if (s.length > 20 && s[0] === 0x00) + s = s.slice(1); + if ((this.hashAlgorithm && + this.hashAlgorithm !== 'sha1') || + r.length + s.length !== 40) { + throw (new Error('OpenSSH only supports ' + + 'DSA signatures with SHA1 hash')); + } + buf.writeBuffer(Buffer.concat([r, s])); + return (buf.toBuffer()); + } else if (format === 'ssh' && this.type === 'ecdsa') { + var inner = new SSHBuffer({}); + r = this.part.r.data; + inner.writeBuffer(r); + inner.writePart(this.part.s); + + buf = new SSHBuffer({}); + /* XXX: find a more proper way to do this? */ + var curve; + if (r[0] === 0x00) + r = r.slice(1); + var sz = r.length * 8; + if (sz === 256) + curve = 'nistp256'; + else if (sz === 384) + curve = 'nistp384'; + else if (sz === 528) + curve = 'nistp521'; + buf.writeString('ecdsa-sha2-' + curve); + buf.writeBuffer(inner.toBuffer()); + return (buf.toBuffer()); + } + throw (new Error('Invalid signature format')); + default: + throw (new Error('Invalid signature data')); + } +}; + +Signature.prototype.toString = function (format) { + assert.optionalString(format, 'format'); + return (this.toBuffer(format).toString('base64')); +}; + +Signature.parse = function (data, type, format) { + if (typeof (data) === 'string') + data = Buffer.from(data, 'base64'); + assert.buffer(data, 'data'); + assert.string(format, 'format'); + assert.string(type, 'type'); + + var opts = {}; + opts.type = type.toLowerCase(); + opts.parts = []; + + try { + assert.ok(data.length > 0, 'signature must not be empty'); + switch (opts.type) { + case 'rsa': + return (parseOneNum(data, type, format, opts)); + case 'ed25519': + return (parseOneNum(data, type, format, opts)); + + case 'dsa': + case 'ecdsa': + if (format === 'asn1') + return (parseDSAasn1(data, type, format, opts)); + else if (opts.type === 'dsa') + return (parseDSA(data, type, format, opts)); + else + return (parseECDSA(data, type, format, opts)); + + default: + throw (new InvalidAlgorithmError(type)); + } + + } catch (e) { + if (e instanceof InvalidAlgorithmError) + throw (e); + throw (new SignatureParseError(type, format, e)); + } +}; + +function parseOneNum(data, type, format, opts) { + if (format === 'ssh') { + try { + var buf = new SSHBuffer({buffer: data}); + var head = buf.readString(); + } catch (e) { + /* fall through */ + } + if (buf !== undefined) { + var msg = 'SSH signature does not match expected ' + + 'type (expected ' + type + ', got ' + head + ')'; + switch (head) { + case 'ssh-rsa': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha1'; + break; + case 'rsa-sha2-256': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha256'; + break; + case 'rsa-sha2-512': + assert.strictEqual(type, 'rsa', msg); + opts.hashAlgo = 'sha512'; + break; + case 'ssh-ed25519': + assert.strictEqual(type, 'ed25519', msg); + opts.hashAlgo = 'sha512'; + break; + default: + throw (new Error('Unknown SSH signature ' + + 'type: ' + head)); + } + var sig = buf.readPart(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + sig.name = 'sig'; + opts.parts.push(sig); + return (new Signature(opts)); + } + } + opts.parts.push({name: 'sig', data: data}); + return (new Signature(opts)); +} + +function parseDSAasn1(data, type, format, opts) { + var der = new asn1.BerReader(data); + der.readSequence(); + var r = der.readString(asn1.Ber.Integer, true); + var s = der.readString(asn1.Ber.Integer, true); + + opts.parts.push({name: 'r', data: utils.mpNormalize(r)}); + opts.parts.push({name: 's', data: utils.mpNormalize(s)}); + + return (new Signature(opts)); +} + +function parseDSA(data, type, format, opts) { + if (data.length != 40) { + var buf = new SSHBuffer({buffer: data}); + var d = buf.readBuffer(); + if (d.toString('ascii') === 'ssh-dss') + d = buf.readBuffer(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + assert.strictEqual(d.length, 40, 'invalid inner length'); + data = d; + } + opts.parts.push({name: 'r', data: data.slice(0, 20)}); + opts.parts.push({name: 's', data: data.slice(20, 40)}); + return (new Signature(opts)); +} + +function parseECDSA(data, type, format, opts) { + var buf = new SSHBuffer({buffer: data}); + + var r, s; + var inner = buf.readBuffer(); + var stype = inner.toString('ascii'); + if (stype.slice(0, 6) === 'ecdsa-') { + var parts = stype.split('-'); + assert.strictEqual(parts[0], 'ecdsa'); + assert.strictEqual(parts[1], 'sha2'); + opts.curve = parts[2]; + switch (opts.curve) { + case 'nistp256': + opts.hashAlgo = 'sha256'; + break; + case 'nistp384': + opts.hashAlgo = 'sha384'; + break; + case 'nistp521': + opts.hashAlgo = 'sha512'; + break; + default: + throw (new Error('Unsupported ECDSA curve: ' + + opts.curve)); + } + inner = buf.readBuffer(); + assert.ok(buf.atEnd(), 'extra trailing bytes on outer'); + buf = new SSHBuffer({buffer: inner}); + r = buf.readPart(); + } else { + r = {data: inner}; + } + + s = buf.readPart(); + assert.ok(buf.atEnd(), 'extra trailing bytes'); + + r.name = 'r'; + s.name = 's'; + + opts.parts.push(r); + opts.parts.push(s); + return (new Signature(opts)); +} + +Signature.isSignature = function (obj, ver) { + return (utils.isCompatible(obj, Signature, ver)); +}; + +/* + * API versions for Signature: + * [1,0] -- initial ver + * [2,0] -- support for rsa in full ssh format, compat with sshpk-agent + * hashAlgorithm property + * [2,1] -- first tagged version + */ +Signature.prototype._sshpkApiVersion = [2, 1]; + +Signature._oldVersionDetect = function (obj) { + assert.func(obj.toBuffer); + if (obj.hasOwnProperty('hashAlgorithm')) + return ([2, 0]); + return ([1, 0]); +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/ssh-buffer.js b/packages/字体精简工具/node_modules/sshpk/lib/ssh-buffer.js new file mode 100644 index 0000000..1dd286c --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/ssh-buffer.js @@ -0,0 +1,149 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = SSHBuffer; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; + +function SSHBuffer(opts) { + assert.object(opts, 'options'); + if (opts.buffer !== undefined) + assert.buffer(opts.buffer, 'options.buffer'); + + this._size = opts.buffer ? opts.buffer.length : 1024; + this._buffer = opts.buffer || Buffer.alloc(this._size); + this._offset = 0; +} + +SSHBuffer.prototype.toBuffer = function () { + return (this._buffer.slice(0, this._offset)); +}; + +SSHBuffer.prototype.atEnd = function () { + return (this._offset >= this._buffer.length); +}; + +SSHBuffer.prototype.remainder = function () { + return (this._buffer.slice(this._offset)); +}; + +SSHBuffer.prototype.skip = function (n) { + this._offset += n; +}; + +SSHBuffer.prototype.expand = function () { + this._size *= 2; + var buf = Buffer.alloc(this._size); + this._buffer.copy(buf, 0); + this._buffer = buf; +}; + +SSHBuffer.prototype.readPart = function () { + return ({data: this.readBuffer()}); +}; + +SSHBuffer.prototype.readBuffer = function () { + var len = this._buffer.readUInt32BE(this._offset); + this._offset += 4; + assert.ok(this._offset + len <= this._buffer.length, + 'length out of bounds at +0x' + this._offset.toString(16) + + ' (data truncated?)'); + var buf = this._buffer.slice(this._offset, this._offset + len); + this._offset += len; + return (buf); +}; + +SSHBuffer.prototype.readString = function () { + return (this.readBuffer().toString()); +}; + +SSHBuffer.prototype.readCString = function () { + var offset = this._offset; + while (offset < this._buffer.length && + this._buffer[offset] !== 0x00) + offset++; + assert.ok(offset < this._buffer.length, 'c string does not terminate'); + var str = this._buffer.slice(this._offset, offset).toString(); + this._offset = offset + 1; + return (str); +}; + +SSHBuffer.prototype.readInt = function () { + var v = this._buffer.readUInt32BE(this._offset); + this._offset += 4; + return (v); +}; + +SSHBuffer.prototype.readInt64 = function () { + assert.ok(this._offset + 8 < this._buffer.length, + 'buffer not long enough to read Int64'); + var v = this._buffer.slice(this._offset, this._offset + 8); + this._offset += 8; + return (v); +}; + +SSHBuffer.prototype.readChar = function () { + var v = this._buffer[this._offset++]; + return (v); +}; + +SSHBuffer.prototype.writeBuffer = function (buf) { + while (this._offset + 4 + buf.length > this._size) + this.expand(); + this._buffer.writeUInt32BE(buf.length, this._offset); + this._offset += 4; + buf.copy(this._buffer, this._offset); + this._offset += buf.length; +}; + +SSHBuffer.prototype.writeString = function (str) { + this.writeBuffer(Buffer.from(str, 'utf8')); +}; + +SSHBuffer.prototype.writeCString = function (str) { + while (this._offset + 1 + str.length > this._size) + this.expand(); + this._buffer.write(str, this._offset); + this._offset += str.length; + this._buffer[this._offset++] = 0; +}; + +SSHBuffer.prototype.writeInt = function (v) { + while (this._offset + 4 > this._size) + this.expand(); + this._buffer.writeUInt32BE(v, this._offset); + this._offset += 4; +}; + +SSHBuffer.prototype.writeInt64 = function (v) { + assert.buffer(v, 'value'); + if (v.length > 8) { + var lead = v.slice(0, v.length - 8); + for (var i = 0; i < lead.length; ++i) { + assert.strictEqual(lead[i], 0, + 'must fit in 64 bits of precision'); + } + v = v.slice(v.length - 8, v.length); + } + while (this._offset + 8 > this._size) + this.expand(); + v.copy(this._buffer, this._offset); + this._offset += 8; +}; + +SSHBuffer.prototype.writeChar = function (v) { + while (this._offset + 1 > this._size) + this.expand(); + this._buffer[this._offset++] = v; +}; + +SSHBuffer.prototype.writePart = function (p) { + this.writeBuffer(p.data); +}; + +SSHBuffer.prototype.write = function (buf) { + while (this._offset + buf.length > this._size) + this.expand(); + buf.copy(this._buffer, this._offset); + this._offset += buf.length; +}; diff --git a/packages/字体精简工具/node_modules/sshpk/lib/utils.js b/packages/字体精简工具/node_modules/sshpk/lib/utils.js new file mode 100644 index 0000000..6b83a32 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/lib/utils.js @@ -0,0 +1,404 @@ +// Copyright 2015 Joyent, Inc. + +module.exports = { + bufferSplit: bufferSplit, + addRSAMissing: addRSAMissing, + calculateDSAPublic: calculateDSAPublic, + calculateED25519Public: calculateED25519Public, + calculateX25519Public: calculateX25519Public, + mpNormalize: mpNormalize, + mpDenormalize: mpDenormalize, + ecNormalize: ecNormalize, + countZeros: countZeros, + assertCompatible: assertCompatible, + isCompatible: isCompatible, + opensslKeyDeriv: opensslKeyDeriv, + opensshCipherInfo: opensshCipherInfo, + publicFromPrivateECDSA: publicFromPrivateECDSA, + zeroPadToLength: zeroPadToLength, + writeBitString: writeBitString, + readBitString: readBitString, + pbkdf2: pbkdf2 +}; + +var assert = require('assert-plus'); +var Buffer = require('safer-buffer').Buffer; +var PrivateKey = require('./private-key'); +var Key = require('./key'); +var crypto = require('crypto'); +var algs = require('./algs'); +var asn1 = require('asn1'); + +var ec = require('ecc-jsbn/lib/ec'); +var jsbn = require('jsbn').BigInteger; +var nacl = require('tweetnacl'); + +var MAX_CLASS_DEPTH = 3; + +function isCompatible(obj, klass, needVer) { + if (obj === null || typeof (obj) !== 'object') + return (false); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return (true); + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + if (!proto || ++depth > MAX_CLASS_DEPTH) + return (false); + } + if (proto.constructor.name !== klass.name) + return (false); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + if (ver[0] != needVer[0] || ver[1] < needVer[1]) + return (false); + return (true); +} + +function assertCompatible(obj, klass, needVer, name) { + if (name === undefined) + name = 'object'; + assert.ok(obj, name + ' must not be null'); + assert.object(obj, name + ' must be an object'); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return; + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + assert.ok(proto && ++depth <= MAX_CLASS_DEPTH, + name + ' must be a ' + klass.name + ' instance'); + } + assert.strictEqual(proto.constructor.name, klass.name, + name + ' must be a ' + klass.name + ' instance'); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1], + name + ' must be compatible with ' + klass.name + ' klass ' + + 'version ' + needVer[0] + '.' + needVer[1]); +} + +var CIPHER_LEN = { + 'des-ede3-cbc': { key: 24, iv: 8 }, + 'aes-128-cbc': { key: 16, iv: 16 }, + 'aes-256-cbc': { key: 32, iv: 16 } +}; +var PKCS5_SALT_LEN = 8; + +function opensslKeyDeriv(cipher, salt, passphrase, count) { + assert.buffer(salt, 'salt'); + assert.buffer(passphrase, 'passphrase'); + assert.number(count, 'iteration count'); + + var clen = CIPHER_LEN[cipher]; + assert.object(clen, 'supported cipher'); + + salt = salt.slice(0, PKCS5_SALT_LEN); + + var D, D_prev, bufs; + var material = Buffer.alloc(0); + while (material.length < clen.key + clen.iv) { + bufs = []; + if (D_prev) + bufs.push(D_prev); + bufs.push(passphrase); + bufs.push(salt); + D = Buffer.concat(bufs); + for (var j = 0; j < count; ++j) + D = crypto.createHash('md5').update(D).digest(); + material = Buffer.concat([material, D]); + D_prev = D; + } + + return ({ + key: material.slice(0, clen.key), + iv: material.slice(clen.key, clen.key + clen.iv) + }); +} + +/* See: RFC2898 */ +function pbkdf2(hashAlg, salt, iterations, size, passphrase) { + var hkey = Buffer.alloc(salt.length + 4); + salt.copy(hkey); + + var gen = 0, ts = []; + var i = 1; + while (gen < size) { + var t = T(i++); + gen += t.length; + ts.push(t); + } + return (Buffer.concat(ts).slice(0, size)); + + function T(I) { + hkey.writeUInt32BE(I, hkey.length - 4); + + var hmac = crypto.createHmac(hashAlg, passphrase); + hmac.update(hkey); + + var Ti = hmac.digest(); + var Uc = Ti; + var c = 1; + while (c++ < iterations) { + hmac = crypto.createHmac(hashAlg, passphrase); + hmac.update(Uc); + Uc = hmac.digest(); + for (var x = 0; x < Ti.length; ++x) + Ti[x] ^= Uc[x]; + } + return (Ti); + } +} + +/* Count leading zero bits on a buffer */ +function countZeros(buf) { + var o = 0, obit = 8; + while (o < buf.length) { + var mask = (1 << obit); + if ((buf[o] & mask) === mask) + break; + obit--; + if (obit < 0) { + o++; + obit = 8; + } + } + return (o*8 + (8 - obit) - 1); +} + +function bufferSplit(buf, chr) { + assert.buffer(buf); + assert.string(chr); + + var parts = []; + var lastPart = 0; + var matches = 0; + for (var i = 0; i < buf.length; ++i) { + if (buf[i] === chr.charCodeAt(matches)) + ++matches; + else if (buf[i] === chr.charCodeAt(0)) + matches = 1; + else + matches = 0; + + if (matches >= chr.length) { + var newPart = i + 1; + parts.push(buf.slice(lastPart, newPart - matches)); + lastPart = newPart; + matches = 0; + } + } + if (lastPart <= buf.length) + parts.push(buf.slice(lastPart, buf.length)); + + return (parts); +} + +function ecNormalize(buf, addZero) { + assert.buffer(buf); + if (buf[0] === 0x00 && buf[1] === 0x04) { + if (addZero) + return (buf); + return (buf.slice(1)); + } else if (buf[0] === 0x04) { + if (!addZero) + return (buf); + } else { + while (buf[0] === 0x00) + buf = buf.slice(1); + if (buf[0] === 0x02 || buf[0] === 0x03) + throw (new Error('Compressed elliptic curve points ' + + 'are not supported')); + if (buf[0] !== 0x04) + throw (new Error('Not a valid elliptic curve point')); + if (!addZero) + return (buf); + } + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x0; + buf.copy(b, 1); + return (b); +} + +function readBitString(der, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var buf = der.readString(tag, true); + assert.strictEqual(buf[0], 0x00, 'bit strings with unused bits are ' + + 'not supported (0x' + buf[0].toString(16) + ')'); + return (buf.slice(1)); +} + +function writeBitString(der, buf, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + der.writeBuffer(b, tag); +} + +function mpNormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00) + buf = buf.slice(1); + if ((buf[0] & 0x80) === 0x80) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function mpDenormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00) + buf = buf.slice(1); + return (buf); +} + +function zeroPadToLength(buf, len) { + assert.buffer(buf); + assert.number(len); + while (buf.length > len) { + assert.equal(buf[0], 0x00); + buf = buf.slice(1); + } + while (buf.length < len) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function bigintToMpBuf(bigint) { + var buf = Buffer.from(bigint.toByteArray()); + buf = mpNormalize(buf); + return (buf); +} + +function calculateDSAPublic(g, p, x) { + assert.buffer(g); + assert.buffer(p); + assert.buffer(x); + g = new jsbn(g); + p = new jsbn(p); + x = new jsbn(x); + var y = g.modPow(x, p); + var ybuf = bigintToMpBuf(y); + return (ybuf); +} + +function calculateED25519Public(k) { + assert.buffer(k); + + var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function calculateX25519Public(k) { + assert.buffer(k); + + var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function addRSAMissing(key) { + assert.object(key); + assertCompatible(key, PrivateKey, [1, 1]); + + var d = new jsbn(key.part.d.data); + var buf; + + if (!key.part.dmodp) { + var p = new jsbn(key.part.p.data); + var dmodp = d.mod(p.subtract(1)); + + buf = bigintToMpBuf(dmodp); + key.part.dmodp = {name: 'dmodp', data: buf}; + key.parts.push(key.part.dmodp); + } + if (!key.part.dmodq) { + var q = new jsbn(key.part.q.data); + var dmodq = d.mod(q.subtract(1)); + + buf = bigintToMpBuf(dmodq); + key.part.dmodq = {name: 'dmodq', data: buf}; + key.parts.push(key.part.dmodq); + } +} + +function publicFromPrivateECDSA(curveName, priv) { + assert.string(curveName, 'curveName'); + assert.buffer(priv); + var params = algs.curves[curveName]; + var p = new jsbn(params.p); + var a = new jsbn(params.a); + var b = new jsbn(params.b); + var curve = new ec.ECCurveFp(p, a, b); + var G = curve.decodePointHex(params.G.toString('hex')); + + var d = new jsbn(mpNormalize(priv)); + var pub = G.multiply(d); + pub = Buffer.from(curve.encodePointHex(pub), 'hex'); + + var parts = []; + parts.push({name: 'curve', data: Buffer.from(curveName)}); + parts.push({name: 'Q', data: pub}); + + var key = new Key({type: 'ecdsa', curve: curve, parts: parts}); + return (key); +} + +function opensshCipherInfo(cipher) { + var inf = {}; + switch (cipher) { + case '3des-cbc': + inf.keySize = 24; + inf.blockSize = 8; + inf.opensslName = 'des-ede3-cbc'; + break; + case 'blowfish-cbc': + inf.keySize = 16; + inf.blockSize = 8; + inf.opensslName = 'bf-cbc'; + break; + case 'aes128-cbc': + case 'aes128-ctr': + case 'aes128-gcm@openssh.com': + inf.keySize = 16; + inf.blockSize = 16; + inf.opensslName = 'aes-128-' + cipher.slice(7, 10); + break; + case 'aes192-cbc': + case 'aes192-ctr': + case 'aes192-gcm@openssh.com': + inf.keySize = 24; + inf.blockSize = 16; + inf.opensslName = 'aes-192-' + cipher.slice(7, 10); + break; + case 'aes256-cbc': + case 'aes256-ctr': + case 'aes256-gcm@openssh.com': + inf.keySize = 32; + inf.blockSize = 16; + inf.opensslName = 'aes-256-' + cipher.slice(7, 10); + break; + default: + throw (new Error( + 'Unsupported openssl cipher "' + cipher + '"')); + } + return (inf); +} diff --git a/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-conv.1 b/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-conv.1 new file mode 100644 index 0000000..0887dce --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-conv.1 @@ -0,0 +1,135 @@ +.TH sshpk\-conv 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-conv \- convert between key formats +.SH SYNOPSYS +.PP +\fB\fCsshpk\-conv\fR \-t FORMAT [FILENAME] [OPTIONS...] +.PP +\fB\fCsshpk\-conv\fR \-i [FILENAME] [OPTIONS...] +.SH DESCRIPTION +.PP +Reads in a public or private key and converts it between different formats, +particularly formats used in the SSH protocol and the well\-known PEM PKCS#1/7 +formats. +.PP +In the second form, with the \fB\fC\-i\fR option given, identifies a key and prints to +stderr information about its nature, size and fingerprint. +.SH EXAMPLES +.PP +Assume the following SSH\-format public key in \fB\fCid_ecdsa.pub\fR: +.PP +.RS +.nf +ecdsa\-sha2\-nistp256 AAAAE2VjZHNhLXNoYTI...9M/4c4= user@host +.fi +.RE +.PP +Identify it with \fB\fC\-i\fR: +.PP +.RS +.nf +$ sshpk\-conv \-i id_ecdsa.pub +id_ecdsa: a 256 bit ECDSA public key +ECDSA curve: nistp256 +Comment: user@host +Fingerprint: + SHA256:vCNX7eUkdvqqW0m4PoxQAZRv+CM4P4fS8+CbliAvS4k + 81:ad:d5:57:e5:6f:7d:a2:93:79:56:af:d7:c0:38:51 +.fi +.RE +.PP +Convert it to \fB\fCpkcs8\fR format, for use with e.g. OpenSSL: +.PP +.RS +.nf +$ sshpk\-conv \-t pkcs8 id_ecdsa +\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAsA4R6N6AS3gzaPBeLjG2ObSgUsR +zOt+kWJoijLnw3ZMYUKmAx+lD0I5XUxdrPcs1vH5f3cn9TvRvO9L0z/hzg== +\-\-\-\-\-END PUBLIC KEY\-\-\-\-\- +.fi +.RE +.PP +Retrieve the public half of a private key: +.PP +.RS +.nf +$ openssl genrsa 2048 | sshpk\-conv \-t ssh \-c foo@bar +ssh\-rsa AAAAB3NzaC1yc2EAAA...koK7 foo@bar +.fi +.RE +.PP +Convert a private key to PKCS#1 (OpenSSL) format from a new\-style OpenSSH key +format (the \fB\fCssh\-keygen \-o\fR format): +.PP +.RS +.nf +$ ssh\-keygen \-o \-f foobar +\&... +$ sshpk\-conv \-p \-t pkcs1 foobar +\-\-\-\-\-BEGIN RSA PRIVATE KEY\-\-\-\-\- +MIIDpAIBAAKCAQEA6T/GYJndb1TRH3+NL.... +\-\-\-\-\-END RSA PRIVATE KEY\-\-\-\-\- +.fi +.RE +.SH OPTIONS +.TP +\fB\fC\-i, \-\-identify\fR +Instead of converting the key, output identifying information about it to +stderr, including its type, size and fingerprints. +.TP +\fB\fC\-p, \-\-private\fR +Treat the key as a private key instead of a public key (the default). If you +supply \fB\fCsshpk\-conv\fR with a private key and do not give this option, it will +extract only the public half of the key from it and work with that. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to take the key from instead of stdin. If a filename is supplied +as a positional argument, it is equivalent to using this option. +.TP +\fB\fC\-o PATH, \-\-out=PATH\fR +Output file name to use instead of stdout. +.PP +\fB\fC\-T FORMAT, \-\-informat=FORMAT\fR +.TP +\fB\fC\-t FORMAT, \-\-outformat=FORMAT\fR +Selects the input and output formats to be used (see FORMATS, below). +.TP +\fB\fC\-c TEXT, \-\-comment=TEXT\fR +Sets the key comment for the output file, if supported. +.SH FORMATS +.PP +Currently supported formats: +.TP +\fB\fCpem, pkcs1\fR +The standard PEM format used by older OpenSSH and most TLS libraries such as +OpenSSL. The classic \fB\fCid_rsa\fR file is usually in this format. It is an ASN.1 +encoded structure, base64\-encoded and placed between PEM headers. +.TP +\fB\fCssh\fR +The SSH public key text format (the format of an \fB\fCid_rsa.pub\fR file). A single +line, containing 3 space separated parts: the key type, key body and optional +key comment. +.TP +\fB\fCpkcs8\fR +A newer PEM format, usually used only for public keys by TLS libraries such +as OpenSSL. The ASN.1 structure is more generic than that of \fB\fCpkcs1\fR\&. +.TP +\fB\fCopenssh\fR +The new \fB\fCssh\-keygen \-o\fR format from OpenSSH. This can be mistaken for a PEM +encoding but is actually an OpenSSH internal format. +.TP +\fB\fCrfc4253\fR +The internal binary format of keys when sent over the wire in the SSH +protocol. This is also the format that the \fB\fCssh\-agent\fR uses in its protocol. +.SH SEE ALSO +.PP +.BR ssh-keygen (1), +.BR openssl (1) +.SH BUGS +.PP +Encrypted (password\-protected) keys are not supported. +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-sign.1 b/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-sign.1 new file mode 100644 index 0000000..749916b --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-sign.1 @@ -0,0 +1,81 @@ +.TH sshpk\-sign 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-sign \- sign data using an SSH key +.SH SYNOPSYS +.PP +\fB\fCsshpk\-sign\fR \-i KEYPATH [OPTION...] +.SH DESCRIPTION +.PP +Takes in arbitrary bytes, and signs them using an SSH private key. The key can +be of any type or format supported by the \fB\fCsshpk\fR library, including the +standard OpenSSH formats, as well as PEM PKCS#1 and PKCS#8. +.PP +The signature is printed out in Base64 encoding, unless the \fB\fC\-\-binary\fR or \fB\fC\-b\fR +option is given. +.SH EXAMPLES +.PP +Signing with default settings: +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa +MEUCIAMdLS/vXrrtWFepwe... +.fi +.RE +.PP +Signing in SSH (RFC 4253) format (rather than the default ASN.1): +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \-t ssh +AAAAFGVjZHNhLXNoYTIt... +.fi +.RE +.PP +Saving the binary signature to a file: +.PP +.RS +.nf +$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \\ + \-o signature.bin \-b +$ cat signature.bin | base64 +MEUCIAMdLS/vXrrtWFepwe... +.fi +.RE +.SH OPTIONS +.TP +\fB\fC\-v, \-\-verbose\fR +Print extra information about the key and signature to stderr when signing. +.TP +\fB\fC\-b, \-\-binary\fR +Don't base64\-encode the signature before outputting it. +.TP +\fB\fC\-i KEY, \-\-identity=KEY\fR +Select the key to be used for signing. \fB\fCKEY\fR must be a relative or absolute +filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR library +is supported, including OpenSSH formats and standard PEM PKCS. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to sign instead of stdin. +.TP +\fB\fC\-o PATH, \-\-out=PATH\fR +Output file to save signature in instead of stdout. +.TP +\fB\fC\-H HASH, \-\-hash=HASH\fR +Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR, +\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash +algorithms may be used (e.g. ED25519 keys can only use SHA\-512). +.TP +\fB\fC\-t FORMAT, \-\-format=FORMAT\fR +Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for +ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format +used with TLS and typically the standard in most non\-SSH libraries (e.g. +OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent. +.SH SEE ALSO +.PP +.BR sshpk-verify (1) +.SH BUGS +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-verify.1 b/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-verify.1 new file mode 100644 index 0000000..f79169d --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/man/man1/sshpk-verify.1 @@ -0,0 +1,68 @@ +.TH sshpk\-verify 1 "Jan 2016" sshpk "sshpk Commands" +.SH NAME +.PP +sshpk\-verify \- verify a signature on data using an SSH key +.SH SYNOPSYS +.PP +\fB\fCsshpk\-verify\fR \-i KEYPATH \-s SIGNATURE [OPTION...] +.SH DESCRIPTION +.PP +Takes in arbitrary bytes and a Base64\-encoded signature, and verifies that the +signature was produced by the private half of the given SSH public key. +.SH EXAMPLES +.PP +.RS +.nf +$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s MEUCIQCYp... +OK +$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s GARBAGE... +NOT OK +.fi +.RE +.SH EXIT STATUS +.TP +\fB\fC0\fR +Signature validates and matches the key. +.TP +\fB\fC1\fR +Signature is parseable and the correct length but does not match the key or +otherwise is invalid. +.TP +\fB\fC2\fR +The signature or key could not be parsed. +.TP +\fB\fC3\fR +Invalid commandline options were supplied. +.SH OPTIONS +.TP +\fB\fC\-v, \-\-verbose\fR +Print extra information about the key and signature to stderr when verifying. +.TP +\fB\fC\-i KEY, \-\-identity=KEY\fR +Select the key to be used for verification. \fB\fCKEY\fR must be a relative or +absolute filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR +library is supported, including OpenSSH formats and standard PEM PKCS. +.TP +\fB\fC\-s BASE64, \-\-signature=BASE64\fR +Supplies the base64\-encoded signature to be verified. +.TP +\fB\fC\-f PATH, \-\-file=PATH\fR +Input file to verify instead of stdin. +.TP +\fB\fC\-H HASH, \-\-hash=HASH\fR +Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR, +\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash +algorithms may be used (e.g. ED25519 keys can only use SHA\-512). +.TP +\fB\fC\-t FORMAT, \-\-format=FORMAT\fR +Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for +ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format +used with TLS and typically the standard in most non\-SSH libraries (e.g. +OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent. +.SH SEE ALSO +.PP +.BR sshpk-sign (1) +.SH BUGS +.PP +Report bugs at Github +\[la]https://github.com/arekinath/node-sshpk/issues\[ra] diff --git a/packages/字体精简工具/node_modules/sshpk/package.json b/packages/字体精简工具/node_modules/sshpk/package.json new file mode 100644 index 0000000..d6350d4 --- /dev/null +++ b/packages/字体精简工具/node_modules/sshpk/package.json @@ -0,0 +1,96 @@ +{ + "_from": "sshpk@^1.7.0", + "_id": "sshpk@1.16.1", + "_inBundle": false, + "_integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "_location": "/sshpk", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "sshpk@^1.7.0", + "name": "sshpk", + "escapedName": "sshpk", + "rawSpec": "^1.7.0", + "saveSpec": null, + "fetchSpec": "^1.7.0" + }, + "_requiredBy": [ + "/http-signature" + ], + "_resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", + "_shasum": "fb661c0bef29b39db40769ee39fa70093d6f6877", + "_spec": "sshpk@^1.7.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\http-signature", + "author": { + "name": "Joyent, Inc" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "bugs": { + "url": "https://github.com/arekinath/node-sshpk/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Dave Eddy", + "email": "dave@daveeddy.com" + }, + { + "name": "Mark Cavage", + "email": "mcavage@gmail.com" + }, + { + "name": "Alex Wilson", + "email": "alex@cooperi.net" + } + ], + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "deprecated": false, + "description": "A library for finding and using SSH public keys", + "devDependencies": { + "benchmark": "^1.0.0", + "sinon": "^1.17.2", + "tape": "^3.5.0", + "temp": "^0.8.2" + }, + "directories": { + "bin": "./bin", + "lib": "./lib", + "man": "./man/man1" + }, + "engines": { + "node": ">=0.10.0" + }, + "homepage": "https://github.com/arekinath/node-sshpk#readme", + "license": "MIT", + "main": "lib/index.js", + "man": [ + "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\sshpk\\man\\man1\\sshpk-conv.1", + "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\sshpk\\man\\man1\\sshpk-sign.1", + "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\sshpk\\man\\man1\\sshpk-verify.1" + ], + "name": "sshpk", + "optionalDependencies": {}, + "repository": { + "type": "git", + "url": "git+https://github.com/joyent/node-sshpk.git" + }, + "scripts": { + "test": "tape test/*.js" + }, + "version": "1.16.1" +} diff --git a/packages/字体精简工具/node_modules/stream-combiner/.npmignore b/packages/字体精简工具/node_modules/stream-combiner/.npmignore new file mode 100644 index 0000000..13abef4 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-combiner/.npmignore @@ -0,0 +1,3 @@ +node_modules +node_modules/* +npm_debug.log diff --git a/packages/字体精简工具/node_modules/stream-combiner/.travis.yml b/packages/字体精简工具/node_modules/stream-combiner/.travis.yml new file mode 100644 index 0000000..895dbd3 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-combiner/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 diff --git a/packages/字体精简工具/node_modules/stream-combiner/LICENSE b/packages/字体精简工具/node_modules/stream-combiner/LICENSE new file mode 100644 index 0000000..6d03581 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-combiner/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 'Dominic Tarr' + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/stream-combiner/README.md b/packages/字体精简工具/node_modules/stream-combiner/README.md new file mode 100644 index 0000000..9c1b52e --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-combiner/README.md @@ -0,0 +1,55 @@ +# stream-combiner + +[![npm version](https://img.shields.io/npm/v/stream-combiner.svg)](https://npmjs.org/package/stream-combiner) +[![Travis CI](https://travis-ci.org/dominictarr/stream-combiner.svg)](https://travis-ci.org/dominictarr/stream-combiner) + +## Combine (stream1,...,streamN) + +Turn a pipeline into a single stream. `Combine` returns a stream that writes to the first stream +and reads from the last stream. + +Listening for 'error' will recieve errors from all streams inside the pipe. + +```js +var Combine = require('stream-combiner') +var es = require('event-stream') + +Combine( // connect streams together with `pipe` + process.openStdin(), // open stdin + es.split(), // split stream to break on newlines + es.map(function (data, callback) { // turn this async function into a stream + var repr = util.inspect(JSON.parse(data)) // render it nicely + callback(null, repr) + }), + process.stdout // pipe it to stdout ! +) +``` + +Can also be called with an array: + +```js +var combinedStream = Combine([ + stream1, + stream2, +]); +``` + +Or to combine gulp plugins: + +```js +function coffeePipe() { + return Combine( + coffeescript(), + coffeelint.reporter('fail').on('error', function(){ + gutil.beep() + gulp.run('lint') + }) +} + +//usage: +gulp.src().pipe(coffeePipe()); +``` + +## License + +MIT diff --git a/packages/字体精简工具/node_modules/stream-combiner/index.js b/packages/字体精简工具/node_modules/stream-combiner/index.js new file mode 100644 index 0000000..e23374c --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-combiner/index.js @@ -0,0 +1,45 @@ +var duplexer = require('duplexer') +var through = require('through') + +module.exports = function () { + var streams + + if(arguments.length == 1 && Array.isArray(arguments[0])) { + streams = arguments[0] + } else { + streams = [].slice.call(arguments) + } + + if(streams.length == 0) + return through() + else if(streams.length == 1) + return streams[0] + + var first = streams[0] + , last = streams[streams.length - 1] + , thepipe = duplexer(first, last) + + //pipe all the streams together + + function recurse (streams) { + if(streams.length < 2) + return + streams[0].pipe(streams[1]) + recurse(streams.slice(1)) + } + + recurse(streams) + + function onerror () { + var args = [].slice.call(arguments) + args.unshift('error') + thepipe.emit.apply(thepipe, args) + } + + //es.duplex already reemits the error from the first and last stream. + //add a listener for the inner streams in the pipeline. + for(var i = 1; i < streams.length - 1; i ++) + streams[i].on('error', onerror) + + return thepipe +} diff --git a/packages/字体精简工具/node_modules/stream-combiner/package.json b/packages/字体精简工具/node_modules/stream-combiner/package.json new file mode 100644 index 0000000..c6fa566 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-combiner/package.json @@ -0,0 +1,55 @@ +{ + "_from": "stream-combiner@^0.2.1", + "_id": "stream-combiner@0.2.2", + "_inBundle": false, + "_integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "_location": "/stream-combiner", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "stream-combiner@^0.2.1", + "name": "stream-combiner", + "escapedName": "stream-combiner", + "rawSpec": "^0.2.1", + "saveSpec": null, + "fetchSpec": "^0.2.1" + }, + "_requiredBy": [ + "/fontmin" + ], + "_resolved": "https://registry.npm.taobao.org/stream-combiner/download/stream-combiner-0.2.2.tgz", + "_shasum": "aec8cbac177b56b6f4fa479ced8c1912cee52858", + "_spec": "stream-combiner@^0.2.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\fontmin", + "author": { + "name": "'Dominic Tarr'", + "email": "dominic.tarr@gmail.com", + "url": "http://dominictarr.com" + }, + "bugs": { + "url": "https://github.com/dominictarr/stream-combiner/issues" + }, + "bundleDependencies": false, + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + }, + "deprecated": false, + "description": "[![npm version](https://img.shields.io/npm/v/stream-combiner.svg)](https://npmjs.org/package/stream-combiner) [![Travis CI](https://travis-ci.org/dominictarr/stream-combiner.svg)](https://travis-ci.org/dominictarr/stream-combiner)", + "devDependencies": { + "event-stream": "~3.0.7", + "tape": "~2.3.0" + }, + "homepage": "https://github.com/dominictarr/stream-combiner", + "license": "MIT", + "name": "stream-combiner", + "repository": { + "type": "git", + "url": "git://github.com/dominictarr/stream-combiner.git" + }, + "scripts": { + "test": "set -e; for t in test/*.js; do node $t; done" + }, + "version": "0.2.2" +} diff --git a/packages/字体精简工具/node_modules/stream-combiner/test/index.js b/packages/字体精简工具/node_modules/stream-combiner/test/index.js new file mode 100644 index 0000000..97cd73e --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-combiner/test/index.js @@ -0,0 +1,65 @@ +var es = require('event-stream') +var combine = require('..') +var test = require('tape') + +test('do not duplicate errors', function (test) { + + var errors = 0; + var pipe = combine( + es.through(function(data) { + return this.emit('data', data); + }), + es.through(function(data) { + return this.emit('error', new Error(data)); + }) + ) + + pipe.on('error', function(err) { + errors++ + test.ok(errors, 'expected error count') + process.nextTick(function () { + return test.end(); + }) + }) + + return pipe.write('meh'); +}) + +test('3 pipe do not duplicate errors', function (test) { + + var errors = 0; + var pipe = combine( + es.through(function(data) { + return this.emit('data', data); + }), + es.through(function(data) { + return this.emit('error', new Error(data)); + }), + es.through() + ) + + pipe.on('error', function(err) { + errors++ + test.ok(errors, 'expected error count') + process.nextTick(function () { + return test.end(); + }) + }) + + return pipe.write('meh'); + +}) + +test('0 argument through stream', function (test) { + test.plan(3) + var pipe = combine() + , expected = [ 'beep', 'boop', 'robots' ] + + pipe.pipe(es.through(function(data) { + test.equal(data, expected.shift()) + })) + pipe.write('beep') + pipe.write('boop') + pipe.end('robots') +}) + diff --git a/packages/字体精简工具/node_modules/stream-shift/.travis.yml b/packages/字体精简工具/node_modules/stream-shift/.travis.yml new file mode 100644 index 0000000..ecd4193 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-shift/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.10" + - "0.12" + - "4" + - "6" diff --git a/packages/字体精简工具/node_modules/stream-shift/LICENSE b/packages/字体精简工具/node_modules/stream-shift/LICENSE new file mode 100644 index 0000000..bae9da7 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-shift/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/stream-shift/README.md b/packages/字体精简工具/node_modules/stream-shift/README.md new file mode 100644 index 0000000..d9cc2d9 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-shift/README.md @@ -0,0 +1,25 @@ +# stream-shift + +Returns the next buffer/object in a stream's readable queue + +``` +npm install stream-shift +``` + +[![build status](http://img.shields.io/travis/mafintosh/stream-shift.svg?style=flat)](http://travis-ci.org/mafintosh/stream-shift) + +## Usage + +``` js +var shift = require('stream-shift') + +console.log(shift(someStream)) // first item in its buffer +``` + +## Credit + +Thanks [@dignifiedquire](https://github.com/dignifiedquire) for making this work on node 6 + +## License + +MIT diff --git a/packages/字体精简工具/node_modules/stream-shift/index.js b/packages/字体精简工具/node_modules/stream-shift/index.js new file mode 100644 index 0000000..33cc4d7 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-shift/index.js @@ -0,0 +1,20 @@ +module.exports = shift + +function shift (stream) { + var rs = stream._readableState + if (!rs) return null + return (rs.objectMode || typeof stream._duplexState === 'number') ? stream.read() : stream.read(getStateLength(rs)) +} + +function getStateLength (state) { + if (state.buffer.length) { + // Since node 6.3.0 state.buffer is a BufferList not an array + if (state.buffer.head) { + return state.buffer.head.data.length + } + + return state.buffer[0].length + } + + return state.length +} diff --git a/packages/字体精简工具/node_modules/stream-shift/package.json b/packages/字体精简工具/node_modules/stream-shift/package.json new file mode 100644 index 0000000..7b45985 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-shift/package.json @@ -0,0 +1,53 @@ +{ + "_from": "stream-shift@^1.0.0", + "_id": "stream-shift@1.0.1", + "_inBundle": false, + "_integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", + "_location": "/stream-shift", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "stream-shift@^1.0.0", + "name": "stream-shift", + "escapedName": "stream-shift", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/duplexify" + ], + "_resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz", + "_shasum": "d7088281559ab2778424279b0877da3c392d5a3d", + "_spec": "stream-shift@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\duplexify", + "author": { + "name": "Mathias Buus", + "url": "@mafintosh" + }, + "bugs": { + "url": "https://github.com/mafintosh/stream-shift/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Returns the next buffer/object in a stream's readable queue", + "devDependencies": { + "standard": "^7.1.2", + "tape": "^4.6.0", + "through2": "^2.0.1" + }, + "homepage": "https://github.com/mafintosh/stream-shift", + "license": "MIT", + "main": "index.js", + "name": "stream-shift", + "repository": { + "type": "git", + "url": "git+https://github.com/mafintosh/stream-shift.git" + }, + "scripts": { + "test": "standard && tape test.js" + }, + "version": "1.0.1" +} diff --git a/packages/字体精简工具/node_modules/stream-shift/test.js b/packages/字体精简工具/node_modules/stream-shift/test.js new file mode 100644 index 0000000..c0222c3 --- /dev/null +++ b/packages/字体精简工具/node_modules/stream-shift/test.js @@ -0,0 +1,48 @@ +var tape = require('tape') +var through = require('through2') +var stream = require('stream') +var shift = require('./') + +tape('shifts next', function (t) { + var passthrough = through() + + passthrough.write('hello') + passthrough.write('world') + + t.same(shift(passthrough), Buffer('hello')) + t.same(shift(passthrough), Buffer('world')) + t.end() +}) + +tape('shifts next with core', function (t) { + var passthrough = stream.PassThrough() + + passthrough.write('hello') + passthrough.write('world') + + t.same(shift(passthrough), Buffer('hello')) + t.same(shift(passthrough), Buffer('world')) + t.end() +}) + +tape('shifts next with object mode', function (t) { + var passthrough = through({objectMode: true}) + + passthrough.write({hello: 1}) + passthrough.write({world: 1}) + + t.same(shift(passthrough), {hello: 1}) + t.same(shift(passthrough), {world: 1}) + t.end() +}) + +tape('shifts next with object mode with core', function (t) { + var passthrough = stream.PassThrough({objectMode: true}) + + passthrough.write({hello: 1}) + passthrough.write({world: 1}) + + t.same(shift(passthrough), {hello: 1}) + t.same(shift(passthrough), {world: 1}) + t.end() +}) diff --git a/packages/字体精简工具/node_modules/string-width/index.js b/packages/字体精简工具/node_modules/string-width/index.js new file mode 100644 index 0000000..b9bec62 --- /dev/null +++ b/packages/字体精简工具/node_modules/string-width/index.js @@ -0,0 +1,37 @@ +'use strict'; +var stripAnsi = require('strip-ansi'); +var codePointAt = require('code-point-at'); +var isFullwidthCodePoint = require('is-fullwidth-code-point'); + +// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345 +module.exports = function (str) { + if (typeof str !== 'string' || str.length === 0) { + return 0; + } + + var width = 0; + + str = stripAnsi(str); + + for (var i = 0; i < str.length; i++) { + var code = codePointAt(str, i); + + // ignore control characters + if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) { + continue; + } + + // surrogates + if (code >= 0x10000) { + i++; + } + + if (isFullwidthCodePoint(code)) { + width += 2; + } else { + width++; + } + } + + return width; +}; diff --git a/packages/字体精简工具/node_modules/string-width/license b/packages/字体精简工具/node_modules/string-width/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/string-width/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/string-width/package.json b/packages/字体精简工具/node_modules/string-width/package.json new file mode 100644 index 0000000..4ff7bda --- /dev/null +++ b/packages/字体精简工具/node_modules/string-width/package.json @@ -0,0 +1,92 @@ +{ + "_from": "string-width@^1.0.1", + "_id": "string-width@1.0.2", + "_inBundle": false, + "_integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "_location": "/string-width", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string-width@^1.0.1", + "name": "string-width", + "escapedName": "string-width", + "rawSpec": "^1.0.1", + "saveSpec": null, + "fetchSpec": "^1.0.1" + }, + "_requiredBy": [ + "/gauge", + "/gulp/cliui", + "/gulp/wrap-ansi", + "/gulp/yargs", + "/wide-align" + ], + "_resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz?cache=0&sync_timestamp=1618558823901&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-1.0.2.tgz", + "_shasum": "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3", + "_spec": "string-width@^1.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\gauge", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/string-width/issues" + }, + "bundleDependencies": false, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "deprecated": false, + "description": "Get the visual width of a string - the number of columns required to display it", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/string-width#readme", + "keywords": [ + "string", + "str", + "character", + "char", + "unicode", + "width", + "visual", + "column", + "columns", + "fullwidth", + "full-width", + "full", + "ansi", + "escape", + "codes", + "cli", + "command-line", + "terminal", + "console", + "cjk", + "chinese", + "japanese", + "korean", + "fixed-width" + ], + "license": "MIT", + "name": "string-width", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/string-width.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.0.2" +} diff --git a/packages/字体精简工具/node_modules/string-width/readme.md b/packages/字体精简工具/node_modules/string-width/readme.md new file mode 100644 index 0000000..1ab42c9 --- /dev/null +++ b/packages/字体精简工具/node_modules/string-width/readme.md @@ -0,0 +1,42 @@ +# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width) + +> Get the visual width of a string - the number of columns required to display it + +Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width. + +Useful to be able to measure the actual width of command-line output. + + +## Install + +``` +$ npm install --save string-width +``` + + +## Usage + +```js +const stringWidth = require('string-width'); + +stringWidth('古'); +//=> 2 + +stringWidth('\u001b[1m古\u001b[22m'); +//=> 2 + +stringWidth('a'); +//=> 1 +``` + + +## Related + +- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module +- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string +- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/string_decoder/.travis.yml b/packages/字体精简工具/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000..3347a72 --- /dev/null +++ b/packages/字体精简工具/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/packages/字体精简工具/node_modules/string_decoder/LICENSE b/packages/字体精简工具/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000..778edb2 --- /dev/null +++ b/packages/字体精简工具/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + diff --git a/packages/字体精简工具/node_modules/string_decoder/README.md b/packages/字体精简工具/node_modules/string_decoder/README.md new file mode 100644 index 0000000..5fd5831 --- /dev/null +++ b/packages/字体精简工具/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/packages/字体精简工具/node_modules/string_decoder/lib/string_decoder.js b/packages/字体精简工具/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000..2e89e63 --- /dev/null +++ b/packages/字体精简工具/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/string_decoder/package.json b/packages/字体精简工具/node_modules/string_decoder/package.json new file mode 100644 index 0000000..b63e4ca --- /dev/null +++ b/packages/字体精简工具/node_modules/string_decoder/package.json @@ -0,0 +1,59 @@ +{ + "_from": "string_decoder@~1.1.1", + "_id": "string_decoder@1.1.1", + "_inBundle": false, + "_integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "_location": "/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~1.1.1", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~1.1.1", + "saveSpec": null, + "fetchSpec": "~1.1.1" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.nlark.com/string_decoder/download/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_spec": "string_decoder@~1.1.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/packages/字体精简工具/node_modules/strip-ansi/index.js b/packages/字体精简工具/node_modules/strip-ansi/index.js new file mode 100644 index 0000000..099480f --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-ansi/index.js @@ -0,0 +1,6 @@ +'use strict'; +var ansiRegex = require('ansi-regex')(); + +module.exports = function (str) { + return typeof str === 'string' ? str.replace(ansiRegex, '') : str; +}; diff --git a/packages/字体精简工具/node_modules/strip-ansi/license b/packages/字体精简工具/node_modules/strip-ansi/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-ansi/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/strip-ansi/package.json b/packages/字体精简工具/node_modules/strip-ansi/package.json new file mode 100644 index 0000000..c5596f6 --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-ansi/package.json @@ -0,0 +1,104 @@ +{ + "_from": "strip-ansi@^3.0.1", + "_id": "strip-ansi@3.0.1", + "_inBundle": false, + "_integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "_location": "/strip-ansi", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "strip-ansi@^3.0.1", + "name": "strip-ansi", + "escapedName": "strip-ansi", + "rawSpec": "^3.0.1", + "saveSpec": null, + "fetchSpec": "^3.0.1" + }, + "_requiredBy": [ + "/gauge", + "/gulp/cliui", + "/gulp/wrap-ansi", + "/string-width" + ], + "_resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1618553320591&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz", + "_shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", + "_spec": "strip-ansi@^3.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\gauge", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/chalk/strip-ansi/issues" + }, + "bundleDependencies": false, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "deprecated": false, + "description": "Strip ANSI escape codes", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/chalk/strip-ansi#readme", + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "maintainers": [ + { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + { + "name": "Joshua Boy Nicolai Appelman", + "email": "joshua@jbna.nl", + "url": "jbna.nl" + }, + { + "name": "JD Ballard", + "email": "i.am.qix@gmail.com", + "url": "github.com/qix-" + } + ], + "name": "strip-ansi", + "repository": { + "type": "git", + "url": "git+https://github.com/chalk/strip-ansi.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "3.0.1" +} diff --git a/packages/字体精简工具/node_modules/strip-ansi/readme.md b/packages/字体精简工具/node_modules/strip-ansi/readme.md new file mode 100644 index 0000000..cb7d9ff --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-ansi/readme.md @@ -0,0 +1,33 @@ +# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) + +> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) + + +## Install + +``` +$ npm install --save strip-ansi +``` + + +## Usage + +```js +var stripAnsi = require('strip-ansi'); + +stripAnsi('\u001b[4mcake\u001b[0m'); +//=> 'cake' +``` + + +## Related + +- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module +- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes +- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/strip-bom/index.js b/packages/字体精简工具/node_modules/strip-bom/index.js new file mode 100644 index 0000000..5695c5c --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-bom/index.js @@ -0,0 +1,17 @@ +'use strict'; +var isUtf8 = require('is-utf8'); + +module.exports = function (x) { + // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string + // conversion translates it to FEFF (UTF-16 BOM) + if (typeof x === 'string' && x.charCodeAt(0) === 0xFEFF) { + return x.slice(1); + } + + if (Buffer.isBuffer(x) && isUtf8(x) && + x[0] === 0xEF && x[1] === 0xBB && x[2] === 0xBF) { + return x.slice(3); + } + + return x; +}; diff --git a/packages/字体精简工具/node_modules/strip-bom/license b/packages/字体精简工具/node_modules/strip-bom/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-bom/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/strip-bom/package.json b/packages/字体精简工具/node_modules/strip-bom/package.json new file mode 100644 index 0000000..40c52ec --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-bom/package.json @@ -0,0 +1,74 @@ +{ + "_from": "strip-bom@^2.0.0", + "_id": "strip-bom@2.0.0", + "_inBundle": false, + "_integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "_location": "/strip-bom", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "strip-bom@^2.0.0", + "name": "strip-bom", + "escapedName": "strip-bom", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/load-json-file" + ], + "_resolved": "https://registry.nlark.com/strip-bom/download/strip-bom-2.0.0.tgz", + "_shasum": "6219a85616520491f35788bdbf1447a99c7e6b0e", + "_spec": "strip-bom@^2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\load-json-file", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/strip-bom/issues" + }, + "bundleDependencies": false, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "deprecated": false, + "description": "Strip UTF-8 byte order mark (BOM) from a string/buffer", + "devDependencies": { + "mocha": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/strip-bom#readme", + "keywords": [ + "bom", + "strip", + "byte", + "mark", + "unicode", + "utf8", + "utf-8", + "remove", + "delete", + "trim", + "text", + "buffer", + "string" + ], + "license": "MIT", + "name": "strip-bom", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/strip-bom.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "2.0.0" +} diff --git a/packages/字体精简工具/node_modules/strip-bom/readme.md b/packages/字体精简工具/node_modules/strip-bom/readme.md new file mode 100644 index 0000000..8ecf258 --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-bom/readme.md @@ -0,0 +1,39 @@ +# strip-bom [![Build Status](https://travis-ci.org/sindresorhus/strip-bom.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-bom) + +> Strip UTF-8 [byte order mark](http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8) (BOM) from a string/buffer + +From Wikipedia: + +> The Unicode Standard permits the BOM in UTF-8, but does not require nor recommend its use. Byte order has no meaning in UTF-8. + + +## Install + +``` +$ npm install --save strip-bom +``` + + +## Usage + +```js +var fs = require('fs'); +var stripBom = require('strip-bom'); + +stripBom('\uFEFFunicorn'); +//=> 'unicorn' + +stripBom(fs.readFileSync('unicorn.txt')); +//=> 'unicorn' +``` + + +## Related + +- [strip-bom-cli](https://github.com/sindresorhus/strip-bom-cli) - CLI for this module +- [strip-bom-stream](https://github.com/sindresorhus/strip-bom-stream) - Stream version of this module + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/strip-indent/cli.js b/packages/字体精简工具/node_modules/strip-indent/cli.js new file mode 100644 index 0000000..bcd5f8d --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-indent/cli.js @@ -0,0 +1,49 @@ +#!/usr/bin/env node +'use strict'; +var fs = require('fs'); +var stdin = require('get-stdin'); +var pkg = require('./package.json'); +var stripIndent = require('./'); +var argv = process.argv.slice(2); +var input = argv[0]; + +function help() { + console.log([ + '', + ' ' + pkg.description, + '', + ' Usage', + ' strip-indent ', + ' echo | strip-indent', + '', + ' Example', + ' echo \'\\tunicorn\\n\\t\\tcake\' | strip-indent', + ' unicorn', + ' \tcake' + ].join('\n')); +} + +function init(data) { + console.log(stripIndent(data)); +} + +if (argv.indexOf('--help') !== -1) { + help(); + return; +} + +if (argv.indexOf('--version') !== -1) { + console.log(pkg.version); + return; +} + +if (process.stdin.isTTY) { + if (!input) { + help(); + return; + } + + init(fs.readFileSync(input, 'utf8')); +} else { + stdin(init); +} diff --git a/packages/字体精简工具/node_modules/strip-indent/index.js b/packages/字体精简工具/node_modules/strip-indent/index.js new file mode 100644 index 0000000..8f8f4f4 --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-indent/index.js @@ -0,0 +1,16 @@ +'use strict'; +module.exports = function (str) { + var match = str.match(/^[ \t]*(?=\S)/gm); + + if (!match) { + return str; + } + + var indent = Math.min.apply(Math, match.map(function (el) { + return el.length; + })); + + var re = new RegExp('^[ \\t]{' + indent + '}', 'gm'); + + return indent > 0 ? str.replace(re, '') : str; +}; diff --git a/packages/字体精简工具/node_modules/strip-indent/license b/packages/字体精简工具/node_modules/strip-indent/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-indent/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/index.js b/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/index.js new file mode 100644 index 0000000..0f1aeb3 --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/index.js @@ -0,0 +1,49 @@ +'use strict'; + +module.exports = function (cb) { + var stdin = process.stdin; + var ret = ''; + + if (stdin.isTTY) { + setImmediate(cb, ''); + return; + } + + stdin.setEncoding('utf8'); + + stdin.on('readable', function () { + var chunk; + + while (chunk = stdin.read()) { + ret += chunk; + } + }); + + stdin.on('end', function () { + cb(ret); + }); +}; + +module.exports.buffer = function (cb) { + var stdin = process.stdin; + var ret = []; + var len = 0; + + if (stdin.isTTY) { + setImmediate(cb, new Buffer('')); + return; + } + + stdin.on('readable', function () { + var chunk; + + while (chunk = stdin.read()) { + ret.push(chunk); + len += chunk.length; + } + }); + + stdin.on('end', function () { + cb(Buffer.concat(ret, len)); + }); +}; diff --git a/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/package.json b/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/package.json new file mode 100644 index 0000000..c9f37eb --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/package.json @@ -0,0 +1,67 @@ +{ + "_from": "get-stdin@^4.0.1", + "_id": "get-stdin@4.0.1", + "_inBundle": false, + "_integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "_location": "/strip-indent/get-stdin", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "get-stdin@^4.0.1", + "name": "get-stdin", + "escapedName": "get-stdin", + "rawSpec": "^4.0.1", + "saveSpec": null, + "fetchSpec": "^4.0.1" + }, + "_requiredBy": [ + "/strip-indent" + ], + "_resolved": "https://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz?cache=0&sync_timestamp=1618557624027&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stdin%2Fdownload%2Fget-stdin-4.0.1.tgz", + "_shasum": "b968c6b0a04384324902e8bf1a5df32579a450fe", + "_spec": "get-stdin@^4.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\strip-indent", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/get-stdin/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Easier stdin", + "devDependencies": { + "ava": "0.0.4", + "buffer-equal": "0.0.1" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/get-stdin#readme", + "keywords": [ + "std", + "stdin", + "stdio", + "concat", + "buffer", + "stream", + "process", + "stream" + ], + "license": "MIT", + "name": "get-stdin", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/get-stdin.git" + }, + "scripts": { + "test": "node test.js && node test-buffer.js && echo unicorns | node test-real.js" + }, + "version": "4.0.1" +} diff --git a/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/readme.md b/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/readme.md new file mode 100644 index 0000000..bc1d32a --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-indent/node_modules/get-stdin/readme.md @@ -0,0 +1,44 @@ +# get-stdin [![Build Status](https://travis-ci.org/sindresorhus/get-stdin.svg?branch=master)](https://travis-ci.org/sindresorhus/get-stdin) + +> Easier stdin + + +## Install + +```sh +$ npm install --save get-stdin +``` + + +## Usage + +```js +// example.js +var stdin = require('get-stdin'); + +stdin(function (data) { + console.log(data); + //=> unicorns +}); +``` + +```sh +$ echo unicorns | node example.js +unicorns +``` + + +## API + +### stdin(callback) + +Get `stdin` as a string. + +### stdin.buffer(callback) + +Get `stdin` as a buffer. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/strip-indent/package.json b/packages/字体精简工具/node_modules/strip-indent/package.json new file mode 100644 index 0000000..4634034 --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-indent/package.json @@ -0,0 +1,78 @@ +{ + "_from": "strip-indent@^1.0.1", + "_id": "strip-indent@1.0.1", + "_inBundle": false, + "_integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "_location": "/strip-indent", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "strip-indent@^1.0.1", + "name": "strip-indent", + "escapedName": "strip-indent", + "rawSpec": "^1.0.1", + "saveSpec": null, + "fetchSpec": "^1.0.1" + }, + "_requiredBy": [ + "/redent" + ], + "_resolved": "https://registry.nlark.com/strip-indent/download/strip-indent-1.0.1.tgz", + "_shasum": "0c7962a6adefa7bbd4ac366460a638552ae1a0a2", + "_spec": "strip-indent@^1.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\redent", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "bin": { + "strip-indent": "cli.js" + }, + "bugs": { + "url": "https://github.com/sindresorhus/strip-indent/issues" + }, + "bundleDependencies": false, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "deprecated": false, + "description": "Strip leading whitespace from every line in a string", + "devDependencies": { + "mocha": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js", + "cli.js" + ], + "homepage": "https://github.com/sindresorhus/strip-indent#readme", + "keywords": [ + "cli", + "bin", + "browser", + "strip", + "normalize", + "remove", + "indent", + "indentation", + "whitespace", + "space", + "tab", + "string", + "str" + ], + "license": "MIT", + "name": "strip-indent", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/strip-indent.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "1.0.1" +} diff --git a/packages/字体精简工具/node_modules/strip-indent/readme.md b/packages/字体精简工具/node_modules/strip-indent/readme.md new file mode 100644 index 0000000..d622f03 --- /dev/null +++ b/packages/字体精简工具/node_modules/strip-indent/readme.md @@ -0,0 +1,61 @@ +# strip-indent [![Build Status](https://travis-ci.org/sindresorhus/strip-indent.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-indent) + +> Strip leading whitespace from every line in a string + +The line with the least number of leading whitespace, ignoring empty lines, determines the number to remove. + +Useful for removing redundant indentation. + + +## Install + +```sh +$ npm install --save strip-indent +``` + + +## Usage + +```js +var str = '\tunicorn\n\t\tcake'; +/* + unicorn + cake +*/ + +stripIndent('\tunicorn\n\t\tcake'); +/* +unicorn + cake +*/ +``` + + +## CLI + +```sh +$ npm install --global strip-indent +``` + +```sh +$ strip-indent --help + + Usage + strip-indent + echo | strip-indent + + Example + echo '\tunicorn\n\t\tcake' | strip-indent + unicorn + cake +``` + + +## Related + +- [indent-string](https://github.com/sindresorhus/indent-string) - Indent each line in a string + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/tar/LICENSE b/packages/字体精简工具/node_modules/tar/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/字体精简工具/node_modules/tar/README.md b/packages/字体精简工具/node_modules/tar/README.md new file mode 100644 index 0000000..034e486 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/README.md @@ -0,0 +1,954 @@ +# node-tar + +[![Build Status](https://travis-ci.org/npm/node-tar.svg?branch=master)](https://travis-ci.org/npm/node-tar) + +[Fast](./benchmarks) and full-featured Tar for Node.js + +The API is designed to mimic the behavior of `tar(1)` on unix systems. +If you are familiar with how tar works, most of this will hopefully be +straightforward for you. If not, then hopefully this module can teach +you useful unix skills that may come in handy someday :) + +## Background + +A "tar file" or "tarball" is an archive of file system entries +(directories, files, links, etc.) The name comes from "tape archive". +If you run `man tar` on almost any Unix command line, you'll learn +quite a bit about what it can do, and its history. + +Tar has 5 main top-level commands: + +* `c` Create an archive +* `r` Replace entries within an archive +* `u` Update entries within an archive (ie, replace if they're newer) +* `t` List out the contents of an archive +* `x` Extract an archive to disk + +The other flags and options modify how this top level function works. + +## High-Level API + +These 5 functions are the high-level API. All of them have a +single-character name (for unix nerds familiar with `tar(1)`) as well +as a long name (for everyone else). + +All the high-level functions take the following arguments, all three +of which are optional and may be omitted. + +1. `options` - An optional object specifying various options +2. `paths` - An array of paths to add or extract +3. `callback` - Called when the command is completed, if async. (If + sync or no file specified, providing a callback throws a + `TypeError`.) + +If the command is sync (ie, if `options.sync=true`), then the +callback is not allowed, since the action will be completed immediately. + +If a `file` argument is specified, and the command is async, then a +`Promise` is returned. In this case, if async, a callback may be +provided which is called when the command is completed. + +If a `file` option is not specified, then a stream is returned. For +`create`, this is a readable stream of the generated archive. For +`list` and `extract` this is a writable stream that an archive should +be written into. If a file is not specified, then a callback is not +allowed, because you're already getting a stream to work with. + +`replace` and `update` only work on existing archives, and so require +a `file` argument. + +Sync commands without a file argument return a stream that acts on its +input immediately in the same tick. For readable streams, this means +that all of the data is immediately available by calling +`stream.read()`. For writable streams, it will be acted upon as soon +as it is provided, but this can be at any time. + +### Warnings + +Some things cause tar to emit a warning, but should usually not cause +the entire operation to fail. There are three ways to handle +warnings: + +1. **Ignore them** (default) Invalid entries won't be put in the + archive, and invalid entries won't be unpacked. This is usually + fine, but can hide failures that you might care about. +2. **Notice them** Add an `onwarn` function to the options, or listen + to the `'warn'` event on any tar stream. The function will get + called as `onwarn(message, data)`. Handle as appropriate. +3. **Explode them.** Set `strict: true` in the options object, and + `warn` messages will be emitted as `'error'` events instead. If + there's no `error` handler, this causes the program to crash. If + used with a promise-returning/callback-taking method, then it'll + send the error to the promise/callback. + +### Examples + +The API mimics the `tar(1)` command line functionality, with aliases +for more human-readable option and function names. The goal is that +if you know how to use `tar(1)` in Unix, then you know how to use +`require('tar')` in JavaScript. + +To replicate `tar czf my-tarball.tgz files and folders`, you'd do: + +```js +tar.c( + { + gzip: , + file: 'my-tarball.tgz' + }, + ['some', 'files', 'and', 'folders'] +).then(_ => { .. tarball has been created .. }) +``` + +To replicate `tar cz files and folders > my-tarball.tgz`, you'd do: + +```js +tar.c( // or tar.create + { + gzip: + }, + ['some', 'files', 'and', 'folders'] +).pipe(fs.createWriteStream('my-tarball.tgz')) +``` + +To replicate `tar xf my-tarball.tgz` you'd do: + +```js +tar.x( // or tar.extract( + { + file: 'my-tarball.tgz' + } +).then(_=> { .. tarball has been dumped in cwd .. }) +``` + +To replicate `cat my-tarball.tgz | tar x -C some-dir --strip=1`: + +```js +fs.createReadStream('my-tarball.tgz').pipe( + tar.x({ + strip: 1, + C: 'some-dir' // alias for cwd:'some-dir', also ok + }) +) +``` + +To replicate `tar tf my-tarball.tgz`, do this: + +```js +tar.t({ + file: 'my-tarball.tgz', + onentry: entry => { .. do whatever with it .. } +}) +``` + +To replicate `cat my-tarball.tgz | tar t` do: + +```js +fs.createReadStream('my-tarball.tgz') + .pipe(tar.t()) + .on('entry', entry => { .. do whatever with it .. }) +``` + +To do anything synchronous, add `sync: true` to the options. Note +that sync functions don't take a callback and don't return a promise. +When the function returns, it's already done. Sync methods without a +file argument return a sync stream, which flushes immediately. But, +of course, it still won't be done until you `.end()` it. + +To filter entries, add `filter: ` to the options. +Tar-creating methods call the filter with `filter(path, stat)`. +Tar-reading methods (including extraction) call the filter with +`filter(path, entry)`. The filter is called in the `this`-context of +the `Pack` or `Unpack` stream object. + +The arguments list to `tar t` and `tar x` specify a list of filenames +to extract or list, so they're equivalent to a filter that tests if +the file is in the list. + +For those who _aren't_ fans of tar's single-character command names: + +``` +tar.c === tar.create +tar.r === tar.replace (appends to archive, file is required) +tar.u === tar.update (appends if newer, file is required) +tar.x === tar.extract +tar.t === tar.list +``` + +Keep reading for all the command descriptions and options, as well as +the low-level API that they are built on. + +### tar.c(options, fileList, callback) [alias: tar.create] + +Create a tarball archive. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Write the tarball archive to the specified filename. If this + is specified, then the callback will be fired when the file has been + written, and a promise will be returned that resolves when the file + is written. If a filename is not specified, then a Readable Stream + will be returned which will emit the file data. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. If this is set, + and a file is not provided, then the resulting stream will already + have the data ready to `read` or `emit('data')` as soon as you + request it. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `mode` The mode to set on the created file archive +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + + +The following options are mostly internal, but can be modified in some +advanced use cases, such as re-using caches between runs. + +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `readdirCache` A Map object that caches calls to `readdir`. +- `jobs` A number specifying how many concurrent jobs to run. + Defaults to 4. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. + +### tar.x(options, fileList, callback) [alias: tar.extract] + +Extract a tarball archive. + +The `fileList` is an array of paths to extract from the tarball. If +no paths are provided, then all the entries are extracted. + +If the archive is gzipped, then tar will detect this and unzip it. + +Note that all directories that are created will be forced to be +writable, readable, and listable by their owner, to avoid cases where +a directory prevents extraction of child entries by virtue of its +mode. + +Most extraction errors will cause a `warn` event to be emitted. If +the `cwd` is missing, or not a directory, then the extraction will +fail completely. + +The following options are supported: + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. If provided, this must exist and must be a + directory. [Alias: `C`] +- `file` The archive file to extract. If not specified, then a + Writable stream is returned where the archive data should be + written. [Alias: `f`] +- `sync` Create files and directories synchronously. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being unpacked. Return `true` to unpack the entry from the + archive, or `false` to skip it. +- `newer` Set to true to keep the existing file on disk if it's newer + than the file in the archive. [Alias: `keep-newer`, + `keep-newer-files`] +- `keep` Do not overwrite existing files. In particular, if a file + appears more than once in an archive, later copies will not + overwrite earlier copies. [Alias: `k`, `keep-existing`] +- `preservePaths` Allow absolute paths, paths containing `..`, and + extracting through symbolic links. By default, `/` is stripped from + absolute paths, `..` paths are not extracted, and any file whose + location would be modified by a symbolic link is not extracted. + [Alias: `P`] +- `unlink` Unlink files before creating them. Without this option, + tar overwrites existing files, which preserves existing hardlinks. + With this option, existing hardlinks will be broken, as will any + symlink that would affect the location of an extracted file. [Alias: + `U`] +- `strip` Remove the specified number of leading path elements. + Pathnames with fewer elements will be silently skipped. Note that + the pathname is edited after applying the filter, but before + security checks. [Alias: `strip-components`, `stripComponents`] +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `preserveOwner` If true, tar will set the `uid` and `gid` of + extracted entries to the `uid` and `gid` fields in the archive. + This defaults to true when run as root, and false otherwise. If + false, then files and directories will be set with the owner and + group of the user running the process. This is similar to `-p` in + `tar(1)`, but ACLs and other system-specific data is never unpacked + in this implementation, and modes are set by default already. + [Alias: `p`] +- `uid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified user id, regardless of the `uid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `gid` option. +- `gid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified group id, regardless of the `gid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `uid` option. +- `noMtime` Set to true to omit writing `mtime` value for extracted + entries. [Alias: `m`, `no-mtime`] +- `transform` Provide a function that takes an `entry` object, and + returns a stream, or any falsey value. If a stream is provided, + then that stream's data will be written instead of the contents of + the archive entry. If a falsey value is provided, then the entry is + written to disk as normal. (To exclude items from extraction, use + the `filter` option described above.) +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. + +The following options are mostly internal, but can be modified in some +advanced use cases, such as re-using caches between runs. + +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `umask` Filter the modes of entries like `process.umask()`. +- `dmode` Default mode for directories +- `fmode` Default mode for files +- `dirCache` A Map object of which directories exist. +- `maxMetaEntrySize` The maximum size of meta entries that is + supported. Defaults to 1 MB. + +Note that using an asynchronous stream type with the `transform` +option will cause undefined behavior in sync extractions. +[MiniPass](http://npm.im/minipass)-based streams are designed for this +use case. + +### tar.t(options, fileList, callback) [alias: tar.list] + +List the contents of a tarball archive. + +The `fileList` is an array of paths to list from the tarball. If +no paths are provided, then all the entries are listed. + +If the archive is gzipped, then tar will detect this and unzip it. + +Returns an event emitter that emits `entry` events with +`tar.ReadEntry` objects. However, they don't emit `'data'` or `'end'` +events. (If you want to get actual readable entries, use the +`tar.Parse` class instead.) + +The following options are supported: + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. [Alias: `C`] +- `file` The archive file to list. If not specified, then a + Writable stream is returned where the archive data should be + written. [Alias: `f`] +- `sync` Read the specified file synchronously. (This has no effect + when a file option isn't specified, because entries are emitted as + fast as they are parsed from the stream anyway.) +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being listed. Return `true` to emit the entry from the + archive, or `false` to skip it. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. This is important for when both `file` and + `sync` are set, because it will be called synchronously. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noResume` By default, `entry` streams are resumed immediately after + the call to `onentry`. Set `noResume: true` to suppress this + behavior. Note that by opting into this, the stream will never + complete until the entry data is consumed. + +### tar.u(options, fileList, callback) [alias: tar.update] + +Add files to an archive if they are newer than the entry already in +the tarball archive. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Required. Write the tarball archive to the specified + filename. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for adding entries to the + archive. Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + +### tar.r(options, fileList, callback) [alias: tar.replace] + +Add files to an existing archive. Because later entries override +earlier entries, this effectively replaces any existing entries. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Required. Write the tarball archive to the specified + filename. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for adding entries to the + archive. Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + + +## Low-Level API + +### class tar.Pack + +A readable tar stream. + +Has all the standard readable stream interface stuff. `'data'` and +`'end'` events, `read()` method, `pause()` and `resume()`, etc. + +#### constructor(options) + +The following options are supported: + +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `readdirCache` A Map object that caches calls to `readdir`. +- `jobs` A number specifying how many concurrent jobs to run. + Defaults to 4. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + +#### add(path) + +Adds an entry to the archive. Returns the Pack stream. + +#### write(path) + +Adds an entry to the archive. Returns true if flushed. + +#### end() + +Finishes the archive. + +### class tar.Pack.Sync + +Synchronous version of `tar.Pack`. + +### class tar.Unpack + +A writable stream that unpacks a tar archive onto the file system. + +All the normal writable stream stuff is supported. `write()` and +`end()` methods, `'drain'` events, etc. + +Note that all directories that are created will be forced to be +writable, readable, and listable by their owner, to avoid cases where +a directory prevents extraction of child entries by virtue of its +mode. + +`'close'` is emitted when it's done writing stuff to the file system. + +Most unpack errors will cause a `warn` event to be emitted. If the +`cwd` is missing, or not a directory, then an error will be emitted. + +#### constructor(options) + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. If provided, this must exist and must be a + directory. +- `filter` A function that gets called with `(path, entry)` for each + entry being unpacked. Return `true` to unpack the entry from the + archive, or `false` to skip it. +- `newer` Set to true to keep the existing file on disk if it's newer + than the file in the archive. +- `keep` Do not overwrite existing files. In particular, if a file + appears more than once in an archive, later copies will not + overwrite earlier copies. +- `preservePaths` Allow absolute paths, paths containing `..`, and + extracting through symbolic links. By default, `/` is stripped from + absolute paths, `..` paths are not extracted, and any file whose + location would be modified by a symbolic link is not extracted. +- `unlink` Unlink files before creating them. Without this option, + tar overwrites existing files, which preserves existing hardlinks. + With this option, existing hardlinks will be broken, as will any + symlink that would affect the location of an extracted file. +- `strip` Remove the specified number of leading path elements. + Pathnames with fewer elements will be silently skipped. Note that + the pathname is edited after applying the filter, but before + security checks. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `umask` Filter the modes of entries like `process.umask()`. +- `dmode` Default mode for directories +- `fmode` Default mode for files +- `dirCache` A Map object of which directories exist. +- `maxMetaEntrySize` The maximum size of meta entries that is + supported. Defaults to 1 MB. +- `preserveOwner` If true, tar will set the `uid` and `gid` of + extracted entries to the `uid` and `gid` fields in the archive. + This defaults to true when run as root, and false otherwise. If + false, then files and directories will be set with the owner and + group of the user running the process. This is similar to `-p` in + `tar(1)`, but ACLs and other system-specific data is never unpacked + in this implementation, and modes are set by default already. +- `win32` True if on a windows platform. Causes behavior where + filenames containing `<|>?` chars are converted to + windows-compatible values while being unpacked. +- `uid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified user id, regardless of the `uid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `gid` option. +- `gid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified group id, regardless of the `gid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `uid` option. +- `noMtime` Set to true to omit writing `mtime` value for extracted + entries. +- `transform` Provide a function that takes an `entry` object, and + returns a stream, or any falsey value. If a stream is provided, + then that stream's data will be written instead of the contents of + the archive entry. If a falsey value is provided, then the entry is + written to disk as normal. (To exclude items from extraction, use + the `filter` option described above.) +- `strict` Treat warnings as crash-worthy errors. Default false. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. + +### class tar.Unpack.Sync + +Synchronous version of `tar.Unpack`. + +Note that using an asynchronous stream type with the `transform` +option will cause undefined behavior in sync unpack streams. +[MiniPass](http://npm.im/minipass)-based streams are designed for this +use case. + +### class tar.Parse + +A writable stream that parses a tar archive stream. All the standard +writable stream stuff is supported. + +If the archive is gzipped, then tar will detect this and unzip it. + +Emits `'entry'` events with `tar.ReadEntry` objects, which are +themselves readable streams that you can pipe wherever. + +Each `entry` will not emit until the one before it is flushed through, +so make sure to either consume the data (with `on('data', ...)` or +`.pipe(...)`) or throw it away with `.resume()` to keep the stream +flowing. + +#### constructor(options) + +Returns an event emitter that emits `entry` events with +`tar.ReadEntry` objects. + +The following options are supported: + +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being listed. Return `true` to emit the entry from the + archive, or `false` to skip it. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. + +#### abort(message, error) + +Stop all parsing activities. This is called when there are zlib +errors. It also emits a warning with the message and error provided. + +### class tar.ReadEntry extends [MiniPass](http://npm.im/minipass) + +A representation of an entry that is being read out of a tar archive. + +It has the following fields: + +- `extended` The extended metadata object provided to the constructor. +- `globalExtended` The global extended metadata object provided to the + constructor. +- `remain` The number of bytes remaining to be written into the + stream. +- `blockRemain` The number of 512-byte blocks remaining to be written + into the stream. +- `ignore` Whether this entry should be ignored. +- `meta` True if this represents metadata about the next entry, false + if it represents a filesystem object. +- All the fields from the header, extended header, and global extended + header are added to the ReadEntry object. So it has `path`, `type`, + `size, `mode`, and so on. + +#### constructor(header, extended, globalExtended) + +Create a new ReadEntry object with the specified header, extended +header, and global extended header values. + +### class tar.WriteEntry extends [MiniPass](http://npm.im/minipass) + +A representation of an entry that is being written from the file +system into a tar archive. + +Emits data for the Header, and for the Pax Extended Header if one is +required, as well as any body data. + +Creating a WriteEntry for a directory does not also create +WriteEntry objects for all of the directory contents. + +It has the following fields: + +- `path` The path field that will be written to the archive. By + default, this is also the path from the cwd to the file system + object. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `myuid` If supported, the uid of the user running the current + process. +- `myuser` The `env.USER` string if set, or `''`. Set as the entry + `uname` field if the file's `uid` matches `this.myuid`. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 1 MB. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `absolute` The absolute path to the entry on the filesystem. By + default, this is `path.resolve(this.cwd, this.path)`, but it can be + overridden explicitly. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `win32` True if on a windows platform. Causes behavior where paths + replace `\` with `/` and filenames containing the windows-compatible + forms of `<|>?:` characters are converted to actual `<|>?:` characters + in the archive. +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + + +#### constructor(path, options) + +`path` is the path of the entry as it is written in the archive. + +The following options are supported: + +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 1 MB. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `absolute` The absolute path to the entry on the filesystem. By + default, this is `path.resolve(this.cwd, this.path)`, but it can be + overridden explicitly. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `win32` True if on a windows platform. Causes behavior where paths + replace `\` with `/`. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. +- `umask` Set to restrict the modes on the entries in the archive, + somewhat like how umask works on file creation. Defaults to + `process.umask()` on unix systems, or `0o22` on Windows. + +#### warn(message, data) + +If strict, emit an error with the provided message. + +Othewise, emit a `'warn'` event with the provided message and data. + +### class tar.WriteEntry.Sync + +Synchronous version of tar.WriteEntry + +### class tar.WriteEntry.Tar + +A version of tar.WriteEntry that gets its data from a tar.ReadEntry +instead of from the filesystem. + +#### constructor(readEntry, options) + +`readEntry` is the entry being read out of another archive. + +The following options are supported: + +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary other + time-based operations. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `onwarn` A function that will get called with `(message, data)` for + any warnings encountered. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + +### class tar.Header + +A class for reading and writing header blocks. + +It has the following fields: + +- `nullBlock` True if decoding a block which is entirely composed of + `0x00` null bytes. (Useful because tar files are terminated by + at least 2 null blocks.) +- `cksumValid` True if the checksum in the header is valid, false + otherwise. +- `needPax` True if the values, as encoded, will require a Pax + extended header. +- `path` The path of the entry. +- `mode` The 4 lowest-order octal digits of the file mode. That is, + read/write/execute permissions for world, group, and owner, and the + setuid, setgid, and sticky bits. +- `uid` Numeric user id of the file owner +- `gid` Numeric group id of the file owner +- `size` Size of the file in bytes +- `mtime` Modified time of the file +- `cksum` The checksum of the header. This is generated by adding all + the bytes of the header block, treating the checksum field itself as + all ascii space characters (that is, `0x20`). +- `type` The human-readable name of the type of entry this represents, + or the alphanumeric key if unknown. +- `typeKey` The alphanumeric key for the type of entry this header + represents. +- `linkpath` The target of Link and SymbolicLink entries. +- `uname` Human-readable user name of the file owner +- `gname` Human-readable group name of the file owner +- `devmaj` The major portion of the device number. Always `0` for + files, directories, and links. +- `devmin` The minor portion of the device number. Always `0` for + files, directories, and links. +- `atime` File access time. +- `ctime` File change time. + +#### constructor(data, [offset=0]) + +`data` is optional. It is either a Buffer that should be interpreted +as a tar Header starting at the specified offset and continuing for +512 bytes, or a data object of keys and values to set on the header +object, and eventually encode as a tar Header. + +#### decode(block, offset) + +Decode the provided buffer starting at the specified offset. + +Buffer length must be greater than 512 bytes. + +#### set(data) + +Set the fields in the data object. + +#### encode(buffer, offset) + +Encode the header fields into the buffer at the specified offset. + +Returns `this.needPax` to indicate whether a Pax Extended Header is +required to properly encode the specified data. + +### class tar.Pax + +An object representing a set of key-value pairs in an Pax extended +header entry. + +It has the following fields. Where the same name is used, they have +the same semantics as the tar.Header field of the same name. + +- `global` True if this represents a global extended header, or false + if it is for a single entry. +- `atime` +- `charset` +- `comment` +- `ctime` +- `gid` +- `gname` +- `linkpath` +- `mtime` +- `path` +- `size` +- `uid` +- `uname` +- `dev` +- `ino` +- `nlink` + +#### constructor(object, global) + +Set the fields set in the object. `global` is a boolean that defaults +to false. + +#### encode() + +Return a Buffer containing the header and body for the Pax extended +header entry, or `null` if there is nothing to encode. + +#### encodeBody() + +Return a string representing the body of the pax extended header +entry. + +#### encodeField(fieldName) + +Return a string representing the key/value encoding for the specified +fieldName, or `''` if the field is unset. + +### tar.Pax.parse(string, extended, global) + +Return a new Pax object created by parsing the contents of the string +provided. + +If the `extended` object is set, then also add the fields from that +object. (This is necessary because multiple metadata entries can +occur in sequence.) + +### tar.types + +A translation table for the `type` field in tar headers. + +#### tar.types.name.get(code) + +Get the human-readable name for a given alphanumeric code. + +#### tar.types.code.get(name) + +Get the alphanumeric code for a given human-readable name. diff --git a/packages/字体精简工具/node_modules/tar/index.js b/packages/字体精简工具/node_modules/tar/index.js new file mode 100644 index 0000000..c9ae06e --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/index.js @@ -0,0 +1,18 @@ +'use strict' + +// high-level commands +exports.c = exports.create = require('./lib/create.js') +exports.r = exports.replace = require('./lib/replace.js') +exports.t = exports.list = require('./lib/list.js') +exports.u = exports.update = require('./lib/update.js') +exports.x = exports.extract = require('./lib/extract.js') + +// classes +exports.Pack = require('./lib/pack.js') +exports.Unpack = require('./lib/unpack.js') +exports.Parse = require('./lib/parse.js') +exports.ReadEntry = require('./lib/read-entry.js') +exports.WriteEntry = require('./lib/write-entry.js') +exports.Header = require('./lib/header.js') +exports.Pax = require('./lib/pax.js') +exports.types = require('./lib/types.js') diff --git a/packages/字体精简工具/node_modules/tar/lib/buffer.js b/packages/字体精简工具/node_modules/tar/lib/buffer.js new file mode 100644 index 0000000..7876d5b --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/buffer.js @@ -0,0 +1,11 @@ +'use strict' + +// Buffer in node 4.x < 4.5.0 doesn't have working Buffer.from +// or Buffer.alloc, and Buffer in node 10 deprecated the ctor. +// .M, this is fine .\^/M.. +let B = Buffer +/* istanbul ignore next */ +if (!B.alloc) { + B = require('safe-buffer').Buffer +} +module.exports = B diff --git a/packages/字体精简工具/node_modules/tar/lib/create.js b/packages/字体精简工具/node_modules/tar/lib/create.js new file mode 100644 index 0000000..a37aa52 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/create.js @@ -0,0 +1,105 @@ +'use strict' + +// tar -c +const hlo = require('./high-level-opt.js') + +const Pack = require('./pack.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const t = require('./list.js') +const path = require('path') + +const c = module.exports = (opt_, files, cb) => { + if (typeof files === 'function') + cb = files + + if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + return opt.file && opt.sync ? createFileSync(opt, files) + : opt.file ? createFile(opt, files, cb) + : opt.sync ? createSync(opt, files) + : create(opt, files) +} + +const createFileSync = (opt, files) => { + const p = new Pack.Sync(opt) + const stream = new fsm.WriteStreamSync(opt.file, { + mode: opt.mode || 0o666 + }) + p.pipe(stream) + addFilesSync(p, files) +} + +const createFile = (opt, files, cb) => { + const p = new Pack(opt) + const stream = new fsm.WriteStream(opt.file, { + mode: opt.mode || 0o666 + }) + p.pipe(stream) + + const promise = new Promise((res, rej) => { + stream.on('error', rej) + stream.on('close', res) + p.on('error', rej) + }) + + addFilesAsync(p, files) + + return cb ? promise.then(cb, cb) : promise +} + +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') + t({ + file: path.resolve(p.cwd, file.substr(1)), + sync: true, + noResume: true, + onentry: entry => p.add(entry) + }) + else + p.add(file) + }) + p.end() +} + +const addFilesAsync = (p, files) => { + while (files.length) { + const file = files.shift() + if (file.charAt(0) === '@') + return t({ + file: path.resolve(p.cwd, file.substr(1)), + noResume: true, + onentry: entry => p.add(entry) + }).then(_ => addFilesAsync(p, files)) + else + p.add(file) + } + p.end() +} + +const createSync = (opt, files) => { + const p = new Pack.Sync(opt) + addFilesSync(p, files) + return p +} + +const create = (opt, files) => { + const p = new Pack(opt) + addFilesAsync(p, files) + return p +} diff --git a/packages/字体精简工具/node_modules/tar/lib/extract.js b/packages/字体精简工具/node_modules/tar/lib/extract.js new file mode 100644 index 0000000..cbb458a --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/extract.js @@ -0,0 +1,112 @@ +'use strict' + +// tar -x +const hlo = require('./high-level-opt.js') +const Unpack = require('./unpack.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') + +const x = module.exports = (opt_, files, cb) => { + if (typeof opt_ === 'function') + cb = opt_, files = null, opt_ = {} + else if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (typeof files === 'function') + cb = files, files = null + + if (!files) + files = [] + else + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + if (files.length) + filesFilter(opt, files) + + return opt.file && opt.sync ? extractFileSync(opt) + : opt.file ? extractFile(opt, cb) + : opt.sync ? extractSync(opt) + : extract(opt) +} + +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true])) + const filter = opt.filter + + const mapHas = (file, r) => { + const root = r || path.parse(file).root || '.' + const ret = file === root ? false + : map.has(file) ? map.get(file) + : mapHas(path.dirname(file), root) + + map.set(file, ret) + return ret + } + + opt.filter = filter + ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, '')) + : file => mapHas(file.replace(/\/+$/, '')) +} + +const extractFileSync = opt => { + const u = new Unpack.Sync(opt) + + const file = opt.file + let threw = true + let fd + const stat = fs.statSync(file) + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + const readSize = opt.maxReadSize || 16*1024*1024 + const stream = new fsm.ReadStreamSync(file, { + readSize: readSize, + size: stat.size + }) + stream.pipe(u) +} + +const extractFile = (opt, cb) => { + const u = new Unpack(opt) + const readSize = opt.maxReadSize || 16*1024*1024 + + const file = opt.file + const p = new Promise((resolve, reject) => { + u.on('error', reject) + u.on('close', resolve) + + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + fs.stat(file, (er, stat) => { + if (er) + reject(er) + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size + }) + stream.on('error', reject) + stream.pipe(u) + } + }) + }) + return cb ? p.then(cb, cb) : p +} + +const extractSync = opt => { + return new Unpack.Sync(opt) +} + +const extract = opt => { + return new Unpack(opt) +} diff --git a/packages/字体精简工具/node_modules/tar/lib/header.js b/packages/字体精简工具/node_modules/tar/lib/header.js new file mode 100644 index 0000000..d29c3b9 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/header.js @@ -0,0 +1,289 @@ +'use strict' +// parse a 512-byte header block to a data object, or vice-versa +// encode returns `true` if a pax extended header is needed, because +// the data could not be faithfully encoded in a simple header. +// (Also, check header.needPax to see if it needs a pax header.) + +const Buffer = require('./buffer.js') +const types = require('./types.js') +const pathModule = require('path').posix +const large = require('./large-numbers.js') + +const SLURP = Symbol('slurp') +const TYPE = Symbol('type') + +class Header { + constructor (data, off, ex, gex) { + this.cksumValid = false + this.needPax = false + this.nullBlock = false + + this.block = null + this.path = null + this.mode = null + this.uid = null + this.gid = null + this.size = null + this.mtime = null + this.cksum = null + this[TYPE] = '0' + this.linkpath = null + this.uname = null + this.gname = null + this.devmaj = 0 + this.devmin = 0 + this.atime = null + this.ctime = null + + if (Buffer.isBuffer(data)) + this.decode(data, off || 0, ex, gex) + else if (data) + this.set(data) + } + + decode (buf, off, ex, gex) { + if (!off) + off = 0 + + if (!buf || !(buf.length >= off + 512)) + throw new Error('need 512 bytes for header') + + this.path = decString(buf, off, 100) + this.mode = decNumber(buf, off + 100, 8) + this.uid = decNumber(buf, off + 108, 8) + this.gid = decNumber(buf, off + 116, 8) + this.size = decNumber(buf, off + 124, 12) + this.mtime = decDate(buf, off + 136, 12) + this.cksum = decNumber(buf, off + 148, 12) + + // if we have extended or global extended headers, apply them now + // See https://github.com/npm/node-tar/pull/187 + this[SLURP](ex) + this[SLURP](gex, true) + + // old tar versions marked dirs as a file with a trailing / + this[TYPE] = decString(buf, off + 156, 1) + if (this[TYPE] === '') + this[TYPE] = '0' + if (this[TYPE] === '0' && this.path.substr(-1) === '/') + this[TYPE] = '5' + + // tar implementations sometimes incorrectly put the stat(dir).size + // as the size in the tarball, even though Directory entries are + // not able to have any body at all. In the very rare chance that + // it actually DOES have a body, we weren't going to do anything with + // it anyway, and it'll just be a warning about an invalid header. + if (this[TYPE] === '5') + this.size = 0 + + this.linkpath = decString(buf, off + 157, 100) + if (buf.slice(off + 257, off + 265).toString() === 'ustar\u000000') { + this.uname = decString(buf, off + 265, 32) + this.gname = decString(buf, off + 297, 32) + this.devmaj = decNumber(buf, off + 329, 8) + this.devmin = decNumber(buf, off + 337, 8) + if (buf[off + 475] !== 0) { + // definitely a prefix, definitely >130 chars. + const prefix = decString(buf, off + 345, 155) + this.path = prefix + '/' + this.path + } else { + const prefix = decString(buf, off + 345, 130) + if (prefix) + this.path = prefix + '/' + this.path + this.atime = decDate(buf, off + 476, 12) + this.ctime = decDate(buf, off + 488, 12) + } + } + + let sum = 8 * 0x20 + for (let i = off; i < off + 148; i++) { + sum += buf[i] + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i] + } + this.cksumValid = sum === this.cksum + if (this.cksum === null && sum === 8 * 0x20) + this.nullBlock = true + } + + [SLURP] (ex, global) { + for (let k in ex) { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. + if (ex[k] !== null && ex[k] !== undefined && + !(global && k === 'path')) + this[k] = ex[k] + } + } + + encode (buf, off) { + if (!buf) { + buf = this.block = Buffer.alloc(512) + off = 0 + } + + if (!off) + off = 0 + + if (!(buf.length >= off + 512)) + throw new Error('need 512 bytes for header') + + const prefixSize = this.ctime || this.atime ? 130 : 155 + const split = splitPrefix(this.path || '', prefixSize) + const path = split[0] + const prefix = split[1] + this.needPax = split[2] + + this.needPax = encString(buf, off, 100, path) || this.needPax + this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax + this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax + this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax + this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax + this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax + buf[off + 156] = this[TYPE].charCodeAt(0) + this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax + buf.write('ustar\u000000', off + 257, 8) + this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax + this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax + this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax + this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax + this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax + if (buf[off + 475] !== 0) + this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax + else { + this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax + this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax + this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax + } + + let sum = 8 * 0x20 + for (let i = off; i < off + 148; i++) { + sum += buf[i] + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i] + } + this.cksum = sum + encNumber(buf, off + 148, 8, this.cksum) + this.cksumValid = true + + return this.needPax + } + + set (data) { + for (let i in data) { + if (data[i] !== null && data[i] !== undefined) + this[i] = data[i] + } + } + + get type () { + return types.name.get(this[TYPE]) || this[TYPE] + } + + get typeKey () { + return this[TYPE] + } + + set type (type) { + if (types.code.has(type)) + this[TYPE] = types.code.get(type) + else + this[TYPE] = type + } +} + +const splitPrefix = (p, prefixSize) => { + const pathSize = 100 + let pp = p + let prefix = '' + let ret + const root = pathModule.parse(p).root || '.' + + if (Buffer.byteLength(pp) < pathSize) + ret = [pp, prefix, false] + else { + // first set prefix to the dir, and path to the base + prefix = pathModule.dirname(pp) + pp = pathModule.basename(pp) + + do { + // both fit! + if (Buffer.byteLength(pp) <= pathSize && + Buffer.byteLength(prefix) <= prefixSize) + ret = [pp, prefix, false] + + // prefix fits in prefix, but path doesn't fit in path + else if (Buffer.byteLength(pp) > pathSize && + Buffer.byteLength(prefix) <= prefixSize) + ret = [pp.substr(0, pathSize - 1), prefix, true] + + else { + // make path take a bit from prefix + pp = pathModule.join(pathModule.basename(prefix), pp) + prefix = pathModule.dirname(prefix) + } + } while (prefix !== root && !ret) + + // at this point, found no resolution, just truncate + if (!ret) + ret = [p.substr(0, pathSize - 1), '', true] + } + return ret +} + +const decString = (buf, off, size) => + buf.slice(off, off + size).toString('utf8').replace(/\0.*/, '') + +const decDate = (buf, off, size) => + numToDate(decNumber(buf, off, size)) + +const numToDate = num => num === null ? null : new Date(num * 1000) + +const decNumber = (buf, off, size) => + buf[off] & 0x80 ? large.parse(buf.slice(off, off + size)) + : decSmallNumber(buf, off, size) + +const nanNull = value => isNaN(value) ? null : value + +const decSmallNumber = (buf, off, size) => + nanNull(parseInt( + buf.slice(off, off + size) + .toString('utf8').replace(/\0.*$/, '').trim(), 8)) + +// the maximum encodable as a null-terminated octal, by field size +const MAXNUM = { + 12: 0o77777777777, + 8 : 0o7777777 +} + +const encNumber = (buf, off, size, number) => + number === null ? false : + number > MAXNUM[size] || number < 0 + ? (large.encode(number, buf.slice(off, off + size)), true) + : (encSmallNumber(buf, off, size, number), false) + +const encSmallNumber = (buf, off, size, number) => + buf.write(octalString(number, size), off, size, 'ascii') + +const octalString = (number, size) => + padOctal(Math.floor(number).toString(8), size) + +const padOctal = (string, size) => + (string.length === size - 1 ? string + : new Array(size - string.length - 1).join('0') + string + ' ') + '\0' + +const encDate = (buf, off, size, date) => + date === null ? false : + encNumber(buf, off, size, date.getTime() / 1000) + +// enough to fill the longest string we've got +const NULLS = new Array(156).join('\0') +// pad with nulls, return true if it's longer or non-ascii +const encString = (buf, off, size, string) => + string === null ? false : + (buf.write(string + NULLS, off, size, 'utf8'), + string.length !== Buffer.byteLength(string) || string.length > size) + +module.exports = Header diff --git a/packages/字体精简工具/node_modules/tar/lib/high-level-opt.js b/packages/字体精简工具/node_modules/tar/lib/high-level-opt.js new file mode 100644 index 0000000..7333db9 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/high-level-opt.js @@ -0,0 +1,29 @@ +'use strict' + +// turn tar(1) style args like `C` into the more verbose things like `cwd` + +const argmap = new Map([ + ['C', 'cwd'], + ['f', 'file'], + ['z', 'gzip'], + ['P', 'preservePaths'], + ['U', 'unlink'], + ['strip-components', 'strip'], + ['stripComponents', 'strip'], + ['keep-newer', 'newer'], + ['keepNewer', 'newer'], + ['keep-newer-files', 'newer'], + ['keepNewerFiles', 'newer'], + ['k', 'keep'], + ['keep-existing', 'keep'], + ['keepExisting', 'keep'], + ['m', 'noMtime'], + ['no-mtime', 'noMtime'], + ['p', 'preserveOwner'], + ['L', 'follow'], + ['h', 'follow'] +]) + +const parse = module.exports = opt => opt ? Object.keys(opt).map(k => [ + argmap.has(k) ? argmap.get(k) : k, opt[k] +]).reduce((set, kv) => (set[kv[0]] = kv[1], set), Object.create(null)) : {} diff --git a/packages/字体精简工具/node_modules/tar/lib/large-numbers.js b/packages/字体精简工具/node_modules/tar/lib/large-numbers.js new file mode 100644 index 0000000..3e5c992 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/large-numbers.js @@ -0,0 +1,97 @@ +'use strict' +// Tar can encode large and negative numbers using a leading byte of +// 0xff for negative, and 0x80 for positive. + +const encode = exports.encode = (num, buf) => { + if (!Number.isSafeInteger(num)) + // The number is so large that javascript cannot represent it with integer + // precision. + throw TypeError('cannot encode number outside of javascript safe integer range') + else if (num < 0) + encodeNegative(num, buf) + else + encodePositive(num, buf) + return buf +} + +const encodePositive = (num, buf) => { + buf[0] = 0x80 + + for (var i = buf.length; i > 1; i--) { + buf[i-1] = num & 0xff + num = Math.floor(num / 0x100) + } +} + +const encodeNegative = (num, buf) => { + buf[0] = 0xff + var flipped = false + num = num * -1 + for (var i = buf.length; i > 1; i--) { + var byte = num & 0xff + num = Math.floor(num / 0x100) + if (flipped) + buf[i-1] = onesComp(byte) + else if (byte === 0) + buf[i-1] = 0 + else { + flipped = true + buf[i-1] = twosComp(byte) + } + } +} + +const parse = exports.parse = (buf) => { + var post = buf[buf.length - 1] + var pre = buf[0] + var value; + if (pre === 0x80) + value = pos(buf.slice(1, buf.length)) + else if (pre === 0xff) + value = twos(buf) + else + throw TypeError('invalid base256 encoding') + + if (!Number.isSafeInteger(value)) + // The number is so large that javascript cannot represent it with integer + // precision. + throw TypeError('parsed number outside of javascript safe integer range') + + return value +} + +const twos = (buf) => { + var len = buf.length + var sum = 0 + var flipped = false + for (var i = len - 1; i > -1; i--) { + var byte = buf[i] + var f + if (flipped) + f = onesComp(byte) + else if (byte === 0) + f = byte + else { + flipped = true + f = twosComp(byte) + } + if (f !== 0) + sum -= f * Math.pow(256, len - i - 1) + } + return sum +} + +const pos = (buf) => { + var len = buf.length + var sum = 0 + for (var i = len - 1; i > -1; i--) { + var byte = buf[i] + if (byte !== 0) + sum += byte * Math.pow(256, len - i - 1) + } + return sum +} + +const onesComp = byte => (0xff ^ byte) & 0xff + +const twosComp = byte => ((0xff ^ byte) + 1) & 0xff diff --git a/packages/字体精简工具/node_modules/tar/lib/list.js b/packages/字体精简工具/node_modules/tar/lib/list.js new file mode 100644 index 0000000..250ebe0 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/list.js @@ -0,0 +1,130 @@ +'use strict' + +const Buffer = require('./buffer.js') + +// XXX: This shares a lot in common with extract.js +// maybe some DRY opportunity here? + +// tar -t +const hlo = require('./high-level-opt.js') +const Parser = require('./parse.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') + +const t = module.exports = (opt_, files, cb) => { + if (typeof opt_ === 'function') + cb = opt_, files = null, opt_ = {} + else if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (typeof files === 'function') + cb = files, files = null + + if (!files) + files = [] + else + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + if (files.length) + filesFilter(opt, files) + + if (!opt.noResume) + onentryFunction(opt) + + return opt.file && opt.sync ? listFileSync(opt) + : opt.file ? listFile(opt, cb) + : list(opt) +} + +const onentryFunction = opt => { + const onentry = opt.onentry + opt.onentry = onentry ? e => { + onentry(e) + e.resume() + } : e => e.resume() +} + +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true])) + const filter = opt.filter + + const mapHas = (file, r) => { + const root = r || path.parse(file).root || '.' + const ret = file === root ? false + : map.has(file) ? map.get(file) + : mapHas(path.dirname(file), root) + + map.set(file, ret) + return ret + } + + opt.filter = filter + ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, '')) + : file => mapHas(file.replace(/\/+$/, '')) +} + +const listFileSync = opt => { + const p = list(opt) + const file = opt.file + let threw = true + let fd + try { + const stat = fs.statSync(file) + const readSize = opt.maxReadSize || 16*1024*1024 + if (stat.size < readSize) { + p.end(fs.readFileSync(file)) + } else { + let pos = 0 + const buf = Buffer.allocUnsafe(readSize) + fd = fs.openSync(file, 'r') + while (pos < stat.size) { + let bytesRead = fs.readSync(fd, buf, 0, readSize, pos) + pos += bytesRead + p.write(buf.slice(0, bytesRead)) + } + p.end() + } + threw = false + } finally { + if (threw && fd) + try { fs.closeSync(fd) } catch (er) {} + } +} + +const listFile = (opt, cb) => { + const parse = new Parser(opt) + const readSize = opt.maxReadSize || 16*1024*1024 + + const file = opt.file + const p = new Promise((resolve, reject) => { + parse.on('error', reject) + parse.on('end', resolve) + + fs.stat(file, (er, stat) => { + if (er) + reject(er) + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size + }) + stream.on('error', reject) + stream.pipe(parse) + } + }) + }) + return cb ? p.then(cb, cb) : p +} + +const list = opt => new Parser(opt) diff --git a/packages/字体精简工具/node_modules/tar/lib/mkdir.js b/packages/字体精简工具/node_modules/tar/lib/mkdir.js new file mode 100644 index 0000000..c6a154c --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/mkdir.js @@ -0,0 +1,206 @@ +'use strict' +// wrapper around mkdirp for tar's needs. + +// TODO: This should probably be a class, not functionally +// passing around state in a gazillion args. + +const mkdirp = require('mkdirp') +const fs = require('fs') +const path = require('path') +const chownr = require('chownr') + +class SymlinkError extends Error { + constructor (symlink, path) { + super('Cannot extract through symbolic link') + this.path = path + this.symlink = symlink + } + + get name () { + return 'SylinkError' + } +} + +class CwdError extends Error { + constructor (path, code) { + super(code + ': Cannot cd into \'' + path + '\'') + this.path = path + this.code = code + } + + get name () { + return 'CwdError' + } +} + +const mkdir = module.exports = (dir, opt, cb) => { + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + const umask = opt.umask + const mode = opt.mode | 0o0700 + const needChmod = (mode & umask) !== 0 + + const uid = opt.uid + const gid = opt.gid + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + ( uid !== opt.processUid || gid !== opt.processGid ) + + const preserve = opt.preserve + const unlink = opt.unlink + const cache = opt.cache + const cwd = opt.cwd + + const done = (er, created) => { + if (er) + cb(er) + else { + cache.set(dir, true) + if (created && doChown) + chownr(created, uid, gid, er => done(er)) + else if (needChmod) + fs.chmod(dir, mode, cb) + else + cb() + } + } + + if (cache && cache.get(dir) === true) + return done() + + if (dir === cwd) + return fs.stat(dir, (er, st) => { + if (er || !st.isDirectory()) + er = new CwdError(dir, er && er.code || 'ENOTDIR') + done(er) + }) + + if (preserve) + return mkdirp(dir, mode, done) + + const sub = path.relative(cwd, dir) + const parts = sub.split(/\/|\\/) + mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done) +} + +const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + if (!parts.length) + return cb(null, created) + const p = parts.shift() + const part = base + '/' + p + if (cache.get(part)) + return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) +} + +const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => { + if (er) { + if (er.path && path.dirname(er.path) === cwd && + (er.code === 'ENOTDIR' || er.code === 'ENOENT')) + return cb(new CwdError(cwd, er.code)) + + fs.lstat(part, (statEr, st) => { + if (statEr) + cb(statEr) + else if (st.isDirectory()) + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + else if (unlink) + fs.unlink(part, er => { + if (er) + return cb(er) + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) + }) + else if (st.isSymbolicLink()) + return cb(new SymlinkError(part, part + '/' + parts.join('/'))) + else + cb(er) + }) + } else { + created = created || part + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + } +} + +const mkdirSync = module.exports.sync = (dir, opt) => { + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + const umask = opt.umask + const mode = opt.mode | 0o0700 + const needChmod = (mode & umask) !== 0 + + const uid = opt.uid + const gid = opt.gid + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + ( uid !== opt.processUid || gid !== opt.processGid ) + + const preserve = opt.preserve + const unlink = opt.unlink + const cache = opt.cache + const cwd = opt.cwd + + const done = (created) => { + cache.set(dir, true) + if (created && doChown) + chownr.sync(created, uid, gid) + if (needChmod) + fs.chmodSync(dir, mode) + } + + if (cache && cache.get(dir) === true) + return done() + + if (dir === cwd) { + let ok = false + let code = 'ENOTDIR' + try { + ok = fs.statSync(dir).isDirectory() + } catch (er) { + code = er.code + } finally { + if (!ok) + throw new CwdError(dir, code) + } + done() + return + } + + if (preserve) + return done(mkdirp.sync(dir, mode)) + + const sub = path.relative(cwd, dir) + const parts = sub.split(/\/|\\/) + let created = null + for (let p = parts.shift(), part = cwd; + p && (part += '/' + p); + p = parts.shift()) { + + if (cache.get(part)) + continue + + try { + fs.mkdirSync(part, mode) + created = created || part + cache.set(part, true) + } catch (er) { + if (er.path && path.dirname(er.path) === cwd && + (er.code === 'ENOTDIR' || er.code === 'ENOENT')) + return new CwdError(cwd, er.code) + + const st = fs.lstatSync(part) + if (st.isDirectory()) { + cache.set(part, true) + continue + } else if (unlink) { + fs.unlinkSync(part) + fs.mkdirSync(part, mode) + created = created || part + cache.set(part, true) + continue + } else if (st.isSymbolicLink()) + return new SymlinkError(part, part + '/' + parts.join('/')) + } + } + + return done(created) +} diff --git a/packages/字体精简工具/node_modules/tar/lib/mode-fix.js b/packages/字体精简工具/node_modules/tar/lib/mode-fix.js new file mode 100644 index 0000000..3363a3b --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/mode-fix.js @@ -0,0 +1,14 @@ +'use strict' +module.exports = (mode, isDir) => { + mode &= 0o7777 + // if dirs are readable, then they should be listable + if (isDir) { + if (mode & 0o400) + mode |= 0o100 + if (mode & 0o40) + mode |= 0o10 + if (mode & 0o4) + mode |= 0o1 + } + return mode +} diff --git a/packages/字体精简工具/node_modules/tar/lib/pack.js b/packages/字体精简工具/node_modules/tar/lib/pack.js new file mode 100644 index 0000000..857cea9 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/pack.js @@ -0,0 +1,404 @@ +'use strict' + +const Buffer = require('./buffer.js') + +// A readable tar stream creator +// Technically, this is a transform stream that you write paths into, +// and tar format comes out of. +// The `add()` method is like `write()` but returns this, +// and end() return `this` as well, so you can +// do `new Pack(opt).add('files').add('dir').end().pipe(output) +// You could also do something like: +// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) + +class PackJob { + constructor (path, absolute) { + this.path = path || './' + this.absolute = absolute + this.entry = null + this.stat = null + this.readdir = null + this.pending = false + this.ignore = false + this.piped = false + } +} + +const MiniPass = require('minipass') +const zlib = require('minizlib') +const ReadEntry = require('./read-entry.js') +const WriteEntry = require('./write-entry.js') +const WriteEntrySync = WriteEntry.Sync +const WriteEntryTar = WriteEntry.Tar +const Yallist = require('yallist') +const EOF = Buffer.alloc(1024) +const ONSTAT = Symbol('onStat') +const ENDED = Symbol('ended') +const QUEUE = Symbol('queue') +const CURRENT = Symbol('current') +const PROCESS = Symbol('process') +const PROCESSING = Symbol('processing') +const PROCESSJOB = Symbol('processJob') +const JOBS = Symbol('jobs') +const JOBDONE = Symbol('jobDone') +const ADDFSENTRY = Symbol('addFSEntry') +const ADDTARENTRY = Symbol('addTarEntry') +const STAT = Symbol('stat') +const READDIR = Symbol('readdir') +const ONREADDIR = Symbol('onreaddir') +const PIPE = Symbol('pipe') +const ENTRY = Symbol('entry') +const ENTRYOPT = Symbol('entryOpt') +const WRITEENTRYCLASS = Symbol('writeEntryClass') +const WRITE = Symbol('write') +const ONDRAIN = Symbol('ondrain') + +const fs = require('fs') +const path = require('path') +const warner = require('./warn-mixin.js') + +const Pack = warner(class Pack extends MiniPass { + constructor (opt) { + super(opt) + opt = opt || Object.create(null) + this.opt = opt + this.cwd = opt.cwd || process.cwd() + this.maxReadSize = opt.maxReadSize + this.preservePaths = !!opt.preservePaths + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.prefix = (opt.prefix || '').replace(/(\\|\/)+$/, '') + this.linkCache = opt.linkCache || new Map() + this.statCache = opt.statCache || new Map() + this.readdirCache = opt.readdirCache || new Map() + + this[WRITEENTRYCLASS] = WriteEntry + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + this.zip = null + if (opt.gzip) { + if (typeof opt.gzip !== 'object') + opt.gzip = {} + this.zip = new zlib.Gzip(opt.gzip) + this.zip.on('data', chunk => super.write(chunk)) + this.zip.on('end', _ => super.end()) + this.zip.on('drain', _ => this[ONDRAIN]()) + this.on('resume', _ => this.zip.resume()) + } else + this.on('drain', this[ONDRAIN]) + + this.portable = !!opt.portable + this.noDirRecurse = !!opt.noDirRecurse + this.follow = !!opt.follow + this.noMtime = !!opt.noMtime + this.mtime = opt.mtime || null + + this.filter = typeof opt.filter === 'function' ? opt.filter : _ => true + + this[QUEUE] = new Yallist + this[JOBS] = 0 + this.jobs = +opt.jobs || 4 + this[PROCESSING] = false + this[ENDED] = false + } + + [WRITE] (chunk) { + return super.write(chunk) + } + + add (path) { + this.write(path) + return this + } + + end (path) { + if (path) + this.write(path) + this[ENDED] = true + this[PROCESS]() + return this + } + + write (path) { + if (this[ENDED]) + throw new Error('write after end') + + if (path instanceof ReadEntry) + this[ADDTARENTRY](path) + else + this[ADDFSENTRY](path) + return this.flowing + } + + [ADDTARENTRY] (p) { + const absolute = path.resolve(this.cwd, p.path) + if (this.prefix) + p.path = this.prefix + '/' + p.path.replace(/^\.(\/+|$)/, '') + + // in this case, we don't have to wait for the stat + if (!this.filter(p.path, p)) + p.resume() + else { + const job = new PackJob(p.path, absolute, false) + job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)) + job.entry.on('end', _ => this[JOBDONE](job)) + this[JOBS] += 1 + this[QUEUE].push(job) + } + + this[PROCESS]() + } + + [ADDFSENTRY] (p) { + const absolute = path.resolve(this.cwd, p) + if (this.prefix) + p = this.prefix + '/' + p.replace(/^\.(\/+|$)/, '') + + this[QUEUE].push(new PackJob(p, absolute)) + this[PROCESS]() + } + + [STAT] (job) { + job.pending = true + this[JOBS] += 1 + const stat = this.follow ? 'stat' : 'lstat' + fs[stat](job.absolute, (er, stat) => { + job.pending = false + this[JOBS] -= 1 + if (er) + this.emit('error', er) + else + this[ONSTAT](job, stat) + }) + } + + [ONSTAT] (job, stat) { + this.statCache.set(job.absolute, stat) + job.stat = stat + + // now we have the stat, we can filter it. + if (!this.filter(job.path, stat)) + job.ignore = true + + this[PROCESS]() + } + + [READDIR] (job) { + job.pending = true + this[JOBS] += 1 + fs.readdir(job.absolute, (er, entries) => { + job.pending = false + this[JOBS] -= 1 + if (er) + return this.emit('error', er) + this[ONREADDIR](job, entries) + }) + } + + [ONREADDIR] (job, entries) { + this.readdirCache.set(job.absolute, entries) + job.readdir = entries + this[PROCESS]() + } + + [PROCESS] () { + if (this[PROCESSING]) + return + + this[PROCESSING] = true + for (let w = this[QUEUE].head; + w !== null && this[JOBS] < this.jobs; + w = w.next) { + this[PROCESSJOB](w.value) + if (w.value.ignore) { + const p = w.next + this[QUEUE].removeNode(w) + w.next = p + } + } + + this[PROCESSING] = false + + if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { + if (this.zip) + this.zip.end(EOF) + else { + super.write(EOF) + super.end() + } + } + } + + get [CURRENT] () { + return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value + } + + [JOBDONE] (job) { + this[QUEUE].shift() + this[JOBS] -= 1 + this[PROCESS]() + } + + [PROCESSJOB] (job) { + if (job.pending) + return + + if (job.entry) { + if (job === this[CURRENT] && !job.piped) + this[PIPE](job) + return + } + + if (!job.stat) { + if (this.statCache.has(job.absolute)) + this[ONSTAT](job, this.statCache.get(job.absolute)) + else + this[STAT](job) + } + if (!job.stat) + return + + // filtered out! + if (job.ignore) + return + + if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) { + if (this.readdirCache.has(job.absolute)) + this[ONREADDIR](job, this.readdirCache.get(job.absolute)) + else + this[READDIR](job) + if (!job.readdir) + return + } + + // we know it doesn't have an entry, because that got checked above + job.entry = this[ENTRY](job) + if (!job.entry) { + job.ignore = true + return + } + + if (job === this[CURRENT] && !job.piped) + this[PIPE](job) + } + + [ENTRYOPT] (job) { + return { + onwarn: (msg, data) => { + this.warn(msg, data) + }, + noPax: this.noPax, + cwd: this.cwd, + absolute: job.absolute, + preservePaths: this.preservePaths, + maxReadSize: this.maxReadSize, + strict: this.strict, + portable: this.portable, + linkCache: this.linkCache, + statCache: this.statCache, + noMtime: this.noMtime, + mtime: this.mtime + } + } + + [ENTRY] (job) { + this[JOBS] += 1 + try { + return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)) + .on('end', () => this[JOBDONE](job)) + .on('error', er => this.emit('error', er)) + } catch (er) { + this.emit('error', er) + } + } + + [ONDRAIN] () { + if (this[CURRENT] && this[CURRENT].entry) + this[CURRENT].entry.resume() + } + + // like .pipe() but using super, because our write() is special + [PIPE] (job) { + job.piped = true + + if (job.readdir) + job.readdir.forEach(entry => { + const p = this.prefix ? + job.path.slice(this.prefix.length + 1) || './' + : job.path + + const base = p === './' ? '' : p.replace(/\/*$/, '/') + this[ADDFSENTRY](base + entry) + }) + + const source = job.entry + const zip = this.zip + + if (zip) + source.on('data', chunk => { + if (!zip.write(chunk)) + source.pause() + }) + else + source.on('data', chunk => { + if (!super.write(chunk)) + source.pause() + }) + } + + pause () { + if (this.zip) + this.zip.pause() + return super.pause() + } +}) + +class PackSync extends Pack { + constructor (opt) { + super(opt) + this[WRITEENTRYCLASS] = WriteEntrySync + } + + // pause/resume are no-ops in sync streams. + pause () {} + resume () {} + + [STAT] (job) { + const stat = this.follow ? 'statSync' : 'lstatSync' + this[ONSTAT](job, fs[stat](job.absolute)) + } + + [READDIR] (job, stat) { + this[ONREADDIR](job, fs.readdirSync(job.absolute)) + } + + // gotta get it all in this tick + [PIPE] (job) { + const source = job.entry + const zip = this.zip + + if (job.readdir) + job.readdir.forEach(entry => { + const p = this.prefix ? + job.path.slice(this.prefix.length + 1) || './' + : job.path + + const base = p === './' ? '' : p.replace(/\/*$/, '/') + this[ADDFSENTRY](base + entry) + }) + + if (zip) + source.on('data', chunk => { + zip.write(chunk) + }) + else + source.on('data', chunk => { + super[WRITE](chunk) + }) + } +} + +Pack.Sync = PackSync + +module.exports = Pack diff --git a/packages/字体精简工具/node_modules/tar/lib/parse.js b/packages/字体精简工具/node_modules/tar/lib/parse.js new file mode 100644 index 0000000..43d4383 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/parse.js @@ -0,0 +1,428 @@ +'use strict' + +// this[BUFFER] is the remainder of a chunk if we're waiting for +// the full 512 bytes of a header to come in. We will Buffer.concat() +// it to the next write(), which is a mem copy, but a small one. +// +// this[QUEUE] is a Yallist of entries that haven't been emitted +// yet this can only get filled up if the user keeps write()ing after +// a write() returns false, or does a write() with more than one entry +// +// We don't buffer chunks, we always parse them and either create an +// entry, or push it into the active entry. The ReadEntry class knows +// to throw data away if .ignore=true +// +// Shift entry off the buffer when it emits 'end', and emit 'entry' for +// the next one in the list. +// +// At any time, we're pushing body chunks into the entry at WRITEENTRY, +// and waiting for 'end' on the entry at READENTRY +// +// ignored entries get .resume() called on them straight away + +const warner = require('./warn-mixin.js') +const path = require('path') +const Header = require('./header.js') +const EE = require('events') +const Yallist = require('yallist') +const maxMetaEntrySize = 1024 * 1024 +const Entry = require('./read-entry.js') +const Pax = require('./pax.js') +const zlib = require('minizlib') +const Buffer = require('./buffer.js') + +const gzipHeader = Buffer.from([0x1f, 0x8b]) +const STATE = Symbol('state') +const WRITEENTRY = Symbol('writeEntry') +const READENTRY = Symbol('readEntry') +const NEXTENTRY = Symbol('nextEntry') +const PROCESSENTRY = Symbol('processEntry') +const EX = Symbol('extendedHeader') +const GEX = Symbol('globalExtendedHeader') +const META = Symbol('meta') +const EMITMETA = Symbol('emitMeta') +const BUFFER = Symbol('buffer') +const QUEUE = Symbol('queue') +const ENDED = Symbol('ended') +const EMITTEDEND = Symbol('emittedEnd') +const EMIT = Symbol('emit') +const UNZIP = Symbol('unzip') +const CONSUMECHUNK = Symbol('consumeChunk') +const CONSUMECHUNKSUB = Symbol('consumeChunkSub') +const CONSUMEBODY = Symbol('consumeBody') +const CONSUMEMETA = Symbol('consumeMeta') +const CONSUMEHEADER = Symbol('consumeHeader') +const CONSUMING = Symbol('consuming') +const BUFFERCONCAT = Symbol('bufferConcat') +const MAYBEEND = Symbol('maybeEnd') +const WRITING = Symbol('writing') +const ABORTED = Symbol('aborted') +const DONE = Symbol('onDone') + +const noop = _ => true + +module.exports = warner(class Parser extends EE { + constructor (opt) { + opt = opt || {} + super(opt) + + if (opt.ondone) + this.on(DONE, opt.ondone) + else + this.on(DONE, _ => { + this.emit('prefinish') + this.emit('finish') + this.emit('end') + this.emit('close') + }) + + this.strict = !!opt.strict + this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize + this.filter = typeof opt.filter === 'function' ? opt.filter : noop + + // have to set this so that streams are ok piping into it + this.writable = true + this.readable = false + + this[QUEUE] = new Yallist() + this[BUFFER] = null + this[READENTRY] = null + this[WRITEENTRY] = null + this[STATE] = 'begin' + this[META] = '' + this[EX] = null + this[GEX] = null + this[ENDED] = false + this[UNZIP] = null + this[ABORTED] = false + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + if (typeof opt.onentry === 'function') + this.on('entry', opt.onentry) + } + + [CONSUMEHEADER] (chunk, position) { + let header + try { + header = new Header(chunk, position, this[EX], this[GEX]) + } catch (er) { + return this.warn('invalid entry', er) + } + + if (header.nullBlock) + this[EMIT]('nullBlock') + else if (!header.cksumValid) + this.warn('invalid entry', header) + else if (!header.path) + this.warn('invalid: path is required', header) + else { + const type = header.type + if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) + this.warn('invalid: linkpath required', header) + else if (!/^(Symbolic)?Link$/.test(type) && header.linkpath) + this.warn('invalid: linkpath forbidden', header) + else { + const entry = this[WRITEENTRY] = new Entry(header, this[EX], this[GEX]) + + if (entry.meta) { + if (entry.size > this.maxMetaEntrySize) { + entry.ignore = true + this[EMIT]('ignoredEntry', entry) + this[STATE] = 'ignore' + } else if (entry.size > 0) { + this[META] = '' + entry.on('data', c => this[META] += c) + this[STATE] = 'meta' + } + } else { + + this[EX] = null + entry.ignore = entry.ignore || !this.filter(entry.path, entry) + if (entry.ignore) { + this[EMIT]('ignoredEntry', entry) + this[STATE] = entry.remain ? 'ignore' : 'begin' + } else { + if (entry.remain) + this[STATE] = 'body' + else { + this[STATE] = 'begin' + entry.end() + } + + if (!this[READENTRY]) { + this[QUEUE].push(entry) + this[NEXTENTRY]() + } else + this[QUEUE].push(entry) + } + } + } + } + } + + [PROCESSENTRY] (entry) { + let go = true + + if (!entry) { + this[READENTRY] = null + go = false + } else if (Array.isArray(entry)) + this.emit.apply(this, entry) + else { + this[READENTRY] = entry + this.emit('entry', entry) + if (!entry.emittedEnd) { + entry.on('end', _ => this[NEXTENTRY]()) + go = false + } + } + + return go + } + + [NEXTENTRY] () { + do {} while (this[PROCESSENTRY](this[QUEUE].shift())) + + if (!this[QUEUE].length) { + // At this point, there's nothing in the queue, but we may have an + // entry which is being consumed (readEntry). + // If we don't, then we definitely can handle more data. + // If we do, and either it's flowing, or it has never had any data + // written to it, then it needs more. + // The only other possibility is that it has returned false from a + // write() call, so we wait for the next drain to continue. + const re = this[READENTRY] + const drainNow = !re || re.flowing || re.size === re.remain + if (drainNow) { + if (!this[WRITING]) + this.emit('drain') + } else + re.once('drain', _ => this.emit('drain')) + } + } + + [CONSUMEBODY] (chunk, position) { + // write up to but no more than writeEntry.blockRemain + const entry = this[WRITEENTRY] + const br = entry.blockRemain + const c = (br >= chunk.length && position === 0) ? chunk + : chunk.slice(position, position + br) + + entry.write(c) + + if (!entry.blockRemain) { + this[STATE] = 'begin' + this[WRITEENTRY] = null + entry.end() + } + + return c.length + } + + [CONSUMEMETA] (chunk, position) { + const entry = this[WRITEENTRY] + const ret = this[CONSUMEBODY](chunk, position) + + // if we finished, then the entry is reset + if (!this[WRITEENTRY]) + this[EMITMETA](entry) + + return ret + } + + [EMIT] (ev, data, extra) { + if (!this[QUEUE].length && !this[READENTRY]) + this.emit(ev, data, extra) + else + this[QUEUE].push([ev, data, extra]) + } + + [EMITMETA] (entry) { + this[EMIT]('meta', this[META]) + switch (entry.type) { + case 'ExtendedHeader': + case 'OldExtendedHeader': + this[EX] = Pax.parse(this[META], this[EX], false) + break + + case 'GlobalExtendedHeader': + this[GEX] = Pax.parse(this[META], this[GEX], true) + break + + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + this[EX] = this[EX] || Object.create(null) + this[EX].path = this[META].replace(/\0.*/, '') + break + + case 'NextFileHasLongLinkpath': + this[EX] = this[EX] || Object.create(null) + this[EX].linkpath = this[META].replace(/\0.*/, '') + break + + /* istanbul ignore next */ + default: throw new Error('unknown meta: ' + entry.type) + } + } + + abort (msg, error) { + this[ABORTED] = true + this.warn(msg, error) + this.emit('abort', error) + this.emit('error', error) + } + + write (chunk) { + if (this[ABORTED]) + return + + // first write, might be gzipped + if (this[UNZIP] === null && chunk) { + if (this[BUFFER]) { + chunk = Buffer.concat([this[BUFFER], chunk]) + this[BUFFER] = null + } + if (chunk.length < gzipHeader.length) { + this[BUFFER] = chunk + return true + } + for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) { + if (chunk[i] !== gzipHeader[i]) + this[UNZIP] = false + } + if (this[UNZIP] === null) { + const ended = this[ENDED] + this[ENDED] = false + this[UNZIP] = new zlib.Unzip() + this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)) + this[UNZIP].on('error', er => + this.abort(er.message, er)) + this[UNZIP].on('end', _ => { + this[ENDED] = true + this[CONSUMECHUNK]() + }) + this[WRITING] = true + const ret = this[UNZIP][ended ? 'end' : 'write' ](chunk) + this[WRITING] = false + return ret + } + } + + this[WRITING] = true + if (this[UNZIP]) + this[UNZIP].write(chunk) + else + this[CONSUMECHUNK](chunk) + this[WRITING] = false + + // return false if there's a queue, or if the current entry isn't flowing + const ret = + this[QUEUE].length ? false : + this[READENTRY] ? this[READENTRY].flowing : + true + + // if we have no queue, then that means a clogged READENTRY + if (!ret && !this[QUEUE].length) + this[READENTRY].once('drain', _ => this.emit('drain')) + + return ret + } + + [BUFFERCONCAT] (c) { + if (c && !this[ABORTED]) + this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c + } + + [MAYBEEND] () { + if (this[ENDED] && + !this[EMITTEDEND] && + !this[ABORTED] && + !this[CONSUMING]) { + this[EMITTEDEND] = true + const entry = this[WRITEENTRY] + if (entry && entry.blockRemain) { + const have = this[BUFFER] ? this[BUFFER].length : 0 + this.warn('Truncated input (needed ' + entry.blockRemain + + ' more bytes, only ' + have + ' available)', entry) + if (this[BUFFER]) + entry.write(this[BUFFER]) + entry.end() + } + this[EMIT](DONE) + } + } + + [CONSUMECHUNK] (chunk) { + if (this[CONSUMING]) { + this[BUFFERCONCAT](chunk) + } else if (!chunk && !this[BUFFER]) { + this[MAYBEEND]() + } else { + this[CONSUMING] = true + if (this[BUFFER]) { + this[BUFFERCONCAT](chunk) + const c = this[BUFFER] + this[BUFFER] = null + this[CONSUMECHUNKSUB](c) + } else { + this[CONSUMECHUNKSUB](chunk) + } + + while (this[BUFFER] && this[BUFFER].length >= 512 && !this[ABORTED]) { + const c = this[BUFFER] + this[BUFFER] = null + this[CONSUMECHUNKSUB](c) + } + this[CONSUMING] = false + } + + if (!this[BUFFER] || this[ENDED]) + this[MAYBEEND]() + } + + [CONSUMECHUNKSUB] (chunk) { + // we know that we are in CONSUMING mode, so anything written goes into + // the buffer. Advance the position and put any remainder in the buffer. + let position = 0 + let length = chunk.length + while (position + 512 <= length && !this[ABORTED]) { + switch (this[STATE]) { + case 'begin': + this[CONSUMEHEADER](chunk, position) + position += 512 + break + + case 'ignore': + case 'body': + position += this[CONSUMEBODY](chunk, position) + break + + case 'meta': + position += this[CONSUMEMETA](chunk, position) + break + + /* istanbul ignore next */ + default: + throw new Error('invalid state: ' + this[STATE]) + } + } + + if (position < length) { + if (this[BUFFER]) + this[BUFFER] = Buffer.concat([chunk.slice(position), this[BUFFER]]) + else + this[BUFFER] = chunk.slice(position) + } + } + + end (chunk) { + if (!this[ABORTED]) { + if (this[UNZIP]) + this[UNZIP].end(chunk) + else { + this[ENDED] = true + this.write(chunk) + } + } + } +}) diff --git a/packages/字体精简工具/node_modules/tar/lib/pax.js b/packages/字体精简工具/node_modules/tar/lib/pax.js new file mode 100644 index 0000000..9d7e4ab --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/pax.js @@ -0,0 +1,146 @@ +'use strict' +const Buffer = require('./buffer.js') +const Header = require('./header.js') +const path = require('path') + +class Pax { + constructor (obj, global) { + this.atime = obj.atime || null + this.charset = obj.charset || null + this.comment = obj.comment || null + this.ctime = obj.ctime || null + this.gid = obj.gid || null + this.gname = obj.gname || null + this.linkpath = obj.linkpath || null + this.mtime = obj.mtime || null + this.path = obj.path || null + this.size = obj.size || null + this.uid = obj.uid || null + this.uname = obj.uname || null + this.dev = obj.dev || null + this.ino = obj.ino || null + this.nlink = obj.nlink || null + this.global = global || false + } + + encode () { + const body = this.encodeBody() + if (body === '') + return null + + const bodyLen = Buffer.byteLength(body) + // round up to 512 bytes + // add 512 for header + const bufLen = 512 * Math.ceil(1 + bodyLen / 512) + const buf = Buffer.allocUnsafe(bufLen) + + // 0-fill the header section, it might not hit every field + for (let i = 0; i < 512; i++) { + buf[i] = 0 + } + + new Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99), + mode: this.mode || 0o644, + uid: this.uid || null, + gid: this.gid || null, + size: bodyLen, + mtime: this.mtime || null, + type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', + linkpath: '', + uname: this.uname || '', + gname: this.gname || '', + devmaj: 0, + devmin: 0, + atime: this.atime || null, + ctime: this.ctime || null + }).encode(buf) + + buf.write(body, 512, bodyLen, 'utf8') + + // null pad after the body + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0 + } + + return buf + } + + encodeBody () { + return ( + this.encodeField('path') + + this.encodeField('ctime') + + this.encodeField('atime') + + this.encodeField('dev') + + this.encodeField('ino') + + this.encodeField('nlink') + + this.encodeField('charset') + + this.encodeField('comment') + + this.encodeField('gid') + + this.encodeField('gname') + + this.encodeField('linkpath') + + this.encodeField('mtime') + + this.encodeField('size') + + this.encodeField('uid') + + this.encodeField('uname') + ) + } + + encodeField (field) { + if (this[field] === null || this[field] === undefined) + return '' + const v = this[field] instanceof Date ? this[field].getTime() / 1000 + : this[field] + const s = ' ' + + (field === 'dev' || field === 'ino' || field === 'nlink' + ? 'SCHILY.' : '') + + field + '=' + v + '\n' + const byteLen = Buffer.byteLength(s) + // the digits includes the length of the digits in ascii base-10 + // so if it's 9 characters, then adding 1 for the 9 makes it 10 + // which makes it 11 chars. + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1 + if (byteLen + digits >= Math.pow(10, digits)) + digits += 1 + const len = digits + byteLen + return len + s + } +} + +Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g) + +const merge = (a, b) => + b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a + +const parseKV = string => + string + .replace(/\n$/, '') + .split('\n') + .reduce(parseKVLine, Object.create(null)) + +const parseKVLine = (set, line) => { + const n = parseInt(line, 10) + + // XXX Values with \n in them will fail this. + // Refactor to not be a naive line-by-line parse. + if (n !== Buffer.byteLength(line) + 1) + return set + + line = line.substr((n + ' ').length) + const kv = line.split('=') + const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1') + if (!k) + return set + + const v = kv.join('=') + set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) + ? new Date(v * 1000) + : /^[0-9]+$/.test(v) ? +v + : v + return set +} + +module.exports = Pax diff --git a/packages/字体精简工具/node_modules/tar/lib/read-entry.js b/packages/字体精简工具/node_modules/tar/lib/read-entry.js new file mode 100644 index 0000000..8acee94 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/read-entry.js @@ -0,0 +1,98 @@ +'use strict' +const types = require('./types.js') +const MiniPass = require('minipass') + +const SLURP = Symbol('slurp') +module.exports = class ReadEntry extends MiniPass { + constructor (header, ex, gex) { + super() + // read entries always start life paused. this is to avoid the + // situation where Minipass's auto-ending empty streams results + // in an entry ending before we're ready for it. + this.pause() + this.extended = ex + this.globalExtended = gex + this.header = header + this.startBlockSize = 512 * Math.ceil(header.size / 512) + this.blockRemain = this.startBlockSize + this.remain = header.size + this.type = header.type + this.meta = false + this.ignore = false + switch (this.type) { + case 'File': + case 'OldFile': + case 'Link': + case 'SymbolicLink': + case 'CharacterDevice': + case 'BlockDevice': + case 'Directory': + case 'FIFO': + case 'ContiguousFile': + case 'GNUDumpDir': + break + + case 'NextFileHasLongLinkpath': + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + case 'GlobalExtendedHeader': + case 'ExtendedHeader': + case 'OldExtendedHeader': + this.meta = true + break + + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true + } + + this.path = header.path + this.mode = header.mode + if (this.mode) + this.mode = this.mode & 0o7777 + this.uid = header.uid + this.gid = header.gid + this.uname = header.uname + this.gname = header.gname + this.size = header.size + this.mtime = header.mtime + this.atime = header.atime + this.ctime = header.ctime + this.linkpath = header.linkpath + this.uname = header.uname + this.gname = header.gname + + if (ex) this[SLURP](ex) + if (gex) this[SLURP](gex, true) + } + + write (data) { + const writeLen = data.length + if (writeLen > this.blockRemain) + throw new Error('writing more to entry than is appropriate') + + const r = this.remain + const br = this.blockRemain + this.remain = Math.max(0, r - writeLen) + this.blockRemain = Math.max(0, br - writeLen) + if (this.ignore) + return true + + if (r >= writeLen) + return super.write(data) + + // r < writeLen + return super.write(data.slice(0, r)) + } + + [SLURP] (ex, global) { + for (let k in ex) { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. + if (ex[k] !== null && ex[k] !== undefined && + !(global && k === 'path')) + this[k] = ex[k] + } + } +} diff --git a/packages/字体精简工具/node_modules/tar/lib/replace.js b/packages/字体精简工具/node_modules/tar/lib/replace.js new file mode 100644 index 0000000..571cee9 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/replace.js @@ -0,0 +1,220 @@ +'use strict' +const Buffer = require('./buffer.js') + +// tar -r +const hlo = require('./high-level-opt.js') +const Pack = require('./pack.js') +const Parse = require('./parse.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const t = require('./list.js') +const path = require('path') + +// starting at the head of the file, read a Header +// If the checksum is invalid, that's our position to start writing +// If it is, jump forward by the specified size (round up to 512) +// and try again. +// Write the new Pack stream starting there. + +const Header = require('./header.js') + +const r = module.exports = (opt_, files, cb) => { + const opt = hlo(opt_) + + if (!opt.file) + throw new TypeError('file is required') + + if (opt.gzip) + throw new TypeError('cannot append to compressed archives') + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + return opt.sync ? replaceSync(opt, files) + : replace(opt, files, cb) +} + +const replaceSync = (opt, files) => { + const p = new Pack.Sync(opt) + + let threw = true + let fd + let position + + try { + try { + fd = fs.openSync(opt.file, 'r+') + } catch (er) { + if (er.code === 'ENOENT') + fd = fs.openSync(opt.file, 'w+') + else + throw er + } + + const st = fs.fstatSync(fd) + const headBuf = Buffer.alloc(512) + + POSITION: for (position = 0; position < st.size; position += 512) { + for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { + bytes = fs.readSync( + fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos + ) + + if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) + throw new Error('cannot append to compressed archives') + + if (!bytes) + break POSITION + } + + let h = new Header(headBuf) + if (!h.cksumValid) + break + let entryBlockSize = 512 * Math.ceil(h.size / 512) + if (position + entryBlockSize + 512 > st.size) + break + // the 512 for the header we just parsed will be added as well + // also jump ahead all the blocks for the body + position += entryBlockSize + if (opt.mtimeCache) + opt.mtimeCache.set(h.path, h.mtime) + } + threw = false + + streamSync(opt, p, position, fd, files) + } finally { + if (threw) + try { fs.closeSync(fd) } catch (er) {} + } +} + +const streamSync = (opt, p, position, fd, files) => { + const stream = new fsm.WriteStreamSync(opt.file, { + fd: fd, + start: position + }) + p.pipe(stream) + addFilesSync(p, files) +} + +const replace = (opt, files, cb) => { + files = Array.from(files) + const p = new Pack(opt) + + const getPos = (fd, size, cb_) => { + const cb = (er, pos) => { + if (er) + fs.close(fd, _ => cb_(er)) + else + cb_(null, pos) + } + + let position = 0 + if (size === 0) + return cb(null, 0) + + let bufPos = 0 + const headBuf = Buffer.alloc(512) + const onread = (er, bytes) => { + if (er) + return cb(er) + bufPos += bytes + if (bufPos < 512 && bytes) + return fs.read( + fd, headBuf, bufPos, headBuf.length - bufPos, + position + bufPos, onread + ) + + if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) + return cb(new Error('cannot append to compressed archives')) + + // truncated header + if (bufPos < 512) + return cb(null, position) + + const h = new Header(headBuf) + if (!h.cksumValid) + return cb(null, position) + + const entryBlockSize = 512 * Math.ceil(h.size / 512) + if (position + entryBlockSize + 512 > size) + return cb(null, position) + + position += entryBlockSize + 512 + if (position >= size) + return cb(null, position) + + if (opt.mtimeCache) + opt.mtimeCache.set(h.path, h.mtime) + bufPos = 0 + fs.read(fd, headBuf, 0, 512, position, onread) + } + fs.read(fd, headBuf, 0, 512, position, onread) + } + + const promise = new Promise((resolve, reject) => { + p.on('error', reject) + let flag = 'r+' + const onopen = (er, fd) => { + if (er && er.code === 'ENOENT' && flag === 'r+') { + flag = 'w+' + return fs.open(opt.file, flag, onopen) + } + + if (er) + return reject(er) + + fs.fstat(fd, (er, st) => { + if (er) + return reject(er) + getPos(fd, st.size, (er, position) => { + if (er) + return reject(er) + const stream = new fsm.WriteStream(opt.file, { + fd: fd, + start: position + }) + p.pipe(stream) + stream.on('error', reject) + stream.on('close', resolve) + addFilesAsync(p, files) + }) + }) + } + fs.open(opt.file, flag, onopen) + }) + + return cb ? promise.then(cb, cb) : promise +} + +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') + t({ + file: path.resolve(p.cwd, file.substr(1)), + sync: true, + noResume: true, + onentry: entry => p.add(entry) + }) + else + p.add(file) + }) + p.end() +} + +const addFilesAsync = (p, files) => { + while (files.length) { + const file = files.shift() + if (file.charAt(0) === '@') + return t({ + file: path.resolve(p.cwd, file.substr(1)), + noResume: true, + onentry: entry => p.add(entry) + }).then(_ => addFilesAsync(p, files)) + else + p.add(file) + } + p.end() +} diff --git a/packages/字体精简工具/node_modules/tar/lib/types.js b/packages/字体精简工具/node_modules/tar/lib/types.js new file mode 100644 index 0000000..df42565 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/types.js @@ -0,0 +1,44 @@ +'use strict' +// map types from key to human-friendly name +exports.name = new Map([ + ['0', 'File'], + // same as File + ['', 'OldFile'], + ['1', 'Link'], + ['2', 'SymbolicLink'], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ['3', 'CharacterDevice'], + ['4', 'BlockDevice'], + ['5', 'Directory'], + ['6', 'FIFO'], + // same as File + ['7', 'ContiguousFile'], + // pax headers + ['g', 'GlobalExtendedHeader'], + ['x', 'ExtendedHeader'], + // vendor-specific stuff + // skip + ['A', 'SolarisACL'], + // like 5, but with data, which should be skipped + ['D', 'GNUDumpDir'], + // metadata only, skip + ['I', 'Inode'], + // data = link path of next file + ['K', 'NextFileHasLongLinkpath'], + // data = path of next file + ['L', 'NextFileHasLongPath'], + // skip + ['M', 'ContinuationFile'], + // like L + ['N', 'OldGnuLongPath'], + // skip + ['S', 'SparseFile'], + // skip + ['V', 'TapeVolumeHeader'], + // like x + ['X', 'OldExtendedHeader'] +]) + +// map the other direction +exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]])) diff --git a/packages/字体精简工具/node_modules/tar/lib/unpack.js b/packages/字体精简工具/node_modules/tar/lib/unpack.js new file mode 100644 index 0000000..fc76509 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/unpack.js @@ -0,0 +1,621 @@ +'use strict' + +const assert = require('assert') +const EE = require('events').EventEmitter +const Parser = require('./parse.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') +const mkdir = require('./mkdir.js') +const mkdirSync = mkdir.sync +const wc = require('./winchars.js') + +const ONENTRY = Symbol('onEntry') +const CHECKFS = Symbol('checkFs') +const ISREUSABLE = Symbol('isReusable') +const MAKEFS = Symbol('makeFs') +const FILE = Symbol('file') +const DIRECTORY = Symbol('directory') +const LINK = Symbol('link') +const SYMLINK = Symbol('symlink') +const HARDLINK = Symbol('hardlink') +const UNSUPPORTED = Symbol('unsupported') +const UNKNOWN = Symbol('unknown') +const CHECKPATH = Symbol('checkPath') +const MKDIR = Symbol('mkdir') +const ONERROR = Symbol('onError') +const PENDING = Symbol('pending') +const PEND = Symbol('pend') +const UNPEND = Symbol('unpend') +const ENDED = Symbol('ended') +const MAYBECLOSE = Symbol('maybeClose') +const SKIP = Symbol('skip') +const DOCHOWN = Symbol('doChown') +const UID = Symbol('uid') +const GID = Symbol('gid') +const crypto = require('crypto') + +// Unlinks on Windows are not atomic. +// +// This means that if you have a file entry, followed by another +// file entry with an identical name, and you cannot re-use the file +// (because it's a hardlink, or because unlink:true is set, or it's +// Windows, which does not have useful nlink values), then the unlink +// will be committed to the disk AFTER the new file has been written +// over the old one, deleting the new file. +// +// To work around this, on Windows systems, we rename the file and then +// delete the renamed file. It's a sloppy kludge, but frankly, I do not +// know of a better way to do this, given windows' non-atomic unlink +// semantics. +// +// See: https://github.com/npm/node-tar/issues/183 +/* istanbul ignore next */ +const unlinkFile = (path, cb) => { + if (process.platform !== 'win32') + return fs.unlink(path, cb) + + const name = path + '.DELETE.' + crypto.randomBytes(16).toString('hex') + fs.rename(path, name, er => { + if (er) + return cb(er) + fs.unlink(name, cb) + }) +} + +/* istanbul ignore next */ +const unlinkFileSync = path => { + if (process.platform !== 'win32') + return fs.unlinkSync(path) + + const name = path + '.DELETE.' + crypto.randomBytes(16).toString('hex') + fs.renameSync(path, name) + fs.unlinkSync(name) +} + +// this.gid, entry.gid, this.processUid +const uint32 = (a, b, c) => + a === a >>> 0 ? a + : b === b >>> 0 ? b + : c + +class Unpack extends Parser { + constructor (opt) { + if (!opt) + opt = {} + + opt.ondone = _ => { + this[ENDED] = true + this[MAYBECLOSE]() + } + + super(opt) + + this.transform = typeof opt.transform === 'function' ? opt.transform : null + + this.writable = true + this.readable = false + + this[PENDING] = 0 + this[ENDED] = false + + this.dirCache = opt.dirCache || new Map() + + if (typeof opt.uid === 'number' || typeof opt.gid === 'number') { + // need both or neither + if (typeof opt.uid !== 'number' || typeof opt.gid !== 'number') + throw new TypeError('cannot set owner without number uid and gid') + if (opt.preserveOwner) + throw new TypeError( + 'cannot preserve owner in archive and also set owner explicitly') + this.uid = opt.uid + this.gid = opt.gid + this.setOwner = true + } else { + this.uid = null + this.gid = null + this.setOwner = false + } + + // default true for root + if (opt.preserveOwner === undefined && typeof opt.uid !== 'number') + this.preserveOwner = process.getuid && process.getuid() === 0 + else + this.preserveOwner = !!opt.preserveOwner + + this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? + process.getuid() : null + this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ? + process.getgid() : null + + // mostly just for testing, but useful in some cases. + // Forcibly trigger a chown on every entry, no matter what + this.forceChown = opt.forceChown === true + + // turn > this[ONENTRY](entry)) + } + + [MAYBECLOSE] () { + if (this[ENDED] && this[PENDING] === 0) { + this.emit('prefinish') + this.emit('finish') + this.emit('end') + this.emit('close') + } + } + + [CHECKPATH] (entry) { + if (this.strip) { + const parts = entry.path.split(/\/|\\/) + if (parts.length < this.strip) + return false + entry.path = parts.slice(this.strip).join('/') + + if (entry.type === 'Link') { + const linkparts = entry.linkpath.split(/\/|\\/) + if (linkparts.length >= this.strip) + entry.linkpath = linkparts.slice(this.strip).join('/') + } + } + + if (!this.preservePaths) { + const p = entry.path + if (p.match(/(^|\/|\\)\.\.(\\|\/|$)/)) { + this.warn('path contains \'..\'', p) + return false + } + + // absolutes on posix are also absolutes on win32 + // so we only need to test this one to get both + if (path.win32.isAbsolute(p)) { + const parsed = path.win32.parse(p) + this.warn('stripping ' + parsed.root + ' from absolute path', p) + entry.path = p.substr(parsed.root.length) + } + } + + // only encode : chars that aren't drive letter indicators + if (this.win32) { + const parsed = path.win32.parse(entry.path) + entry.path = parsed.root === '' ? wc.encode(entry.path) + : parsed.root + wc.encode(entry.path.substr(parsed.root.length)) + } + + if (path.isAbsolute(entry.path)) + entry.absolute = entry.path + else + entry.absolute = path.resolve(this.cwd, entry.path) + + return true + } + + [ONENTRY] (entry) { + if (!this[CHECKPATH](entry)) + return entry.resume() + + assert.equal(typeof entry.absolute, 'string') + + switch (entry.type) { + case 'Directory': + case 'GNUDumpDir': + if (entry.mode) + entry.mode = entry.mode | 0o700 + + case 'File': + case 'OldFile': + case 'ContiguousFile': + case 'Link': + case 'SymbolicLink': + return this[CHECKFS](entry) + + case 'CharacterDevice': + case 'BlockDevice': + case 'FIFO': + return this[UNSUPPORTED](entry) + } + } + + [ONERROR] (er, entry) { + // Cwd has to exist, or else nothing works. That's serious. + // Other errors are warnings, which raise the error in strict + // mode, but otherwise continue on. + if (er.name === 'CwdError') + this.emit('error', er) + else { + this.warn(er.message, er) + this[UNPEND]() + entry.resume() + } + } + + [MKDIR] (dir, mode, cb) { + mkdir(dir, { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode + }, cb) + } + + [DOCHOWN] (entry) { + // in preserve owner mode, chown if the entry doesn't match process + // in set owner mode, chown if setting doesn't match process + return this.forceChown || + this.preserveOwner && + ( typeof entry.uid === 'number' && entry.uid !== this.processUid || + typeof entry.gid === 'number' && entry.gid !== this.processGid ) + || + ( typeof this.uid === 'number' && this.uid !== this.processUid || + typeof this.gid === 'number' && this.gid !== this.processGid ) + } + + [UID] (entry) { + return uint32(this.uid, entry.uid, this.processUid) + } + + [GID] (entry) { + return uint32(this.gid, entry.gid, this.processGid) + } + + [FILE] (entry) { + const mode = entry.mode & 0o7777 || this.fmode + const stream = new fsm.WriteStream(entry.absolute, { + mode: mode, + autoClose: false + }) + stream.on('error', er => this[ONERROR](er, entry)) + + let actions = 1 + const done = er => { + if (er) + return this[ONERROR](er, entry) + + if (--actions === 0) + fs.close(stream.fd, _ => this[UNPEND]()) + } + + stream.on('finish', _ => { + // if futimes fails, try utimes + // if utimes fails, fail with the original error + // same for fchown/chown + const abs = entry.absolute + const fd = stream.fd + + if (entry.mtime && !this.noMtime) { + actions++ + const atime = entry.atime || new Date() + const mtime = entry.mtime + fs.futimes(fd, atime, mtime, er => + er ? fs.utimes(abs, atime, mtime, er2 => done(er2 && er)) + : done()) + } + + if (this[DOCHOWN](entry)) { + actions++ + const uid = this[UID](entry) + const gid = this[GID](entry) + fs.fchown(fd, uid, gid, er => + er ? fs.chown(abs, uid, gid, er2 => done(er2 && er)) + : done()) + } + + done() + }) + + const tx = this.transform ? this.transform(entry) || entry : entry + if (tx !== entry) { + tx.on('error', er => this[ONERROR](er, entry)) + entry.pipe(tx) + } + tx.pipe(stream) + } + + [DIRECTORY] (entry) { + const mode = entry.mode & 0o7777 || this.dmode + this[MKDIR](entry.absolute, mode, er => { + if (er) + return this[ONERROR](er, entry) + + let actions = 1 + const done = _ => { + if (--actions === 0) { + this[UNPEND]() + entry.resume() + } + } + + if (entry.mtime && !this.noMtime) { + actions++ + fs.utimes(entry.absolute, entry.atime || new Date(), entry.mtime, done) + } + + if (this[DOCHOWN](entry)) { + actions++ + fs.chown(entry.absolute, this[UID](entry), this[GID](entry), done) + } + + done() + }) + } + + [UNSUPPORTED] (entry) { + this.warn('unsupported entry type: ' + entry.type, entry) + entry.resume() + } + + [SYMLINK] (entry) { + this[LINK](entry, entry.linkpath, 'symlink') + } + + [HARDLINK] (entry) { + this[LINK](entry, path.resolve(this.cwd, entry.linkpath), 'link') + } + + [PEND] () { + this[PENDING]++ + } + + [UNPEND] () { + this[PENDING]-- + this[MAYBECLOSE]() + } + + [SKIP] (entry) { + this[UNPEND]() + entry.resume() + } + + // Check if we can reuse an existing filesystem entry safely and + // overwrite it, rather than unlinking and recreating + // Windows doesn't report a useful nlink, so we just never reuse entries + [ISREUSABLE] (entry, st) { + return entry.type === 'File' && + !this.unlink && + st.isFile() && + st.nlink <= 1 && + process.platform !== 'win32' + } + + // check if a thing is there, and if so, try to clobber it + [CHECKFS] (entry) { + this[PEND]() + this[MKDIR](path.dirname(entry.absolute), this.dmode, er => { + if (er) + return this[ONERROR](er, entry) + fs.lstat(entry.absolute, (er, st) => { + if (st && (this.keep || this.newer && st.mtime > entry.mtime)) + this[SKIP](entry) + else if (er || this[ISREUSABLE](entry, st)) + this[MAKEFS](null, entry) + else if (st.isDirectory()) { + if (entry.type === 'Directory') { + if (!entry.mode || (st.mode & 0o7777) === entry.mode) + this[MAKEFS](null, entry) + else + fs.chmod(entry.absolute, entry.mode, er => this[MAKEFS](er, entry)) + } else + fs.rmdir(entry.absolute, er => this[MAKEFS](er, entry)) + } else + unlinkFile(entry.absolute, er => this[MAKEFS](er, entry)) + }) + }) + } + + [MAKEFS] (er, entry) { + if (er) + return this[ONERROR](er, entry) + + switch (entry.type) { + case 'File': + case 'OldFile': + case 'ContiguousFile': + return this[FILE](entry) + + case 'Link': + return this[HARDLINK](entry) + + case 'SymbolicLink': + return this[SYMLINK](entry) + + case 'Directory': + case 'GNUDumpDir': + return this[DIRECTORY](entry) + } + } + + [LINK] (entry, linkpath, link) { + // XXX: get the type ('file' or 'dir') for windows + fs[link](linkpath, entry.absolute, er => { + if (er) + return this[ONERROR](er, entry) + this[UNPEND]() + entry.resume() + }) + } +} + +class UnpackSync extends Unpack { + constructor (opt) { + super(opt) + } + + [CHECKFS] (entry) { + const er = this[MKDIR](path.dirname(entry.absolute), this.dmode) + if (er) + return this[ONERROR](er, entry) + try { + const st = fs.lstatSync(entry.absolute) + if (this.keep || this.newer && st.mtime > entry.mtime) + return this[SKIP](entry) + else if (this[ISREUSABLE](entry, st)) + return this[MAKEFS](null, entry) + else { + try { + if (st.isDirectory()) { + if (entry.type === 'Directory') { + if (entry.mode && (st.mode & 0o7777) !== entry.mode) + fs.chmodSync(entry.absolute, entry.mode) + } else + fs.rmdirSync(entry.absolute) + } else + unlinkFileSync(entry.absolute) + return this[MAKEFS](null, entry) + } catch (er) { + return this[ONERROR](er, entry) + } + } + } catch (er) { + return this[MAKEFS](null, entry) + } + } + + [FILE] (entry) { + const mode = entry.mode & 0o7777 || this.fmode + + const oner = er => { + try { fs.closeSync(fd) } catch (_) {} + if (er) + this[ONERROR](er, entry) + } + + let stream + let fd + try { + fd = fs.openSync(entry.absolute, 'w', mode) + } catch (er) { + return oner(er) + } + const tx = this.transform ? this.transform(entry) || entry : entry + if (tx !== entry) { + tx.on('error', er => this[ONERROR](er, entry)) + entry.pipe(tx) + } + + tx.on('data', chunk => { + try { + fs.writeSync(fd, chunk, 0, chunk.length) + } catch (er) { + oner(er) + } + }) + + tx.on('end', _ => { + let er = null + // try both, falling futimes back to utimes + // if either fails, handle the first error + if (entry.mtime && !this.noMtime) { + const atime = entry.atime || new Date() + const mtime = entry.mtime + try { + fs.futimesSync(fd, atime, mtime) + } catch (futimeser) { + try { + fs.utimesSync(entry.absolute, atime, mtime) + } catch (utimeser) { + er = futimeser + } + } + } + + if (this[DOCHOWN](entry)) { + const uid = this[UID](entry) + const gid = this[GID](entry) + + try { + fs.fchownSync(fd, uid, gid) + } catch (fchowner) { + try { + fs.chownSync(entry.absolute, uid, gid) + } catch (chowner) { + er = er || fchowner + } + } + } + + oner(er) + }) + } + + [DIRECTORY] (entry) { + const mode = entry.mode & 0o7777 || this.dmode + const er = this[MKDIR](entry.absolute, mode) + if (er) + return this[ONERROR](er, entry) + if (entry.mtime && !this.noMtime) { + try { + fs.utimesSync(entry.absolute, entry.atime || new Date(), entry.mtime) + } catch (er) {} + } + if (this[DOCHOWN](entry)) { + try { + fs.chownSync(entry.absolute, this[UID](entry), this[GID](entry)) + } catch (er) {} + } + entry.resume() + } + + [MKDIR] (dir, mode) { + try { + return mkdir.sync(dir, { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode + }) + } catch (er) { + return er + } + } + + [LINK] (entry, linkpath, link) { + try { + fs[link + 'Sync'](linkpath, entry.absolute) + entry.resume() + } catch (er) { + return this[ONERROR](er, entry) + } + } +} + +Unpack.Sync = UnpackSync +module.exports = Unpack diff --git a/packages/字体精简工具/node_modules/tar/lib/update.js b/packages/字体精简工具/node_modules/tar/lib/update.js new file mode 100644 index 0000000..16c3e93 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/update.js @@ -0,0 +1,36 @@ +'use strict' + +// tar -u + +const hlo = require('./high-level-opt.js') +const r = require('./replace.js') +// just call tar.r with the filter and mtimeCache + +const u = module.exports = (opt_, files, cb) => { + const opt = hlo(opt_) + + if (!opt.file) + throw new TypeError('file is required') + + if (opt.gzip) + throw new TypeError('cannot append to compressed archives') + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + mtimeFilter(opt) + return r(opt, files, cb) +} + +const mtimeFilter = opt => { + const filter = opt.filter + + if (!opt.mtimeCache) + opt.mtimeCache = new Map() + + opt.filter = filter ? (path, stat) => + filter(path, stat) && !(opt.mtimeCache.get(path) > stat.mtime) + : (path, stat) => !(opt.mtimeCache.get(path) > stat.mtime) +} diff --git a/packages/字体精简工具/node_modules/tar/lib/warn-mixin.js b/packages/字体精简工具/node_modules/tar/lib/warn-mixin.js new file mode 100644 index 0000000..94a4b9b --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/warn-mixin.js @@ -0,0 +1,14 @@ +'use strict' +module.exports = Base => class extends Base { + warn (msg, data) { + if (!this.strict) + this.emit('warn', msg, data) + else if (data instanceof Error) + this.emit('error', data) + else { + const er = new Error(msg) + er.data = data + this.emit('error', er) + } + } +} diff --git a/packages/字体精简工具/node_modules/tar/lib/winchars.js b/packages/字体精简工具/node_modules/tar/lib/winchars.js new file mode 100644 index 0000000..cf6ea06 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/winchars.js @@ -0,0 +1,23 @@ +'use strict' + +// When writing files on Windows, translate the characters to their +// 0xf000 higher-encoded versions. + +const raw = [ + '|', + '<', + '>', + '?', + ':' +] + +const win = raw.map(char => + String.fromCharCode(0xf000 + char.charCodeAt(0))) + +const toWin = new Map(raw.map((char, i) => [char, win[i]])) +const toRaw = new Map(win.map((char, i) => [char, raw[i]])) + +module.exports = { + encode: s => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s), + decode: s => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s) +} diff --git a/packages/字体精简工具/node_modules/tar/lib/write-entry.js b/packages/字体精简工具/node_modules/tar/lib/write-entry.js new file mode 100644 index 0000000..0c01900 --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/lib/write-entry.js @@ -0,0 +1,422 @@ +'use strict' +const Buffer = require('./buffer.js') +const MiniPass = require('minipass') +const Pax = require('./pax.js') +const Header = require('./header.js') +const ReadEntry = require('./read-entry.js') +const fs = require('fs') +const path = require('path') + +const types = require('./types.js') +const maxReadSize = 16 * 1024 * 1024 +const PROCESS = Symbol('process') +const FILE = Symbol('file') +const DIRECTORY = Symbol('directory') +const SYMLINK = Symbol('symlink') +const HARDLINK = Symbol('hardlink') +const HEADER = Symbol('header') +const READ = Symbol('read') +const LSTAT = Symbol('lstat') +const ONLSTAT = Symbol('onlstat') +const ONREAD = Symbol('onread') +const ONREADLINK = Symbol('onreadlink') +const OPENFILE = Symbol('openfile') +const ONOPENFILE = Symbol('onopenfile') +const CLOSE = Symbol('close') +const MODE = Symbol('mode') +const warner = require('./warn-mixin.js') +const winchars = require('./winchars.js') + +const modeFix = require('./mode-fix.js') + +const WriteEntry = warner(class WriteEntry extends MiniPass { + constructor (p, opt) { + opt = opt || {} + super(opt) + if (typeof p !== 'string') + throw new TypeError('path is required') + this.path = p + // suppress atime, ctime, uid, gid, uname, gname + this.portable = !!opt.portable + // until node has builtin pwnam functions, this'll have to do + this.myuid = process.getuid && process.getuid() + this.myuser = process.env.USER || '' + this.maxReadSize = opt.maxReadSize || maxReadSize + this.linkCache = opt.linkCache || new Map() + this.statCache = opt.statCache || new Map() + this.preservePaths = !!opt.preservePaths + this.cwd = opt.cwd || process.cwd() + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.noMtime = !!opt.noMtime + this.mtime = opt.mtime || null + + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + if (!this.preservePaths && path.win32.isAbsolute(p)) { + // absolutes on posix are also absolutes on win32 + // so we only need to test this one to get both + const parsed = path.win32.parse(p) + this.warn('stripping ' + parsed.root + ' from absolute path', p) + this.path = p.substr(parsed.root.length) + } + + this.win32 = !!opt.win32 || process.platform === 'win32' + if (this.win32) { + this.path = winchars.decode(this.path.replace(/\\/g, '/')) + p = p.replace(/\\/g, '/') + } + + this.absolute = opt.absolute || path.resolve(this.cwd, p) + + if (this.path === '') + this.path = './' + + if (this.statCache.has(this.absolute)) + this[ONLSTAT](this.statCache.get(this.absolute)) + else + this[LSTAT]() + } + + [LSTAT] () { + fs.lstat(this.absolute, (er, stat) => { + if (er) + return this.emit('error', er) + this[ONLSTAT](stat) + }) + } + + [ONLSTAT] (stat) { + this.statCache.set(this.absolute, stat) + this.stat = stat + if (!stat.isFile()) + stat.size = 0 + this.type = getType(stat) + this.emit('stat', stat) + this[PROCESS]() + } + + [PROCESS] () { + switch (this.type) { + case 'File': return this[FILE]() + case 'Directory': return this[DIRECTORY]() + case 'SymbolicLink': return this[SYMLINK]() + // unsupported types are ignored. + default: return this.end() + } + } + + [MODE] (mode) { + return modeFix(mode, this.type === 'Directory') + } + + [HEADER] () { + if (this.type === 'Directory' && this.portable) + this.noMtime = true + + this.header = new Header({ + path: this.path, + linkpath: this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? null : this.stat.uid, + gid: this.portable ? null : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? null : this.mtime || this.stat.mtime, + type: this.type, + uname: this.portable ? null : + this.stat.uid === this.myuid ? this.myuser : '', + atime: this.portable ? null : this.stat.atime, + ctime: this.portable ? null : this.stat.ctime + }) + + if (this.header.encode() && !this.noPax) + this.write(new Pax({ + atime: this.portable ? null : this.header.atime, + ctime: this.portable ? null : this.header.ctime, + gid: this.portable ? null : this.header.gid, + mtime: this.noMtime ? null : this.mtime || this.header.mtime, + path: this.path, + linkpath: this.linkpath, + size: this.header.size, + uid: this.portable ? null : this.header.uid, + uname: this.portable ? null : this.header.uname, + dev: this.portable ? null : this.stat.dev, + ino: this.portable ? null : this.stat.ino, + nlink: this.portable ? null : this.stat.nlink + }).encode()) + this.write(this.header.block) + } + + [DIRECTORY] () { + if (this.path.substr(-1) !== '/') + this.path += '/' + this.stat.size = 0 + this[HEADER]() + this.end() + } + + [SYMLINK] () { + fs.readlink(this.absolute, (er, linkpath) => { + if (er) + return this.emit('error', er) + this[ONREADLINK](linkpath) + }) + } + + [ONREADLINK] (linkpath) { + this.linkpath = linkpath + this[HEADER]() + this.end() + } + + [HARDLINK] (linkpath) { + this.type = 'Link' + this.linkpath = path.relative(this.cwd, linkpath) + this.stat.size = 0 + this[HEADER]() + this.end() + } + + [FILE] () { + if (this.stat.nlink > 1) { + const linkKey = this.stat.dev + ':' + this.stat.ino + if (this.linkCache.has(linkKey)) { + const linkpath = this.linkCache.get(linkKey) + if (linkpath.indexOf(this.cwd) === 0) + return this[HARDLINK](linkpath) + } + this.linkCache.set(linkKey, this.absolute) + } + + this[HEADER]() + if (this.stat.size === 0) + return this.end() + + this[OPENFILE]() + } + + [OPENFILE] () { + fs.open(this.absolute, 'r', (er, fd) => { + if (er) + return this.emit('error', er) + this[ONOPENFILE](fd) + }) + } + + [ONOPENFILE] (fd) { + const blockLen = 512 * Math.ceil(this.stat.size / 512) + const bufLen = Math.min(blockLen, this.maxReadSize) + const buf = Buffer.allocUnsafe(bufLen) + this[READ](fd, buf, 0, buf.length, 0, this.stat.size, blockLen) + } + + [READ] (fd, buf, offset, length, pos, remain, blockRemain) { + fs.read(fd, buf, offset, length, pos, (er, bytesRead) => { + if (er) + return this[CLOSE](fd, _ => this.emit('error', er)) + this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead) + }) + } + + [CLOSE] (fd, cb) { + fs.close(fd, cb) + } + + [ONREAD] (fd, buf, offset, length, pos, remain, blockRemain, bytesRead) { + if (bytesRead <= 0 && remain > 0) { + const er = new Error('encountered unexpected EOF') + er.path = this.absolute + er.syscall = 'read' + er.code = 'EOF' + this[CLOSE](fd, _ => _) + return this.emit('error', er) + } + + if (bytesRead > remain) { + const er = new Error('did not encounter expected EOF') + er.path = this.absolute + er.syscall = 'read' + er.code = 'EOF' + this[CLOSE](fd, _ => _) + return this.emit('error', er) + } + + // null out the rest of the buffer, if we could fit the block padding + if (bytesRead === remain) { + for (let i = bytesRead; i < length && bytesRead < blockRemain; i++) { + buf[i + offset] = 0 + bytesRead ++ + remain ++ + } + } + + const writeBuf = offset === 0 && bytesRead === buf.length ? + buf : buf.slice(offset, offset + bytesRead) + remain -= bytesRead + blockRemain -= bytesRead + pos += bytesRead + offset += bytesRead + + this.write(writeBuf) + + if (!remain) { + if (blockRemain) + this.write(Buffer.alloc(blockRemain)) + this.end() + this[CLOSE](fd, _ => _) + return + } + + if (offset >= length) { + buf = Buffer.allocUnsafe(length) + offset = 0 + } + length = buf.length - offset + this[READ](fd, buf, offset, length, pos, remain, blockRemain) + } +}) + +class WriteEntrySync extends WriteEntry { + constructor (path, opt) { + super(path, opt) + } + + [LSTAT] () { + this[ONLSTAT](fs.lstatSync(this.absolute)) + } + + [SYMLINK] () { + this[ONREADLINK](fs.readlinkSync(this.absolute)) + } + + [OPENFILE] () { + this[ONOPENFILE](fs.openSync(this.absolute, 'r')) + } + + [READ] (fd, buf, offset, length, pos, remain, blockRemain) { + let threw = true + try { + const bytesRead = fs.readSync(fd, buf, offset, length, pos) + this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead) + threw = false + } finally { + if (threw) + try { this[CLOSE](fd) } catch (er) {} + } + } + + [CLOSE] (fd) { + fs.closeSync(fd) + } +} + +const WriteEntryTar = warner(class WriteEntryTar extends MiniPass { + constructor (readEntry, opt) { + opt = opt || {} + super(opt) + this.preservePaths = !!opt.preservePaths + this.portable = !!opt.portable + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.noMtime = !!opt.noMtime + + this.readEntry = readEntry + this.type = readEntry.type + if (this.type === 'Directory' && this.portable) + this.noMtime = true + + this.path = readEntry.path + this.mode = this[MODE](readEntry.mode) + this.uid = this.portable ? null : readEntry.uid + this.gid = this.portable ? null : readEntry.gid + this.uname = this.portable ? null : readEntry.uname + this.gname = this.portable ? null : readEntry.gname + this.size = readEntry.size + this.mtime = this.noMtime ? null : opt.mtime || readEntry.mtime + this.atime = this.portable ? null : readEntry.atime + this.ctime = this.portable ? null : readEntry.ctime + this.linkpath = readEntry.linkpath + + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + if (path.isAbsolute(this.path) && !this.preservePaths) { + const parsed = path.parse(this.path) + this.warn( + 'stripping ' + parsed.root + ' from absolute path', + this.path + ) + this.path = this.path.substr(parsed.root.length) + } + + this.remain = readEntry.size + this.blockRemain = readEntry.startBlockSize + + this.header = new Header({ + path: this.path, + linkpath: this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this.mode, + uid: this.portable ? null : this.uid, + gid: this.portable ? null : this.gid, + size: this.size, + mtime: this.noMtime ? null : this.mtime, + type: this.type, + uname: this.portable ? null : this.uname, + atime: this.portable ? null : this.atime, + ctime: this.portable ? null : this.ctime + }) + + if (this.header.encode() && !this.noPax) + super.write(new Pax({ + atime: this.portable ? null : this.atime, + ctime: this.portable ? null : this.ctime, + gid: this.portable ? null : this.gid, + mtime: this.noMtime ? null : this.mtime, + path: this.path, + linkpath: this.linkpath, + size: this.size, + uid: this.portable ? null : this.uid, + uname: this.portable ? null : this.uname, + dev: this.portable ? null : this.readEntry.dev, + ino: this.portable ? null : this.readEntry.ino, + nlink: this.portable ? null : this.readEntry.nlink + }).encode()) + + super.write(this.header.block) + readEntry.pipe(this) + } + + [MODE] (mode) { + return modeFix(mode, this.type === 'Directory') + } + + write (data) { + const writeLen = data.length + if (writeLen > this.blockRemain) + throw new Error('writing more to entry than is appropriate') + this.blockRemain -= writeLen + return super.write(data) + } + + end () { + if (this.blockRemain) + this.write(Buffer.alloc(this.blockRemain)) + return super.end() + } +}) + +WriteEntry.Sync = WriteEntrySync +WriteEntry.Tar = WriteEntryTar + +const getType = stat => + stat.isFile() ? 'File' + : stat.isDirectory() ? 'Directory' + : stat.isSymbolicLink() ? 'SymbolicLink' + : 'Unsupported' + +module.exports = WriteEntry diff --git a/packages/字体精简工具/node_modules/tar/package.json b/packages/字体精简工具/node_modules/tar/package.json new file mode 100644 index 0000000..4c7cbde --- /dev/null +++ b/packages/字体精简工具/node_modules/tar/package.json @@ -0,0 +1,82 @@ +{ + "_from": "tar@^4.4.8", + "_id": "tar@4.4.13", + "_inBundle": false, + "_integrity": "sha1-Q7NkvFKIjVVSmGN7ENYHkCVKtSU=", + "_location": "/tar", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "tar@^4.4.8", + "name": "tar", + "escapedName": "tar", + "rawSpec": "^4.4.8", + "saveSpec": null, + "fetchSpec": "^4.4.8" + }, + "_requiredBy": [ + "/node-gyp" + ], + "_resolved": "https://registry.nlark.com/tar/download/tar-4.4.13.tgz", + "_shasum": "43b364bc52888d555298637b10d60790254ab525", + "_spec": "tar@^4.4.8", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\node-gyp", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/npm/node-tar/issues" + }, + "bundleDependencies": false, + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "deprecated": false, + "description": "tar for node", + "devDependencies": { + "chmodr": "^1.2.0", + "end-of-stream": "^1.4.1", + "events-to-array": "^1.1.2", + "mutate-fs": "^2.1.1", + "rimraf": "^2.6.3", + "tap": "^14.6.5", + "tar-fs": "^1.16.3", + "tar-stream": "^1.6.2" + }, + "engines": { + "node": ">=4.5" + }, + "files": [ + "index.js", + "lib/" + ], + "homepage": "https://github.com/npm/node-tar#readme", + "license": "ISC", + "name": "tar", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/node-tar.git" + }, + "scripts": { + "bench": "for i in benchmarks/*/*.js; do echo $i; for j in {1..5}; do node $i || break; done; done", + "genparse": "node scripts/generate-parse-fixtures.js", + "postpublish": "git push origin --follow-tags", + "postversion": "npm publish", + "preversion": "npm test", + "test": "tap" + }, + "tap": { + "coverage-map": "map.js", + "check-coverage": true + }, + "version": "4.4.13" +} diff --git a/packages/字体精简工具/node_modules/through/.travis.yml b/packages/字体精简工具/node_modules/through/.travis.yml new file mode 100644 index 0000000..c693a93 --- /dev/null +++ b/packages/字体精简工具/node_modules/through/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.6 + - 0.8 + - "0.10" diff --git a/packages/字体精简工具/node_modules/through/LICENSE.APACHE2 b/packages/字体精简工具/node_modules/through/LICENSE.APACHE2 new file mode 100644 index 0000000..6366c04 --- /dev/null +++ b/packages/字体精简工具/node_modules/through/LICENSE.APACHE2 @@ -0,0 +1,15 @@ +Apache License, Version 2.0 + +Copyright (c) 2011 Dominic Tarr + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/字体精简工具/node_modules/through/LICENSE.MIT b/packages/字体精简工具/node_modules/through/LICENSE.MIT new file mode 100644 index 0000000..6eafbd7 --- /dev/null +++ b/packages/字体精简工具/node_modules/through/LICENSE.MIT @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2011 Dominic Tarr + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/through/index.js b/packages/字体精简工具/node_modules/through/index.js new file mode 100644 index 0000000..ca5fc59 --- /dev/null +++ b/packages/字体精简工具/node_modules/through/index.js @@ -0,0 +1,108 @@ +var Stream = require('stream') + +// through +// +// a stream that does nothing but re-emit the input. +// useful for aggregating a series of changing but not ending streams into one stream) + +exports = module.exports = through +through.through = through + +//create a readable writable stream. + +function through (write, end, opts) { + write = write || function (data) { this.queue(data) } + end = end || function () { this.queue(null) } + + var ended = false, destroyed = false, buffer = [], _ended = false + var stream = new Stream() + stream.readable = stream.writable = true + stream.paused = false + +// stream.autoPause = !(opts && opts.autoPause === false) + stream.autoDestroy = !(opts && opts.autoDestroy === false) + + stream.write = function (data) { + write.call(this, data) + return !stream.paused + } + + function drain() { + while(buffer.length && !stream.paused) { + var data = buffer.shift() + if(null === data) + return stream.emit('end') + else + stream.emit('data', data) + } + } + + stream.queue = stream.push = function (data) { +// console.error(ended) + if(_ended) return stream + if(data === null) _ended = true + buffer.push(data) + drain() + return stream + } + + //this will be registered as the first 'end' listener + //must call destroy next tick, to make sure we're after any + //stream piped from here. + //this is only a problem if end is not emitted synchronously. + //a nicer way to do this is to make sure this is the last listener for 'end' + + stream.on('end', function () { + stream.readable = false + if(!stream.writable && stream.autoDestroy) + process.nextTick(function () { + stream.destroy() + }) + }) + + function _end () { + stream.writable = false + end.call(stream) + if(!stream.readable && stream.autoDestroy) + stream.destroy() + } + + stream.end = function (data) { + if(ended) return + ended = true + if(arguments.length) stream.write(data) + _end() // will emit or queue + return stream + } + + stream.destroy = function () { + if(destroyed) return + destroyed = true + ended = true + buffer.length = 0 + stream.writable = stream.readable = false + stream.emit('close') + return stream + } + + stream.pause = function () { + if(stream.paused) return + stream.paused = true + return stream + } + + stream.resume = function () { + if(stream.paused) { + stream.paused = false + stream.emit('resume') + } + drain() + //may have become paused again, + //as drain emits 'data'. + if(!stream.paused) + stream.emit('drain') + return stream + } + return stream +} + diff --git a/packages/字体精简工具/node_modules/through/package.json b/packages/字体精简工具/node_modules/through/package.json new file mode 100644 index 0000000..1d595e8 --- /dev/null +++ b/packages/字体精简工具/node_modules/through/package.json @@ -0,0 +1,68 @@ +{ + "_from": "through@~2.3.4", + "_id": "through@2.3.8", + "_inBundle": false, + "_integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "_location": "/through", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "through@~2.3.4", + "name": "through", + "escapedName": "through", + "rawSpec": "~2.3.4", + "saveSpec": null, + "fetchSpec": "~2.3.4" + }, + "_requiredBy": [ + "/stream-combiner" + ], + "_resolved": "https://registry.nlark.com/through/download/through-2.3.8.tgz", + "_shasum": "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5", + "_spec": "through@~2.3.4", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\stream-combiner", + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "dominictarr.com" + }, + "bugs": { + "url": "https://github.com/dominictarr/through/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "simplified stream construction", + "devDependencies": { + "from": "~0.1.3", + "stream-spec": "~0.3.5", + "tape": "~2.3.2" + }, + "homepage": "https://github.com/dominictarr/through", + "keywords": [ + "stream", + "streams", + "user-streams", + "pipe" + ], + "license": "MIT", + "main": "index.js", + "name": "through", + "repository": { + "type": "git", + "url": "git+https://github.com/dominictarr/through.git" + }, + "scripts": { + "test": "set -e; for t in test/*.js; do node $t; done" + }, + "testling": { + "browsers": [ + "ie/8..latest", + "ff/15..latest", + "chrome/20..latest", + "safari/5.1..latest" + ], + "files": "test/*.js" + }, + "version": "2.3.8" +} diff --git a/packages/字体精简工具/node_modules/through/readme.markdown b/packages/字体精简工具/node_modules/through/readme.markdown new file mode 100644 index 0000000..cb34c81 --- /dev/null +++ b/packages/字体精简工具/node_modules/through/readme.markdown @@ -0,0 +1,64 @@ +#through + +[![build status](https://secure.travis-ci.org/dominictarr/through.png)](http://travis-ci.org/dominictarr/through) +[![testling badge](https://ci.testling.com/dominictarr/through.png)](https://ci.testling.com/dominictarr/through) + +Easy way to create a `Stream` that is both `readable` and `writable`. + +* Pass in optional `write` and `end` methods. +* `through` takes care of pause/resume logic if you use `this.queue(data)` instead of `this.emit('data', data)`. +* Use `this.pause()` and `this.resume()` to manage flow. +* Check `this.paused` to see current flow state. (`write` always returns `!this.paused`). + +This function is the basis for most of the synchronous streams in +[event-stream](http://github.com/dominictarr/event-stream). + +``` js +var through = require('through') + +through(function write(data) { + this.queue(data) //data *must* not be null + }, + function end () { //optional + this.queue(null) + }) +``` + +Or, can also be used _without_ buffering on pause, use `this.emit('data', data)`, +and this.emit('end') + +``` js +var through = require('through') + +through(function write(data) { + this.emit('data', data) + //this.pause() + }, + function end () { //optional + this.emit('end') + }) +``` + +## Extended Options + +You will probably not need these 99% of the time. + +### autoDestroy=false + +By default, `through` emits close when the writable +and readable side of the stream has ended. +If that is not desired, set `autoDestroy=false`. + +``` js +var through = require('through') + +//like this +var ts = through(write, end, {autoDestroy: false}) +//or like this +var ts = through(write, end) +ts.autoDestroy = false +``` + +## License + +MIT / Apache2 diff --git a/packages/字体精简工具/node_modules/through/test/async.js b/packages/字体精简工具/node_modules/through/test/async.js new file mode 100644 index 0000000..46bdbae --- /dev/null +++ b/packages/字体精简工具/node_modules/through/test/async.js @@ -0,0 +1,28 @@ +var from = require('from') +var through = require('../') + +var tape = require('tape') + +tape('simple async example', function (t) { + + var n = 0, expected = [1,2,3,4,5], actual = [] + from(expected) + .pipe(through(function(data) { + this.pause() + n ++ + setTimeout(function(){ + console.log('pushing data', data) + this.push(data) + this.resume() + }.bind(this), 300) + })).pipe(through(function(data) { + console.log('pushing data second time', data); + this.push(data) + })).on('data', function (d) { + actual.push(d) + }).on('end', function() { + t.deepEqual(actual, expected) + t.end() + }) + +}) diff --git a/packages/字体精简工具/node_modules/through/test/auto-destroy.js b/packages/字体精简工具/node_modules/through/test/auto-destroy.js new file mode 100644 index 0000000..9a8fd00 --- /dev/null +++ b/packages/字体精简工具/node_modules/through/test/auto-destroy.js @@ -0,0 +1,30 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('end before close', function (assert) { + var ts = through() + ts.autoDestroy = false + var ended = false, closed = false + + ts.on('end', function () { + assert.ok(!closed) + ended = true + }) + ts.on('close', function () { + assert.ok(ended) + closed = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.ok(ended) + assert.notOk(closed) + ts.destroy() + assert.ok(closed) + assert.end() +}) + diff --git a/packages/字体精简工具/node_modules/through/test/buffering.js b/packages/字体精简工具/node_modules/through/test/buffering.js new file mode 100644 index 0000000..b0084bf --- /dev/null +++ b/packages/字体精简工具/node_modules/through/test/buffering.js @@ -0,0 +1,71 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('buffering', function(assert) { + var ts = through(function (data) { + this.queue(data) + }, function () { + this.queue(null) + }) + + var ended = false, actual = [] + + ts.on('data', actual.push.bind(actual)) + ts.on('end', function () { + ended = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + assert.deepEqual(actual, [1, 2, 3]) + ts.pause() + ts.write(4) + ts.write(5) + ts.write(6) + assert.deepEqual(actual, [1, 2, 3]) + ts.resume() + assert.deepEqual(actual, [1, 2, 3, 4, 5, 6]) + ts.pause() + ts.end() + assert.ok(!ended) + ts.resume() + assert.ok(ended) + assert.end() +}) + +test('buffering has data in queue, when ends', function (assert) { + + /* + * If stream ends while paused with data in the queue, + * stream should still emit end after all data is written + * on resume. + */ + + var ts = through(function (data) { + this.queue(data) + }, function () { + this.queue(null) + }) + + var ended = false, actual = [] + + ts.on('data', actual.push.bind(actual)) + ts.on('end', function () { + ended = true + }) + + ts.pause() + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.deepEqual(actual, [], 'no data written yet, still paused') + assert.ok(!ended, 'end not emitted yet, still paused') + ts.resume() + assert.deepEqual(actual, [1, 2, 3], 'resumed, all data should be delivered') + assert.ok(ended, 'end should be emitted once all data was delivered') + assert.end(); +}) diff --git a/packages/字体精简工具/node_modules/through/test/end.js b/packages/字体精简工具/node_modules/through/test/end.js new file mode 100644 index 0000000..fa113f5 --- /dev/null +++ b/packages/字体精简工具/node_modules/through/test/end.js @@ -0,0 +1,45 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('end before close', function (assert) { + var ts = through() + var ended = false, closed = false + + ts.on('end', function () { + assert.ok(!closed) + ended = true + }) + ts.on('close', function () { + assert.ok(ended) + closed = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.ok(ended) + assert.ok(closed) + assert.end() +}) + +test('end only once', function (t) { + + var ts = through() + var ended = false, closed = false + + ts.on('end', function () { + t.equal(ended, false) + ended = true + }) + + ts.queue(null) + ts.queue(null) + ts.queue(null) + + ts.resume() + + t.end() +}) diff --git a/packages/字体精简工具/node_modules/through/test/index.js b/packages/字体精简工具/node_modules/through/test/index.js new file mode 100644 index 0000000..96da82f --- /dev/null +++ b/packages/字体精简工具/node_modules/through/test/index.js @@ -0,0 +1,133 @@ + +var test = require('tape') +var spec = require('stream-spec') +var through = require('../') + +/* + I'm using these two functions, and not streams and pipe + so there is less to break. if this test fails it must be + the implementation of _through_ +*/ + +function write(array, stream) { + array = array.slice() + function next() { + while(array.length) + if(stream.write(array.shift()) === false) + return stream.once('drain', next) + + stream.end() + } + + next() +} + +function read(stream, callback) { + var actual = [] + stream.on('data', function (data) { + actual.push(data) + }) + stream.once('end', function () { + callback(null, actual) + }) + stream.once('error', function (err) { + callback(err) + }) +} + +test('simple defaults', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = through() + var s = spec(t).through().pausable() + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected) + assert.end() + }) + + t.on('close', s.validate) + + write(expected, t) +}); + +test('simple functions', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = through(function (data) { + this.emit('data', data*2) + }) + var s = spec(t).through().pausable() + + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected.map(function (data) { + return data*2 + })) + assert.end() + }) + + t.on('close', s.validate) + + write(expected, t) +}) + +test('pauses', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l) //Math.random()) + + var t = through() + + var s = spec(t) + .through() + .pausable() + + t.on('data', function () { + if(Math.random() > 0.1) return + t.pause() + process.nextTick(function () { + t.resume() + }) + }) + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected) + }) + + t.on('close', function () { + s.validate() + assert.end() + }) + + write(expected, t) +}) + +test('does not soft-end on `undefined`', function(assert) { + var stream = through() + , count = 0 + + stream.on('data', function (data) { + count++ + }) + + stream.write(undefined) + stream.write(undefined) + + assert.equal(count, 2) + + assert.end() +}) diff --git a/packages/字体精简工具/node_modules/through2-filter/LICENSE b/packages/字体精简工具/node_modules/through2-filter/LICENSE new file mode 100644 index 0000000..540900f --- /dev/null +++ b/packages/字体精简工具/node_modules/through2-filter/LICENSE @@ -0,0 +1,9 @@ +(The MIT License) + +Copyright (c) Bryce B. Baril + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/through2-filter/README.md b/packages/字体精简工具/node_modules/through2-filter/README.md new file mode 100644 index 0000000..9ad00b9 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2-filter/README.md @@ -0,0 +1,79 @@ +through2-filter +=============== + +[![NPM](https://nodei.co/npm/through2-filter.png)](https://nodei.co/npm/through2-filter/) + +This is a super thin wrapper around [through2](http://npm.im/through2) that works like `Array.prototype.filter` but for streams. + +For when through2 is just too verbose :wink: + +Note you will **NOT** be able to alter the content of the chunks. This is intended for filtering only. If you want to modify the stream content, use either `through2` or `through2-map`. + +```js +var filter = require("through2-filter") + +var skip = filter(function (chunk) { + // skip buffers longer than 100 + return chunk.length < 100 +}) + +// vs. with through2: +var skip = through2(function (chunk, encoding, callback) { + // skip buffers longer than 100 + if (chunk.length < 100) this.push(chunk) + return callback() +}) + +// Then use your filter: +source.pipe(skip).pipe(sink) + +// Additionally accepts `wantStrings` argument to conver buffers into strings +var alphanum = new RegExp("^[A-Za-z0-1]+$") +var scrub = filter({wantStrings: true}, function (str) { + return alphanum.exec(str) +}) + +// Works like `Array.prototype.filter` meaning you can specify a function that +// takes up to two* arguments: fn(element, index) +var skip10 = filter(function (element, index) { + return index > 10 +}) +``` + +*Differences from `Array.prototype.filter`: + * No third `array` callback argument. That would require realizing the entire stream, which is generally counter-productive to stream operations. + * `Array.prototype.filter` doesn't modify the source Array, which is somewhat nonsensical when applied to streams. + +API +--- + +`require("through2-filter")([options], fn)` +--- + +Create a `through2-filter` instance that will call `fn(chunk)`. If `fn(chunk)` returns "true" the chunk will be passed downstream. Otherwise it will be dropped. + +`require("through2-filter").ctor([options], fn)` +--- + +Create a `through2-filter` Type that can be instantiated via `new Type()` or `Type()` to create reusable spies. + +`require("through2-filter").obj([options], fn)` +--- + +Create a `through2-filter` that defaults to `objectMode = true`. + +`require("through2-filter").objCtor([options], fn)` +--- + +Create a `through2-filter` Type that defaults to `objectMode = true`. + +Options +------- + + * wantStrings: Automatically call chunk.toString() for the super lazy. + * all other through2 options + +LICENSE +======= + +MIT diff --git a/packages/字体精简工具/node_modules/through2-filter/index.js b/packages/字体精简工具/node_modules/through2-filter/index.js new file mode 100644 index 0000000..9026f6d --- /dev/null +++ b/packages/字体精简工具/node_modules/through2-filter/index.js @@ -0,0 +1,50 @@ +"use strict"; + +module.exports = make +module.exports.ctor = ctor +module.exports.objCtor = objCtor +module.exports.obj = obj + +var through2 = require("through2") +var xtend = require("xtend") + +function ctor(options, fn) { + if (typeof options == "function") { + fn = options + options = {} + } + + var Filter = through2.ctor(options, function (chunk, encoding, callback) { + if (this.options.wantStrings) chunk = chunk.toString() + try { + if (fn.call(this, chunk, this._index++)) this.push(chunk) + return callback() + } catch (e) { + return callback(e) + } + }) + Filter.prototype._index = 0 + return Filter +} + +function objCtor(options, fn) { + if (typeof options === "function") { + fn = options + options = {} + } + options = xtend({objectMode: true, highWaterMark: 16}, options) + return ctor(options, fn) +} + +function make(options, fn) { + return ctor(options, fn)() +} + +function obj(options, fn) { + if (typeof options === "function") { + fn = options + options = {} + } + options = xtend({objectMode: true, highWaterMark: 16}, options) + return make(options, fn) +} diff --git a/packages/字体精简工具/node_modules/through2-filter/package.json b/packages/字体精简工具/node_modules/through2-filter/package.json new file mode 100644 index 0000000..09b36a7 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2-filter/package.json @@ -0,0 +1,76 @@ +{ + "_from": "through2-filter@^3.0.0", + "_id": "through2-filter@3.0.0", + "_inBundle": false, + "_integrity": "sha1-cA54bfI2fCyIzYqlvkz5weeDElQ=", + "_location": "/through2-filter", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "through2-filter@^3.0.0", + "name": "through2-filter", + "escapedName": "through2-filter", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/unique-stream" + ], + "_resolved": "https://registry.npm.taobao.org/through2-filter/download/through2-filter-3.0.0.tgz", + "_shasum": "700e786df2367c2c88cd8aa5be4cf9c1e7831254", + "_spec": "through2-filter@^3.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\unique-stream", + "author": { + "name": "Bryce B. Baril" + }, + "bugs": { + "url": "https://github.com/brycebaril/through2-filter/issues" + }, + "bundleDependencies": false, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + }, + "deprecated": false, + "description": "A through2 to create an Array.prototype.filter analog for streams.", + "devDependencies": { + "concat-stream": "^1.4.7", + "stream-spigot": "^3.0.5", + "tape": "^4.0.0" + }, + "directories": { + "test": "test" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/brycebaril/through2-filter#readme", + "jshintConfig": { + "asi": true, + "globalstrict": true, + "validthis": true, + "eqnull": true, + "node": true, + "loopfunc": true, + "newcap": false, + "eqeqeq": false + }, + "keywords": [ + "streams", + "through", + "through2", + "filter" + ], + "license": "MIT", + "name": "through2-filter", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/brycebaril/through2-filter.git" + }, + "scripts": { + "test": "node test/" + }, + "version": "3.0.0" +} diff --git a/packages/字体精简工具/node_modules/through2/.npmignore b/packages/字体精简工具/node_modules/through2/.npmignore new file mode 100644 index 0000000..1e1dcab --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/.npmignore @@ -0,0 +1,3 @@ +test +.jshintrc +.travis.yml \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/LICENSE b/packages/字体精简工具/node_modules/through2/LICENSE new file mode 100644 index 0000000..f6a0029 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/LICENSE @@ -0,0 +1,39 @@ +Copyright 2013, Rod Vagg (the "Original Author") +All rights reserved. + +MIT +no-false-attribs License + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +Distributions of all or part of the Software intended to be used +by the recipients as they would use the unmodified Software, +containing modifications that substantially alter, remove, or +disable functionality of the Software, outside of the documented +configuration mechanisms provided by the Software, shall be +modified such that the Original Author's bug reporting email +addresses and urls are either replaced with the contact information +of the parties responsible for the changes, or removed entirely. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +Except where noted, this license applies to any and all software +programs and associated documentation files created by the +Original Author, when distributed with the Software. \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/README.md b/packages/字体精简工具/node_modules/through2/README.md new file mode 100644 index 0000000..c84b346 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/README.md @@ -0,0 +1,133 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', function (data) { + all.push(data) + }) + .on('end', function () { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + function (chunk, enc, cb) { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + function (chunk, enc, cb) { cb(null, chunk) }, // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) 2013 Rod Vagg [@rvagg](https://twitter.com/rvagg) and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/.travis.yml b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/.travis.yml new file mode 100644 index 0000000..36201b1 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/.travis.yml @@ -0,0 +1,12 @@ +language: node_js +node_js: + - "0.8" + - "0.10" + - "0.11" + - "0.12" + - "1.7.1" + - 1 + - 2 + - 3 + - 4 + - 5 diff --git a/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/index.js b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/index.js new file mode 100644 index 0000000..a4f40f8 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/index.js @@ -0,0 +1,43 @@ +'use strict'; + +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = nextTick; +} else { + module.exports = process.nextTick; +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} diff --git a/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/license.md b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/license.md new file mode 100644 index 0000000..c67e353 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/license.md @@ -0,0 +1,19 @@ +# Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** diff --git a/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/package.json b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/package.json new file mode 100644 index 0000000..efa0507 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/package.json @@ -0,0 +1,47 @@ +{ + "_from": "process-nextick-args@~1.0.6", + "_id": "process-nextick-args@1.0.7", + "_inBundle": false, + "_integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "_location": "/through2/process-nextick-args", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "process-nextick-args@~1.0.6", + "name": "process-nextick-args", + "escapedName": "process-nextick-args", + "rawSpec": "~1.0.6", + "saveSpec": null, + "fetchSpec": "~1.0.6" + }, + "_requiredBy": [ + "/through2/readable-stream" + ], + "_resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz", + "_shasum": "150e20b756590ad3f91093f25a4f2ad8bff30ba3", + "_spec": "process-nextick-args@~1.0.6", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\through2\\node_modules\\readable-stream", + "author": "", + "bugs": { + "url": "https://github.com/calvinmetcalf/process-nextick-args/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "process.nextTick but always with args", + "devDependencies": { + "tap": "~0.2.6" + }, + "homepage": "https://github.com/calvinmetcalf/process-nextick-args", + "license": "MIT", + "main": "index.js", + "name": "process-nextick-args", + "repository": { + "type": "git", + "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git" + }, + "scripts": { + "test": "node test.js" + }, + "version": "1.0.7" +} diff --git a/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/readme.md b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/readme.md new file mode 100644 index 0000000..78e7cfa --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/readme.md @@ -0,0 +1,18 @@ +process-nextick-args +===== + +[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args) + +```bash +npm install --save process-nextick-args +``` + +Always be able to pass arguments to process.nextTick, no matter the platform + +```js +var nextTick = require('process-nextick-args'); + +nextTick(function (a, b, c) { + console.log(a, b, c); +}, 'step', 3, 'profit'); +``` diff --git a/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/test.js b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/test.js new file mode 100644 index 0000000..ef15721 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/process-nextick-args/test.js @@ -0,0 +1,24 @@ +var test = require("tap").test; +var nextTick = require('./'); + +test('should work', function (t) { + t.plan(5); + nextTick(function (a) { + t.ok(a); + nextTick(function (thing) { + t.equals(thing, 7); + }, 7); + }, true); + nextTick(function (a, b, c) { + t.equals(a, 'step'); + t.equals(b, 3); + t.equals(c, 'profit'); + }, 'step', 3, 'profit'); +}); + +test('correct number of arguments', function (t) { + t.plan(1); + nextTick(function () { + t.equals(2, arguments.length, 'correct number'); + }, 1, 2); +}); diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.npmignore b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.npmignore new file mode 100644 index 0000000..38344f8 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.npmignore @@ -0,0 +1,5 @@ +build/ +test/ +examples/ +fs.js +zlib.js \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.travis.yml b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000..1b82118 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.travis.yml @@ -0,0 +1,52 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - npm install -g npm +notifications: + email: false +matrix: + fast_finish: true + allow_failures: + - env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest" + - env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest" + include: + - node_js: '0.8' + env: TASK=test + - node_js: '0.10' + env: TASK=test + - node_js: '0.11' + env: TASK=test + - node_js: '0.12' + env: TASK=test + - node_js: 1 + env: TASK=test + - node_js: 2 + env: TASK=test + - node_js: 3 + env: TASK=test + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 5 + env: TASK=browser BROWSER_NAME=android BROWSER_VERSION="4.0..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=ie BROWSER_VERSION="9..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=opera BROWSER_VERSION="11..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=chrome BROWSER_VERSION="-3..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=firefox BROWSER_VERSION="-3..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=safari BROWSER_VERSION="5..latest" +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.zuul.yml b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.zuul.yml new file mode 100644 index 0000000..96d9cfb --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/.zuul.yml @@ -0,0 +1 @@ +ui: tape diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/LICENSE b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000..e3d4e69 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/README.md b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/README.md new file mode 100644 index 0000000..86b95a3 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/README.md @@ -0,0 +1,36 @@ +# readable-stream + +***Node-core v5.8.0 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core, including [documentation](doc/stream.markdown). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams WG Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/doc/stream.markdown b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/doc/stream.markdown new file mode 100644 index 0000000..0bc3819 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/doc/stream.markdown @@ -0,0 +1,1760 @@ +# Stream + + Stability: 2 - Stable + +A stream is an abstract interface implemented by various objects in +Node.js. For example a [request to an HTTP server][http-incoming-message] is a +stream, as is [`process.stdout`][]. Streams are readable, writable, or both. All +streams are instances of [`EventEmitter`][]. + +You can load the Stream base classes by doing `require('stream')`. +There are base classes provided for [Readable][] streams, [Writable][] +streams, [Duplex][] streams, and [Transform][] streams. + +This document is split up into 3 sections: + +1. The first section explains the parts of the API that you need to be + aware of to use streams in your programs. +2. The second section explains the parts of the API that you need to + use if you implement your own custom streams yourself. The API is designed to + make this easy for you to do. +3. The third section goes into more depth about how streams work, + including some of the internal mechanisms and functions that you + should probably not modify unless you definitely know what you are + doing. + + +## API for Stream Consumers + + + +Streams can be either [Readable][], [Writable][], or both ([Duplex][]). + +All streams are EventEmitters, but they also have other custom methods +and properties depending on whether they are Readable, Writable, or +Duplex. + +If a stream is both Readable and Writable, then it implements all of +the methods and events. So, a [Duplex][] or [Transform][] stream is +fully described by this API, though their implementation may be +somewhat different. + +It is not necessary to implement Stream interfaces in order to consume +streams in your programs. If you **are** implementing streaming +interfaces in your own program, please also refer to +[API for Stream Implementors][]. + +Almost all Node.js programs, no matter how simple, use Streams in some +way. Here is an example of using Streams in an Node.js program: + +```js +const http = require('http'); + +var server = http.createServer( (req, res) => { + // req is an http.IncomingMessage, which is a Readable Stream + // res is an http.ServerResponse, which is a Writable Stream + + var body = ''; + // we want to get the data as utf8 strings + // If you don't set an encoding, then you'll get Buffer objects + req.setEncoding('utf8'); + + // Readable streams emit 'data' events once a listener is added + req.on('data', (chunk) => { + body += chunk; + }); + + // the end event tells you that you have entire body + req.on('end', () => { + try { + var data = JSON.parse(body); + } catch (er) { + // uh oh! bad json! + res.statusCode = 400; + return res.end(`error: ${er.message}`); + } + + // write back something interesting to the user: + res.write(typeof data); + res.end(); + }); +}); + +server.listen(1337); + +// $ curl localhost:1337 -d '{}' +// object +// $ curl localhost:1337 -d '"foo"' +// string +// $ curl localhost:1337 -d 'not json' +// error: Unexpected token o +``` + +### Class: stream.Duplex + +Duplex streams are streams that implement both the [Readable][] and +[Writable][] interfaces. + +Examples of Duplex streams include: + +* [TCP sockets][] +* [zlib streams][zlib] +* [crypto streams][crypto] + +### Class: stream.Readable + + + +The Readable stream interface is the abstraction for a *source* of +data that you are reading from. In other words, data comes *out* of a +Readable stream. + +A Readable stream will not start emitting data until you indicate that +you are ready to receive it. + +Readable streams have two "modes": a **flowing mode** and a **paused +mode**. When in flowing mode, data is read from the underlying system +and provided to your program as fast as possible. In paused mode, you +must explicitly call [`stream.read()`][stream-read] to get chunks of data out. +Streams start out in paused mode. + +**Note**: If no data event handlers are attached, and there are no +[`stream.pipe()`][] destinations, and the stream is switched into flowing +mode, then data will be lost. + +You can switch to flowing mode by doing any of the following: + +* Adding a [`'data'`][] event handler to listen for data. +* Calling the [`stream.resume()`][stream-resume] method to explicitly open the + flow. +* Calling the [`stream.pipe()`][] method to send the data to a [Writable][]. + +You can switch back to paused mode by doing either of the following: + +* If there are no pipe destinations, by calling the + [`stream.pause()`][stream-pause] method. +* If there are pipe destinations, by removing any [`'data'`][] event + handlers, and removing all pipe destinations by calling the + [`stream.unpipe()`][] method. + +Note that, for backwards compatibility reasons, removing [`'data'`][] +event handlers will **not** automatically pause the stream. Also, if +there are piped destinations, then calling [`stream.pause()`][stream-pause] will +not guarantee that the stream will *remain* paused once those +destinations drain and ask for more data. + +Examples of readable streams include: + +* [HTTP responses, on the client][http-incoming-message] +* [HTTP requests, on the server][http-incoming-message] +* [fs read streams][] +* [zlib streams][zlib] +* [crypto streams][crypto] +* [TCP sockets][] +* [child process stdout and stderr][] +* [`process.stdin`][] + +#### Event: 'close' + +Emitted when the stream and any of its underlying resources (a file +descriptor, for example) have been closed. The event indicates that +no more events will be emitted, and no further computation will occur. + +Not all streams will emit the `'close'` event. + +#### Event: 'data' + +* `chunk` {Buffer|String} The chunk of data. + +Attaching a `'data'` event listener to a stream that has not been +explicitly paused will switch the stream into flowing mode. Data will +then be passed as soon as it is available. + +If you just want to get all the data out of the stream as fast as +possible, this is the best way to do so. + +```js +var readable = getReadableStreamSomehow(); +readable.on('data', (chunk) => { + console.log('got %d bytes of data', chunk.length); +}); +``` + +#### Event: 'end' + +This event fires when there will be no more data to read. + +Note that the `'end'` event **will not fire** unless the data is +completely consumed. This can be done by switching into flowing mode, +or by calling [`stream.read()`][stream-read] repeatedly until you get to the +end. + +```js +var readable = getReadableStreamSomehow(); +readable.on('data', (chunk) => { + console.log('got %d bytes of data', chunk.length); +}); +readable.on('end', () => { + console.log('there will be no more data.'); +}); +``` + +#### Event: 'error' + +* {Error Object} + +Emitted if there was an error receiving data. + +#### Event: 'readable' + +When a chunk of data can be read from the stream, it will emit a +`'readable'` event. + +In some cases, listening for a `'readable'` event will cause some data +to be read into the internal buffer from the underlying system, if it +hadn't already. + +```javascript +var readable = getReadableStreamSomehow(); +readable.on('readable', () => { + // there is some data to read now +}); +``` + +Once the internal buffer is drained, a `'readable'` event will fire +again when more data is available. + +The `'readable'` event is not emitted in the "flowing" mode with the +sole exception of the last one, on end-of-stream. + +The `'readable'` event indicates that the stream has new information: +either new data is available or the end of the stream has been reached. +In the former case, [`stream.read()`][stream-read] will return that data. In the +latter case, [`stream.read()`][stream-read] will return null. For instance, in +the following example, `foo.txt` is an empty file: + +```js +const fs = require('fs'); +var rr = fs.createReadStream('foo.txt'); +rr.on('readable', () => { + console.log('readable:', rr.read()); +}); +rr.on('end', () => { + console.log('end'); +}); +``` + +The output of running this script is: + +``` +$ node test.js +readable: null +end +``` + +#### readable.isPaused() + +* Return: {Boolean} + +This method returns whether or not the `readable` has been **explicitly** +paused by client code (using [`stream.pause()`][stream-pause] without a +corresponding [`stream.resume()`][stream-resume]). + +```js +var readable = new stream.Readable + +readable.isPaused() // === false +readable.pause() +readable.isPaused() // === true +readable.resume() +readable.isPaused() // === false +``` + +#### readable.pause() + +* Return: `this` + +This method will cause a stream in flowing mode to stop emitting +[`'data'`][] events, switching out of flowing mode. Any data that becomes +available will remain in the internal buffer. + +```js +var readable = getReadableStreamSomehow(); +readable.on('data', (chunk) => { + console.log('got %d bytes of data', chunk.length); + readable.pause(); + console.log('there will be no more data for 1 second'); + setTimeout(() => { + console.log('now data will start flowing again'); + readable.resume(); + }, 1000); +}); +``` + +#### readable.pipe(destination[, options]) + +* `destination` {stream.Writable} The destination for writing data +* `options` {Object} Pipe options + * `end` {Boolean} End the writer when the reader ends. Default = `true` + +This method pulls all the data out of a readable stream, and writes it +to the supplied destination, automatically managing the flow so that +the destination is not overwhelmed by a fast readable stream. + +Multiple destinations can be piped to safely. + +```js +var readable = getReadableStreamSomehow(); +var writable = fs.createWriteStream('file.txt'); +// All the data from readable goes into 'file.txt' +readable.pipe(writable); +``` + +This function returns the destination stream, so you can set up pipe +chains like so: + +```js +var r = fs.createReadStream('file.txt'); +var z = zlib.createGzip(); +var w = fs.createWriteStream('file.txt.gz'); +r.pipe(z).pipe(w); +``` + +For example, emulating the Unix `cat` command: + +```js +process.stdin.pipe(process.stdout); +``` + +By default [`stream.end()`][stream-end] is called on the destination when the +source stream emits [`'end'`][], so that `destination` is no longer writable. +Pass `{ end: false }` as `options` to keep the destination stream open. + +This keeps `writer` open so that "Goodbye" can be written at the +end. + +```js +reader.pipe(writer, { end: false }); +reader.on('end', () => { + writer.end('Goodbye\n'); +}); +``` + +Note that [`process.stderr`][] and [`process.stdout`][] are never closed until +the process exits, regardless of the specified options. + +#### readable.read([size]) + +* `size` {Number} Optional argument to specify how much data to read. +* Return {String|Buffer|Null} + +The `read()` method pulls some data out of the internal buffer and +returns it. If there is no data available, then it will return +`null`. + +If you pass in a `size` argument, then it will return that many +bytes. If `size` bytes are not available, then it will return `null`, +unless we've ended, in which case it will return the data remaining +in the buffer. + +If you do not specify a `size` argument, then it will return all the +data in the internal buffer. + +This method should only be called in paused mode. In flowing mode, +this method is called automatically until the internal buffer is +drained. + +```js +var readable = getReadableStreamSomehow(); +readable.on('readable', () => { + var chunk; + while (null !== (chunk = readable.read())) { + console.log('got %d bytes of data', chunk.length); + } +}); +``` + +If this method returns a data chunk, then it will also trigger the +emission of a [`'data'`][] event. + +Note that calling [`stream.read([size])`][stream-read] after the [`'end'`][] +event has been triggered will return `null`. No runtime error will be raised. + +#### readable.resume() + +* Return: `this` + +This method will cause the readable stream to resume emitting [`'data'`][] +events. + +This method will switch the stream into flowing mode. If you do *not* +want to consume the data from a stream, but you *do* want to get to +its [`'end'`][] event, you can call [`stream.resume()`][stream-resume] to open +the flow of data. + +```js +var readable = getReadableStreamSomehow(); +readable.resume(); +readable.on('end', () => { + console.log('got to the end, but did not read anything'); +}); +``` + +#### readable.setEncoding(encoding) + +* `encoding` {String} The encoding to use. +* Return: `this` + +Call this function to cause the stream to return strings of the specified +encoding instead of Buffer objects. For example, if you do +`readable.setEncoding('utf8')`, then the output data will be interpreted as +UTF-8 data, and returned as strings. If you do `readable.setEncoding('hex')`, +then the data will be encoded in hexadecimal string format. + +This properly handles multi-byte characters that would otherwise be +potentially mangled if you simply pulled the Buffers directly and +called [`buf.toString(encoding)`][] on them. If you want to read the data +as strings, always use this method. + +Also you can disable any encoding at all with `readable.setEncoding(null)`. +This approach is very useful if you deal with binary data or with large +multi-byte strings spread out over multiple chunks. + +```js +var readable = getReadableStreamSomehow(); +readable.setEncoding('utf8'); +readable.on('data', (chunk) => { + assert.equal(typeof chunk, 'string'); + console.log('got %d characters of string data', chunk.length); +}); +``` + +#### readable.unpipe([destination]) + +* `destination` {stream.Writable} Optional specific stream to unpipe + +This method will remove the hooks set up for a previous [`stream.pipe()`][] +call. + +If the destination is not specified, then all pipes are removed. + +If the destination is specified, but no pipe is set up for it, then +this is a no-op. + +```js +var readable = getReadableStreamSomehow(); +var writable = fs.createWriteStream('file.txt'); +// All the data from readable goes into 'file.txt', +// but only for the first second +readable.pipe(writable); +setTimeout(() => { + console.log('stop writing to file.txt'); + readable.unpipe(writable); + console.log('manually close the file stream'); + writable.end(); +}, 1000); +``` + +#### readable.unshift(chunk) + +* `chunk` {Buffer|String} Chunk of data to unshift onto the read queue + +This is useful in certain cases where a stream is being consumed by a +parser, which needs to "un-consume" some data that it has +optimistically pulled out of the source, so that the stream can be +passed on to some other party. + +Note that `stream.unshift(chunk)` cannot be called after the [`'end'`][] event +has been triggered; a runtime error will be raised. + +If you find that you must often call `stream.unshift(chunk)` in your +programs, consider implementing a [Transform][] stream instead. (See [API +for Stream Implementors][].) + +```js +// Pull off a header delimited by \n\n +// use unshift() if we get too much +// Call the callback with (error, header, stream) +const StringDecoder = require('string_decoder').StringDecoder; +function parseHeader(stream, callback) { + stream.on('error', callback); + stream.on('readable', onReadable); + var decoder = new StringDecoder('utf8'); + var header = ''; + function onReadable() { + var chunk; + while (null !== (chunk = stream.read())) { + var str = decoder.write(chunk); + if (str.match(/\n\n/)) { + // found the header boundary + var split = str.split(/\n\n/); + header += split.shift(); + var remaining = split.join('\n\n'); + var buf = new Buffer(remaining, 'utf8'); + if (buf.length) + stream.unshift(buf); + stream.removeListener('error', callback); + stream.removeListener('readable', onReadable); + // now the body of the message can be read from the stream. + callback(null, header, stream); + } else { + // still reading the header. + header += str; + } + } + } +} +``` + +Note that, unlike [`stream.push(chunk)`][stream-push], `stream.unshift(chunk)` +will not end the reading process by resetting the internal reading state of the +stream. This can cause unexpected results if `unshift()` is called during a +read (i.e. from within a [`stream._read()`][stream-_read] implementation on a +custom stream). Following the call to `unshift()` with an immediate +[`stream.push('')`][stream-push] will reset the reading state appropriately, +however it is best to simply avoid calling `unshift()` while in the process of +performing a read. + +#### readable.wrap(stream) + +* `stream` {Stream} An "old style" readable stream + +Versions of Node.js prior to v0.10 had streams that did not implement the +entire Streams API as it is today. (See [Compatibility][] for +more information.) + +If you are using an older Node.js library that emits [`'data'`][] events and +has a [`stream.pause()`][stream-pause] method that is advisory only, then you +can use the `wrap()` method to create a [Readable][] stream that uses the old +stream as its data source. + +You will very rarely ever need to call this function, but it exists +as a convenience for interacting with old Node.js programs and libraries. + +For example: + +```js +const OldReader = require('./old-api-module.js').OldReader; +const Readable = require('stream').Readable; +const oreader = new OldReader; +const myReader = new Readable().wrap(oreader); + +myReader.on('readable', () => { + myReader.read(); // etc. +}); +``` + +### Class: stream.Transform + +Transform streams are [Duplex][] streams where the output is in some way +computed from the input. They implement both the [Readable][] and +[Writable][] interfaces. + +Examples of Transform streams include: + +* [zlib streams][zlib] +* [crypto streams][crypto] + +### Class: stream.Writable + + + +The Writable stream interface is an abstraction for a *destination* +that you are writing data *to*. + +Examples of writable streams include: + +* [HTTP requests, on the client][] +* [HTTP responses, on the server][] +* [fs write streams][] +* [zlib streams][zlib] +* [crypto streams][crypto] +* [TCP sockets][] +* [child process stdin][] +* [`process.stdout`][], [`process.stderr`][] + +#### Event: 'drain' + +If a [`stream.write(chunk)`][stream-write] call returns `false`, then the +`'drain'` event will indicate when it is appropriate to begin writing more data +to the stream. + +```js +// Write the data to the supplied writable stream one million times. +// Be attentive to back-pressure. +function writeOneMillionTimes(writer, data, encoding, callback) { + var i = 1000000; + write(); + function write() { + var ok = true; + do { + i -= 1; + if (i === 0) { + // last time! + writer.write(data, encoding, callback); + } else { + // see if we should continue, or wait + // don't pass the callback, because we're not done yet. + ok = writer.write(data, encoding); + } + } while (i > 0 && ok); + if (i > 0) { + // had to stop early! + // write some more once it drains + writer.once('drain', write); + } + } +} +``` + +#### Event: 'error' + +* {Error} + +Emitted if there was an error when writing or piping data. + +#### Event: 'finish' + +When the [`stream.end()`][stream-end] method has been called, and all data has +been flushed to the underlying system, this event is emitted. + +```javascript +var writer = getWritableStreamSomehow(); +for (var i = 0; i < 100; i ++) { + writer.write('hello, #${i}!\n'); +} +writer.end('this is the end\n'); +writer.on('finish', () => { + console.error('all writes are now complete.'); +}); +``` + +#### Event: 'pipe' + +* `src` {stream.Readable} source stream that is piping to this writable + +This is emitted whenever the [`stream.pipe()`][] method is called on a readable +stream, adding this writable to its set of destinations. + +```js +var writer = getWritableStreamSomehow(); +var reader = getReadableStreamSomehow(); +writer.on('pipe', (src) => { + console.error('something is piping into the writer'); + assert.equal(src, reader); +}); +reader.pipe(writer); +``` + +#### Event: 'unpipe' + +* `src` {[Readable][] Stream} The source stream that + [unpiped][`stream.unpipe()`] this writable + +This is emitted whenever the [`stream.unpipe()`][] method is called on a +readable stream, removing this writable from its set of destinations. + +```js +var writer = getWritableStreamSomehow(); +var reader = getReadableStreamSomehow(); +writer.on('unpipe', (src) => { + console.error('something has stopped piping into the writer'); + assert.equal(src, reader); +}); +reader.pipe(writer); +reader.unpipe(writer); +``` + +#### writable.cork() + +Forces buffering of all writes. + +Buffered data will be flushed either at [`stream.uncork()`][] or at +[`stream.end()`][stream-end] call. + +#### writable.end([chunk][, encoding][, callback]) + +* `chunk` {String|Buffer} Optional data to write +* `encoding` {String} The encoding, if `chunk` is a String +* `callback` {Function} Optional callback for when the stream is finished + +Call this method when no more data will be written to the stream. If supplied, +the callback is attached as a listener on the [`'finish'`][] event. + +Calling [`stream.write()`][stream-write] after calling +[`stream.end()`][stream-end] will raise an error. + +```js +// write 'hello, ' and then end with 'world!' +var file = fs.createWriteStream('example.txt'); +file.write('hello, '); +file.end('world!'); +// writing more now is not allowed! +``` + +#### writable.setDefaultEncoding(encoding) + +* `encoding` {String} The new default encoding + +Sets the default encoding for a writable stream. + +#### writable.uncork() + +Flush all data, buffered since [`stream.cork()`][] call. + +#### writable.write(chunk[, encoding][, callback]) + +* `chunk` {String|Buffer} The data to write +* `encoding` {String} The encoding, if `chunk` is a String +* `callback` {Function} Callback for when this chunk of data is flushed +* Returns: {Boolean} `true` if the data was handled completely. + +This method writes some data to the underlying system, and calls the +supplied callback once the data has been fully handled. + +The return value indicates if you should continue writing right now. +If the data had to be buffered internally, then it will return +`false`. Otherwise, it will return `true`. + +This return value is strictly advisory. You MAY continue to write, +even if it returns `false`. However, writes will be buffered in +memory, so it is best not to do this excessively. Instead, wait for +the [`'drain'`][] event before writing more data. + + +## API for Stream Implementors + + + +To implement any sort of stream, the pattern is the same: + +1. Extend the appropriate parent class in your own subclass. (The + [`util.inherits()`][] method is particularly helpful for this.) +2. Call the appropriate parent class constructor in your constructor, + to be sure that the internal mechanisms are set up properly. +3. Implement one or more specific methods, as detailed below. + +The class to extend and the method(s) to implement depend on the sort +of stream class you are writing: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Use-case

+
+

Class

+
+

Method(s) to implement

+
+

Reading only

+
+

[Readable](#stream_class_stream_readable_1)

+
+

[_read][stream-_read]

+
+

Writing only

+
+

[Writable](#stream_class_stream_writable_1)

+
+

[_write][stream-_write], [_writev][stream-_writev]

+
+

Reading and writing

+
+

[Duplex](#stream_class_stream_duplex_1)

+
+

[_read][stream-_read], [_write][stream-_write], [_writev][stream-_writev]

+
+

Operate on written data, then read the result

+
+

[Transform](#stream_class_stream_transform_1)

+
+

[_transform][stream-_transform], [_flush][stream-_flush]

+
+ +In your implementation code, it is very important to never call the methods +described in [API for Stream Consumers][]. Otherwise, you can potentially cause +adverse side effects in programs that consume your streaming interfaces. + +### Class: stream.Duplex + + + +A "duplex" stream is one that is both Readable and Writable, such as a TCP +socket connection. + +Note that `stream.Duplex` is an abstract class designed to be extended +with an underlying implementation of the [`stream._read(size)`][stream-_read] +and [`stream._write(chunk, encoding, callback)`][stream-_write] methods as you +would with a Readable or Writable stream class. + +Since JavaScript doesn't have multiple prototypal inheritance, this class +prototypally inherits from Readable, and then parasitically from Writable. It is +thus up to the user to implement both the low-level +[`stream._read(n)`][stream-_read] method as well as the low-level +[`stream._write(chunk, encoding, callback)`][stream-_write] method on extension +duplex classes. + +#### new stream.Duplex(options) + +* `options` {Object} Passed to both Writable and Readable + constructors. Also has the following fields: + * `allowHalfOpen` {Boolean} Default = `true`. If set to `false`, then + the stream will automatically end the readable side when the + writable side ends and vice versa. + * `readableObjectMode` {Boolean} Default = `false`. Sets `objectMode` + for readable side of the stream. Has no effect if `objectMode` + is `true`. + * `writableObjectMode` {Boolean} Default = `false`. Sets `objectMode` + for writable side of the stream. Has no effect if `objectMode` + is `true`. + +In classes that extend the Duplex class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +### Class: stream.PassThrough + +This is a trivial implementation of a [Transform][] stream that simply +passes the input bytes across to the output. Its purpose is mainly +for examples and testing, but there are occasionally use cases where +it can come in handy as a building block for novel sorts of streams. + +### Class: stream.Readable + + + +`stream.Readable` is an abstract class designed to be extended with an +underlying implementation of the [`stream._read(size)`][stream-_read] method. + +Please see [API for Stream Consumers][] for how to consume +streams in your programs. What follows is an explanation of how to +implement Readable streams in your programs. + +#### new stream.Readable([options]) + +* `options` {Object} + * `highWaterMark` {Number} The maximum number of bytes to store in + the internal buffer before ceasing to read from the underlying + resource. Default = `16384` (16kb), or `16` for `objectMode` streams + * `encoding` {String} If specified, then buffers will be decoded to + strings using the specified encoding. Default = `null` + * `objectMode` {Boolean} Whether this stream should behave + as a stream of objects. Meaning that [`stream.read(n)`][stream-read] returns + a single value instead of a Buffer of size n. Default = `false` + * `read` {Function} Implementation for the [`stream._read()`][stream-_read] + method. + +In classes that extend the Readable class, make sure to call the +Readable constructor so that the buffering settings can be properly +initialized. + +#### readable.\_read(size) + +* `size` {Number} Number of bytes to read asynchronously + +Note: **Implement this method, but do NOT call it directly.** + +This method is prefixed with an underscore because it is internal to the +class that defines it and should only be called by the internal Readable +class methods. All Readable stream implementations must provide a \_read +method to fetch data from the underlying resource. + +When `_read()` is called, if data is available from the resource, the `_read()` +implementation should start pushing that data into the read queue by calling +[`this.push(dataChunk)`][stream-push]. `_read()` should continue reading from +the resource and pushing data until push returns `false`, at which point it +should stop reading from the resource. Only when `_read()` is called again after +it has stopped should it start reading more data from the resource and pushing +that data onto the queue. + +Note: once the `_read()` method is called, it will not be called again until +the [`stream.push()`][stream-push] method is called. + +The `size` argument is advisory. Implementations where a "read" is a +single call that returns data can use this to know how much data to +fetch. Implementations where that is not relevant, such as TCP or +TLS, may ignore this argument, and simply provide data whenever it +becomes available. There is no need, for example to "wait" until +`size` bytes are available before calling [`stream.push(chunk)`][stream-push]. + +#### readable.push(chunk[, encoding]) + + +* `chunk` {Buffer|Null|String} Chunk of data to push into the read queue +* `encoding` {String} Encoding of String chunks. Must be a valid + Buffer encoding, such as `'utf8'` or `'ascii'` +* return {Boolean} Whether or not more pushes should be performed + +Note: **This method should be called by Readable implementors, NOT +by consumers of Readable streams.** + +If a value other than null is passed, The `push()` method adds a chunk of data +into the queue for subsequent stream processors to consume. If `null` is +passed, it signals the end of the stream (EOF), after which no more data +can be written. + +The data added with `push()` can be pulled out by calling the +[`stream.read()`][stream-read] method when the [`'readable'`][] event fires. + +This API is designed to be as flexible as possible. For example, +you may be wrapping a lower-level source which has some sort of +pause/resume mechanism, and a data callback. In those cases, you +could wrap the low-level source object by doing something like this: + +```js +// source is an object with readStop() and readStart() methods, +// and an `ondata` member that gets called when it has data, and +// an `onend` member that gets called when the data is over. + +util.inherits(SourceWrapper, Readable); + +function SourceWrapper(options) { + Readable.call(this, options); + + this._source = getLowlevelSourceObject(); + + // Every time there's data, we push it into the internal buffer. + this._source.ondata = (chunk) => { + // if push() returns false, then we need to stop reading from source + if (!this.push(chunk)) + this._source.readStop(); + }; + + // When the source ends, we push the EOF-signaling `null` chunk + this._source.onend = () => { + this.push(null); + }; +} + +// _read will be called when the stream wants to pull more data in +// the advisory size argument is ignored in this case. +SourceWrapper.prototype._read = function(size) { + this._source.readStart(); +}; +``` + +#### Example: A Counting Stream + + + +This is a basic example of a Readable stream. It emits the numerals +from 1 to 1,000,000 in ascending order, and then ends. + +```js +const Readable = require('stream').Readable; +const util = require('util'); +util.inherits(Counter, Readable); + +function Counter(opt) { + Readable.call(this, opt); + this._max = 1000000; + this._index = 1; +} + +Counter.prototype._read = function() { + var i = this._index++; + if (i > this._max) + this.push(null); + else { + var str = '' + i; + var buf = new Buffer(str, 'ascii'); + this.push(buf); + } +}; +``` + +#### Example: SimpleProtocol v1 (Sub-optimal) + +This is similar to the `parseHeader` function described +[here](#stream_readable_unshift_chunk), but implemented as a custom stream. +Also, note that this implementation does not convert the incoming data to a +string. + +However, this would be better implemented as a [Transform][] stream. See +[SimpleProtocol v2][] for a better implementation. + +```js +// A parser for a simple data protocol. +// The "header" is a JSON object, followed by 2 \n characters, and +// then a message body. +// +// NOTE: This can be done more simply as a Transform stream! +// Using Readable directly for this is sub-optimal. See the +// alternative example below under the Transform section. + +const Readable = require('stream').Readable; +const util = require('util'); + +util.inherits(SimpleProtocol, Readable); + +function SimpleProtocol(source, options) { + if (!(this instanceof SimpleProtocol)) + return new SimpleProtocol(source, options); + + Readable.call(this, options); + this._inBody = false; + this._sawFirstCr = false; + + // source is a readable stream, such as a socket or file + this._source = source; + + var self = this; + source.on('end', () => { + self.push(null); + }); + + // give it a kick whenever the source is readable + // read(0) will not consume any bytes + source.on('readable', () => { + self.read(0); + }); + + this._rawHeader = []; + this.header = null; +} + +SimpleProtocol.prototype._read = function(n) { + if (!this._inBody) { + var chunk = this._source.read(); + + // if the source doesn't have data, we don't have data yet. + if (chunk === null) + return this.push(''); + + // check if the chunk has a \n\n + var split = -1; + for (var i = 0; i < chunk.length; i++) { + if (chunk[i] === 10) { // '\n' + if (this._sawFirstCr) { + split = i; + break; + } else { + this._sawFirstCr = true; + } + } else { + this._sawFirstCr = false; + } + } + + if (split === -1) { + // still waiting for the \n\n + // stash the chunk, and try again. + this._rawHeader.push(chunk); + this.push(''); + } else { + this._inBody = true; + var h = chunk.slice(0, split); + this._rawHeader.push(h); + var header = Buffer.concat(this._rawHeader).toString(); + try { + this.header = JSON.parse(header); + } catch (er) { + this.emit('error', new Error('invalid simple protocol data')); + return; + } + // now, because we got some extra data, unshift the rest + // back into the read queue so that our consumer will see it. + var b = chunk.slice(split); + this.unshift(b); + // calling unshift by itself does not reset the reading state + // of the stream; since we're inside _read, doing an additional + // push('') will reset the state appropriately. + this.push(''); + + // and let them know that we are done parsing the header. + this.emit('header', this.header); + } + } else { + // from there on, just provide the data to our consumer. + // careful not to push(null), since that would indicate EOF. + var chunk = this._source.read(); + if (chunk) this.push(chunk); + } +}; + +// Usage: +// var parser = new SimpleProtocol(source); +// Now parser is a readable stream that will emit 'header' +// with the parsed header data. +``` + +### Class: stream.Transform + +A "transform" stream is a duplex stream where the output is causally +connected in some way to the input, such as a [zlib][] stream or a +[crypto][] stream. + +There is no requirement that the output be the same size as the input, +the same number of chunks, or arrive at the same time. For example, a +Hash stream will only ever have a single chunk of output which is +provided when the input is ended. A zlib stream will produce output +that is either much smaller or much larger than its input. + +Rather than implement the [`stream._read()`][stream-_read] and +[`stream._write()`][stream-_write] methods, Transform classes must implement the +[`stream._transform()`][stream-_transform] method, and may optionally +also implement the [`stream._flush()`][stream-_flush] method. (See below.) + +#### new stream.Transform([options]) + +* `options` {Object} Passed to both Writable and Readable + constructors. Also has the following fields: + * `transform` {Function} Implementation for the + [`stream._transform()`][stream-_transform] method. + * `flush` {Function} Implementation for the [`stream._flush()`][stream-_flush] + method. + +In classes that extend the Transform class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +#### Events: 'finish' and 'end' + +The [`'finish'`][] and [`'end'`][] events are from the parent Writable +and Readable classes respectively. The `'finish'` event is fired after +[`stream.end()`][stream-end] is called and all chunks have been processed by +[`stream._transform()`][stream-_transform], `'end'` is fired after all data has +been output which is after the callback in [`stream._flush()`][stream-_flush] +has been called. + +#### transform.\_flush(callback) + +* `callback` {Function} Call this function (optionally with an error + argument) when you are done flushing any remaining data. + +Note: **This function MUST NOT be called directly.** It MAY be implemented +by child classes, and if so, will be called by the internal Transform +class methods only. + +In some cases, your transform operation may need to emit a bit more +data at the end of the stream. For example, a `Zlib` compression +stream will store up some internal state so that it can optimally +compress the output. At the end, however, it needs to do the best it +can with what is left, so that the data will be complete. + +In those cases, you can implement a `_flush()` method, which will be +called at the very end, after all the written data is consumed, but +before emitting [`'end'`][] to signal the end of the readable side. Just +like with [`stream._transform()`][stream-_transform], call +`transform.push(chunk)` zero or more times, as appropriate, and call `callback` +when the flush operation is complete. + +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. + +#### transform.\_transform(chunk, encoding, callback) + +* `chunk` {Buffer|String} The chunk to be transformed. Will **always** + be a buffer unless the `decodeStrings` option was set to `false`. +* `encoding` {String} If the chunk is a string, then this is the + encoding type. If chunk is a buffer, then this is the special + value - 'buffer', ignore it in this case. +* `callback` {Function} Call this function (optionally with an error + argument and data) when you are done processing the supplied chunk. + +Note: **This function MUST NOT be called directly.** It should be +implemented by child classes, and called by the internal Transform +class methods only. + +All Transform stream implementations must provide a `_transform()` +method to accept input and produce output. + +`_transform()` should do whatever has to be done in this specific +Transform class, to handle the bytes being written, and pass them off +to the readable portion of the interface. Do asynchronous I/O, +process things, and so on. + +Call `transform.push(outputChunk)` 0 or more times to generate output +from this input chunk, depending on how much data you want to output +as a result of this chunk. + +Call the callback function only when the current chunk is completely +consumed. Note that there may or may not be output as a result of any +particular input chunk. If you supply a second argument to the callback +it will be passed to the push method. In other words the following are +equivalent: + +```js +transform.prototype._transform = function (data, encoding, callback) { + this.push(data); + callback(); +}; + +transform.prototype._transform = function (data, encoding, callback) { + callback(null, data); +}; +``` + +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. + +#### Example: `SimpleProtocol` parser v2 + +The example [here](#stream_example_simpleprotocol_v1_sub_optimal) of a simple +protocol parser can be implemented simply by using the higher level +[Transform][] stream class, similar to the `parseHeader` and `SimpleProtocol +v1` examples. + +In this example, rather than providing the input as an argument, it +would be piped into the parser, which is a more idiomatic Node.js stream +approach. + +```javascript +const util = require('util'); +const Transform = require('stream').Transform; +util.inherits(SimpleProtocol, Transform); + +function SimpleProtocol(options) { + if (!(this instanceof SimpleProtocol)) + return new SimpleProtocol(options); + + Transform.call(this, options); + this._inBody = false; + this._sawFirstCr = false; + this._rawHeader = []; + this.header = null; +} + +SimpleProtocol.prototype._transform = function(chunk, encoding, done) { + if (!this._inBody) { + // check if the chunk has a \n\n + var split = -1; + for (var i = 0; i < chunk.length; i++) { + if (chunk[i] === 10) { // '\n' + if (this._sawFirstCr) { + split = i; + break; + } else { + this._sawFirstCr = true; + } + } else { + this._sawFirstCr = false; + } + } + + if (split === -1) { + // still waiting for the \n\n + // stash the chunk, and try again. + this._rawHeader.push(chunk); + } else { + this._inBody = true; + var h = chunk.slice(0, split); + this._rawHeader.push(h); + var header = Buffer.concat(this._rawHeader).toString(); + try { + this.header = JSON.parse(header); + } catch (er) { + this.emit('error', new Error('invalid simple protocol data')); + return; + } + // and let them know that we are done parsing the header. + this.emit('header', this.header); + + // now, because we got some extra data, emit this first. + this.push(chunk.slice(split)); + } + } else { + // from there on, just provide the data to our consumer as-is. + this.push(chunk); + } + done(); +}; + +// Usage: +// var parser = new SimpleProtocol(); +// source.pipe(parser) +// Now parser is a readable stream that will emit 'header' +// with the parsed header data. +``` + +### Class: stream.Writable + + + +`stream.Writable` is an abstract class designed to be extended with an +underlying implementation of the +[`stream._write(chunk, encoding, callback)`][stream-_write] method. + +Please see [API for Stream Consumers][] for how to consume +writable streams in your programs. What follows is an explanation of +how to implement Writable streams in your programs. + +#### new stream.Writable([options]) + +* `options` {Object} + * `highWaterMark` {Number} Buffer level when + [`stream.write()`][stream-write] starts returning `false`. Default = `16384` + (16kb), or `16` for `objectMode` streams. + * `decodeStrings` {Boolean} Whether or not to decode strings into + Buffers before passing them to [`stream._write()`][stream-_write]. + Default = `true` + * `objectMode` {Boolean} Whether or not the + [`stream.write(anyObj)`][stream-write] is a valid operation. If set you can + write arbitrary data instead of only `Buffer` / `String` data. + Default = `false` + * `write` {Function} Implementation for the + [`stream._write()`][stream-_write] method. + * `writev` {Function} Implementation for the + [`stream._writev()`][stream-_writev] method. + +In classes that extend the Writable class, make sure to call the +constructor so that the buffering settings can be properly +initialized. + +#### writable.\_write(chunk, encoding, callback) + +* `chunk` {Buffer|String} The chunk to be written. Will **always** + be a buffer unless the `decodeStrings` option was set to `false`. +* `encoding` {String} If the chunk is a string, then this is the + encoding type. If chunk is a buffer, then this is the special + value - 'buffer', ignore it in this case. +* `callback` {Function} Call this function (optionally with an error + argument) when you are done processing the supplied chunk. + +All Writable stream implementations must provide a +[`stream._write()`][stream-_write] method to send data to the underlying +resource. + +Note: **This function MUST NOT be called directly.** It should be +implemented by child classes, and called by the internal Writable +class methods only. + +Call the callback using the standard `callback(error)` pattern to +signal that the write completed successfully or with an error. + +If the `decodeStrings` flag is set in the constructor options, then +`chunk` may be a string rather than a Buffer, and `encoding` will +indicate the sort of string that it is. This is to support +implementations that have an optimized handling for certain string +data encodings. If you do not explicitly set the `decodeStrings` +option to `false`, then you can safely ignore the `encoding` argument, +and assume that `chunk` will always be a Buffer. + +This method is prefixed with an underscore because it is internal to +the class that defines it, and should not be called directly by user +programs. However, you **are** expected to override this method in +your own extension classes. + +#### writable.\_writev(chunks, callback) + +* `chunks` {Array} The chunks to be written. Each chunk has following + format: `{ chunk: ..., encoding: ... }`. +* `callback` {Function} Call this function (optionally with an error + argument) when you are done processing the supplied chunks. + +Note: **This function MUST NOT be called directly.** It may be +implemented by child classes, and called by the internal Writable +class methods only. + +This function is completely optional to implement. In most cases it is +unnecessary. If implemented, it will be called with all the chunks +that are buffered in the write queue. + + +## Simplified Constructor API + + + +In simple cases there is now the added benefit of being able to construct a +stream without inheritance. + +This can be done by passing the appropriate methods as constructor options: + +Examples: + +### Duplex + +```js +var duplex = new stream.Duplex({ + read: function(n) { + // sets this._read under the hood + + // push data onto the read queue, passing null + // will signal the end of the stream (EOF) + this.push(chunk); + }, + write: function(chunk, encoding, next) { + // sets this._write under the hood + + // An optional error can be passed as the first argument + next() + } +}); + +// or + +var duplex = new stream.Duplex({ + read: function(n) { + // sets this._read under the hood + + // push data onto the read queue, passing null + // will signal the end of the stream (EOF) + this.push(chunk); + }, + writev: function(chunks, next) { + // sets this._writev under the hood + + // An optional error can be passed as the first argument + next() + } +}); +``` + +### Readable + +```js +var readable = new stream.Readable({ + read: function(n) { + // sets this._read under the hood + + // push data onto the read queue, passing null + // will signal the end of the stream (EOF) + this.push(chunk); + } +}); +``` + +### Transform + +```js +var transform = new stream.Transform({ + transform: function(chunk, encoding, next) { + // sets this._transform under the hood + + // generate output as many times as needed + // this.push(chunk); + + // call when the current chunk is consumed + next(); + }, + flush: function(done) { + // sets this._flush under the hood + + // generate output as many times as needed + // this.push(chunk); + + done(); + } +}); +``` + +### Writable + +```js +var writable = new stream.Writable({ + write: function(chunk, encoding, next) { + // sets this._write under the hood + + // An optional error can be passed as the first argument + next() + } +}); + +// or + +var writable = new stream.Writable({ + writev: function(chunks, next) { + // sets this._writev under the hood + + // An optional error can be passed as the first argument + next() + } +}); +``` + +## Streams: Under the Hood + + + +### Buffering + + + +Both Writable and Readable streams will buffer data on an internal +object which can be retrieved from `_writableState.getBuffer()` or +`_readableState.buffer`, respectively. + +The amount of data that will potentially be buffered depends on the +`highWaterMark` option which is passed into the constructor. + +Buffering in Readable streams happens when the implementation calls +[`stream.push(chunk)`][stream-push]. If the consumer of the Stream does not +call [`stream.read()`][stream-read], then the data will sit in the internal +queue until it is consumed. + +Buffering in Writable streams happens when the user calls +[`stream.write(chunk)`][stream-write] repeatedly, even when it returns `false`. + +The purpose of streams, especially with the [`stream.pipe()`][] method, is to +limit the buffering of data to acceptable levels, so that sources and +destinations of varying speed will not overwhelm the available memory. + +### Compatibility with Older Node.js Versions + + + +In versions of Node.js prior to v0.10, the Readable stream interface was +simpler, but also less powerful and less useful. + +* Rather than waiting for you to call the [`stream.read()`][stream-read] method, + [`'data'`][] events would start emitting immediately. If you needed to do + some I/O to decide how to handle data, then you had to store the chunks + in some kind of buffer so that they would not be lost. +* The [`stream.pause()`][stream-pause] method was advisory, rather than + guaranteed. This meant that you still had to be prepared to receive + [`'data'`][] events even when the stream was in a paused state. + +In Node.js v0.10, the [Readable][] class was added. +For backwards compatibility with older Node.js programs, Readable streams +switch into "flowing mode" when a [`'data'`][] event handler is added, or +when the [`stream.resume()`][stream-resume] method is called. The effect is +that, even if you are not using the new [`stream.read()`][stream-read] method +and [`'readable'`][] event, you no longer have to worry about losing +[`'data'`][] chunks. + +Most programs will continue to function normally. However, this +introduces an edge case in the following conditions: + +* No [`'data'`][] event handler is added. +* The [`stream.resume()`][stream-resume] method is never called. +* The stream is not piped to any writable destination. + +For example, consider the following code: + +```js +// WARNING! BROKEN! +net.createServer((socket) => { + + // we add an 'end' method, but never consume the data + socket.on('end', () => { + // It will never get here. + socket.end('I got your message (but didnt read it)\n'); + }); + +}).listen(1337); +``` + +In versions of Node.js prior to v0.10, the incoming message data would be +simply discarded. However, in Node.js v0.10 and beyond, +the socket will remain paused forever. + +The workaround in this situation is to call the +[`stream.resume()`][stream-resume] method to start the flow of data: + +```js +// Workaround +net.createServer((socket) => { + + socket.on('end', () => { + socket.end('I got your message (but didnt read it)\n'); + }); + + // start the flow of data, discarding it. + socket.resume(); + +}).listen(1337); +``` + +In addition to new Readable streams switching into flowing mode, +pre-v0.10 style streams can be wrapped in a Readable class using the +[`stream.wrap()`][] method. + + +### Object Mode + + + +Normally, Streams operate on Strings and Buffers exclusively. + +Streams that are in **object mode** can emit generic JavaScript values +other than Buffers and Strings. + +A Readable stream in object mode will always return a single item from +a call to [`stream.read(size)`][stream-read], regardless of what the size +argument is. + +A Writable stream in object mode will always ignore the `encoding` +argument to [`stream.write(data, encoding)`][stream-write]. + +The special value `null` still retains its special value for object +mode streams. That is, for object mode readable streams, `null` as a +return value from [`stream.read()`][stream-read] indicates that there is no more +data, and [`stream.push(null)`][stream-push] will signal the end of stream data +(`EOF`). + +No streams in Node.js core are object mode streams. This pattern is only +used by userland streaming libraries. + +You should set `objectMode` in your stream child class constructor on +the options object. Setting `objectMode` mid-stream is not safe. + +For Duplex streams `objectMode` can be set exclusively for readable or +writable side with `readableObjectMode` and `writableObjectMode` +respectively. These options can be used to implement parsers and +serializers with Transform streams. + +```js +const util = require('util'); +const StringDecoder = require('string_decoder').StringDecoder; +const Transform = require('stream').Transform; +util.inherits(JSONParseStream, Transform); + +// Gets \n-delimited JSON string data, and emits the parsed objects +function JSONParseStream() { + if (!(this instanceof JSONParseStream)) + return new JSONParseStream(); + + Transform.call(this, { readableObjectMode : true }); + + this._buffer = ''; + this._decoder = new StringDecoder('utf8'); +} + +JSONParseStream.prototype._transform = function(chunk, encoding, cb) { + this._buffer += this._decoder.write(chunk); + // split on newlines + var lines = this._buffer.split(/\r?\n/); + // keep the last partial line buffered + this._buffer = lines.pop(); + for (var l = 0; l < lines.length; l++) { + var line = lines[l]; + try { + var obj = JSON.parse(line); + } catch (er) { + this.emit('error', er); + return; + } + // push the parsed object out to the readable consumer + this.push(obj); + } + cb(); +}; + +JSONParseStream.prototype._flush = function(cb) { + // Just handle any leftover + var rem = this._buffer.trim(); + if (rem) { + try { + var obj = JSON.parse(rem); + } catch (er) { + this.emit('error', er); + return; + } + // push the parsed object out to the readable consumer + this.push(obj); + } + cb(); +}; +``` + +### `stream.read(0)` + +There are some cases where you want to trigger a refresh of the +underlying readable stream mechanisms, without actually consuming any +data. In that case, you can call `stream.read(0)`, which will always +return null. + +If the internal read buffer is below the `highWaterMark`, and the +stream is not currently reading, then calling `stream.read(0)` will trigger +a low-level [`stream._read()`][stream-_read] call. + +There is almost never a need to do this. However, you will see some +cases in Node.js's internals where this is done, particularly in the +Readable stream class internals. + +### `stream.push('')` + +Pushing a zero-byte string or Buffer (when not in [Object mode][]) has an +interesting side effect. Because it *is* a call to +[`stream.push()`][stream-push], it will end the `reading` process. However, it +does *not* add any data to the readable buffer, so there's nothing for +a user to consume. + +Very rarely, there are cases where you have no data to provide now, +but the consumer of your stream (or, perhaps, another bit of your own +code) will know when to check again, by calling [`stream.read(0)`][stream-read]. +In those cases, you *may* call `stream.push('')`. + +So far, the only use case for this functionality is in the +[`tls.CryptoStream`][] class, which is deprecated in Node.js/io.js v1.0. If you +find that you have to use `stream.push('')`, please consider another +approach, because it almost certainly indicates that something is +horribly wrong. + +[`'data'`]: #stream_event_data +[`'drain'`]: #stream_event_drain +[`'end'`]: #stream_event_end +[`'finish'`]: #stream_event_finish +[`'readable'`]: #stream_event_readable +[`buf.toString(encoding)`]: https://nodejs.org/docs/v5.8.0/api/buffer.html#buffer_buf_tostring_encoding_start_end +[`EventEmitter`]: https://nodejs.org/docs/v5.8.0/api/events.html#events_class_eventemitter +[`process.stderr`]: https://nodejs.org/docs/v5.8.0/api/process.html#process_process_stderr +[`process.stdin`]: https://nodejs.org/docs/v5.8.0/api/process.html#process_process_stdin +[`process.stdout`]: https://nodejs.org/docs/v5.8.0/api/process.html#process_process_stdout +[`stream.cork()`]: #stream_writable_cork +[`stream.pipe()`]: #stream_readable_pipe_destination_options +[`stream.uncork()`]: #stream_writable_uncork +[`stream.unpipe()`]: #stream_readable_unpipe_destination +[`stream.wrap()`]: #stream_readable_wrap_stream +[`tls.CryptoStream`]: https://nodejs.org/docs/v5.8.0/api/tls.html#tls_class_cryptostream +[`util.inherits()`]: https://nodejs.org/docs/v5.8.0/api/util.html#util_util_inherits_constructor_superconstructor +[API for Stream Consumers]: #stream_api_for_stream_consumers +[API for Stream Implementors]: #stream_api_for_stream_implementors +[child process stdin]: https://nodejs.org/docs/v5.8.0/api/child_process.html#child_process_child_stdin +[child process stdout and stderr]: https://nodejs.org/docs/v5.8.0/api/child_process.html#child_process_child_stdout +[Compatibility]: #stream_compatibility_with_older_node_js_versions +[crypto]: crypto.html +[Duplex]: #stream_class_stream_duplex +[fs read streams]: https://nodejs.org/docs/v5.8.0/api/fs.html#fs_class_fs_readstream +[fs write streams]: https://nodejs.org/docs/v5.8.0/api/fs.html#fs_class_fs_writestream +[HTTP requests, on the client]: https://nodejs.org/docs/v5.8.0/api/http.html#http_class_http_clientrequest +[HTTP responses, on the server]: https://nodejs.org/docs/v5.8.0/api/http.html#http_class_http_serverresponse +[http-incoming-message]: https://nodejs.org/docs/v5.8.0/api/http.html#http_class_http_incomingmessage +[Object mode]: #stream_object_mode +[Readable]: #stream_class_stream_readable +[SimpleProtocol v2]: #stream_example_simpleprotocol_parser_v2 +[stream-_flush]: #stream_transform_flush_callback +[stream-_read]: #stream_readable_read_size_1 +[stream-_transform]: #stream_transform_transform_chunk_encoding_callback +[stream-_write]: #stream_writable_write_chunk_encoding_callback_1 +[stream-_writev]: #stream_writable_writev_chunks_callback +[stream-end]: #stream_writable_end_chunk_encoding_callback +[stream-pause]: #stream_readable_pause +[stream-push]: #stream_readable_push_chunk_encoding +[stream-read]: #stream_readable_read_size +[stream-resume]: #stream_readable_resume +[stream-write]: #stream_writable_write_chunk_encoding_callback +[TCP sockets]: https://nodejs.org/docs/v5.8.0/api/net.html#net_class_net_socket +[Transform]: #stream_class_stream_transform +[Writable]: #stream_class_stream_writable +[zlib]: zlib.html diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000..83275f1 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/duplex.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000..ca807af --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_duplex.js") diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000..736693b --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,75 @@ +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +var keys = objectKeys(Writable.prototype); +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + processNextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000..d06f71f --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,26 @@ +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000..54a9d5c --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,880 @@ +'use strict'; + +module.exports = Readable; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Readable.ReadableState = ReadableState; + +var EE = require('events'); + +/**/ +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/**/ + +var Buffer = require('buffer').Buffer; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = undefined; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var StringDecoder; + +util.inherits(Readable, Stream); + +var Duplex; +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +var Duplex; +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options && typeof options.read === 'function') this._read = options.read; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + var skipAdd; + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } + + if (!addToFront) state.reading = false; + + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) return 0; + + if (state.objectMode) return n === 0 ? 0 : 1; + + if (n === null || isNaN(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length; + } + + if (n <= 0) return 0; + + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else { + return state.length; + } + } + + return n; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + var state = this._readableState; + var nOrig = n; + + if (typeof n !== 'number' || n > 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } + + if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } + + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (doRead && !state.reading) n = howMuchToRead(nOrig, state); + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } + + state.length -= n; + + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended && state.length === 0) endReadable(this); + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + processNextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + if (false === ret) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + if (state.pipesCount === 1 && state.pipes[0] === dest && src.listenerCount('data') === 1 && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) dest.on('error', onerror);else if (isArray(dest._events.error)) dest._events.error.unshift(onerror);else dest._events.error = [onerror, dest._events.error]; + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + }return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + // If listening to data, and it has not explicitly been paused, + // then call resume to start the flow of data on the next tick. + if (ev === 'data' && false !== this._readableState.flowing) { + this.resume(); + } + + if (ev === 'readable' && !this._readableState.endEmitted) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + processNextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + processNextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + if (state.flowing) { + do { + var chunk = stream.read(); + } while (null !== chunk && state.flowing); + } +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; + + // nothing in the list, definitely empty. + if (list.length === 0) return null; + + if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) ret = '';else ret = new Buffer(n); + + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); + + if (stringMode) ret += buf.slice(0, cpy);else buf.copy(ret, c, 0, cpy); + + if (cpy < buf.length) list[0] = buf.slice(cpy);else list.shift(); + + c += cpy; + } + } + } + + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('endReadable called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + processNextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000..625cdc1 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,180 @@ +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) stream.push(data); + + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); + }); +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +function done(stream, er) { + if (er) return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) throw new Error('calling transform done when ws.length != 0'); + + if (ts.transforming) throw new Error('calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000..95916c9 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,516 @@ +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +module.exports = Writable; + +/**/ +var processNextTick = require('process-nextick-args'); +/**/ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +/**/ + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/**/ + +var Buffer = require('buffer').Buffer; + +util.inherits(Writable, Stream); + +function nop() {} + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +var Duplex; +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // create the two objects needed to store the corked requests + // they are not a linked list, as no new elements are inserted in there + this.corkedRequestsFree = new CorkedRequest(this); + this.corkedRequestsFree.next = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + } catch (_) {} +})(); + +var Duplex; +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + processNextTick(cb, er); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + processNextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = new Buffer(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + + if (Buffer.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) processNextTick(cb, er);else cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) processNextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; + } + }; +} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/package.json b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/package.json new file mode 100644 index 0000000..523c4ee --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/package.json @@ -0,0 +1,66 @@ +{ + "_from": "readable-stream@~2.0.0", + "_id": "readable-stream@2.0.6", + "_inBundle": false, + "_integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "_location": "/through2/readable-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "readable-stream@~2.0.0", + "name": "readable-stream", + "escapedName": "readable-stream", + "rawSpec": "~2.0.0", + "saveSpec": null, + "fetchSpec": "~2.0.0" + }, + "_requiredBy": [ + "/through2" + ], + "_resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.0.6.tgz", + "_shasum": "8f90341e68a53ccc928788dacfcd11b36eb9b78e", + "_spec": "readable-stream@~2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\through2", + "browser": { + "util": false + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "deprecated": false, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "tap": "~0.2.6", + "tape": "~4.5.1", + "zuul": "~3.9.0" + }, + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "name": "readable-stream", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "browser": "npm run write-zuul && zuul -- test/browser.js", + "test": "tap test/parallel/*.js test/ours/*.js", + "write-zuul": "printf \"ui: tape\nbrowsers:\n - name: $BROWSER_NAME\n version: $BROWSER_VERSION\n\">.zuul.yml" + }, + "version": "2.0.6" +} diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/passthrough.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000..27e8d8a --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_passthrough.js") diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/readable.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/readable.js new file mode 100644 index 0000000..6222a57 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/readable.js @@ -0,0 +1,12 @@ +var Stream = (function (){ + try { + return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = Stream || exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/transform.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/transform.js new file mode 100644 index 0000000..5d482f0 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_transform.js") diff --git a/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/writable.js b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/writable.js new file mode 100644 index 0000000..e1e9efd --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/readable-stream/writable.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_writable.js") diff --git a/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/.npmignore b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/.npmignore new file mode 100644 index 0000000..206320c --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/.npmignore @@ -0,0 +1,2 @@ +build +test diff --git a/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/LICENSE b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000..6de584a --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/LICENSE @@ -0,0 +1,20 @@ +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/README.md b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/README.md new file mode 100644 index 0000000..4d2aa00 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/README.md @@ -0,0 +1,7 @@ +**string_decoder.js** (`require('string_decoder')`) from Node.js core + +Copyright Joyent, Inc. and other Node contributors. See LICENCE file for details. + +Version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.** + +The *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version. \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/index.js b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/index.js new file mode 100644 index 0000000..b00e54f --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/index.js @@ -0,0 +1,221 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var Buffer = require('buffer').Buffer; + +var isBufferEncoding = Buffer.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + } + + +function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. CESU-8 is handled as part of the UTF-8 encoding. +// +// @TODO Handling all encodings inside a single object makes it very difficult +// to reason about this code, so it should be split up in the future. +// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code +// points as used by CESU-8. +var StringDecoder = exports.StringDecoder = function(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; +}; + + +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . +StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; + + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; +}; + +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; +}; + +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); +} + +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} + +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} diff --git a/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/package.json b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/package.json new file mode 100644 index 0000000..a0f0b41 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/node_modules/string_decoder/package.json @@ -0,0 +1,53 @@ +{ + "_from": "string_decoder@~0.10.x", + "_id": "string_decoder@0.10.31", + "_inBundle": false, + "_integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "_location": "/through2/string_decoder", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "string_decoder@~0.10.x", + "name": "string_decoder", + "escapedName": "string_decoder", + "rawSpec": "~0.10.x", + "saveSpec": null, + "fetchSpec": "~0.10.x" + }, + "_requiredBy": [ + "/through2/readable-stream" + ], + "_resolved": "https://registry.nlark.com/string_decoder/download/string_decoder-0.10.31.tgz", + "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "_spec": "string_decoder@~0.10.x", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\through2\\node_modules\\readable-stream", + "bugs": { + "url": "https://github.com/rvagg/string_decoder/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "The string_decoder module from Node core", + "devDependencies": { + "tap": "~0.4.8" + }, + "homepage": "https://github.com/rvagg/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "index.js", + "name": "string_decoder", + "repository": { + "type": "git", + "url": "git://github.com/rvagg/string_decoder.git" + }, + "scripts": { + "test": "tap test/simple/*.js" + }, + "version": "0.10.31" +} diff --git a/packages/字体精简工具/node_modules/through2/package.json b/packages/字体精简工具/node_modules/through2/package.json new file mode 100644 index 0000000..aaab5d9 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/package.json @@ -0,0 +1,72 @@ +{ + "_from": "through2@2.0.1", + "_id": "through2@2.0.1", + "_inBundle": false, + "_integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", + "_location": "/through2", + "_phantomChildren": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "util-deprecate": "1.0.2" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "through2@2.0.1", + "name": "through2", + "escapedName": "through2", + "rawSpec": "2.0.1", + "saveSpec": null, + "fetchSpec": "2.0.1" + }, + "_requiredBy": [ + "/fontmin", + "/through2-filter", + "/vinyl-fs" + ], + "_resolved": "https://registry.nlark.com/through2/download/through2-2.0.1.tgz", + "_shasum": "384e75314d49f32de12eebb8136b8eb6b5d59da9", + "_spec": "through2@2.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\fontmin", + "author": { + "name": "Rod Vagg", + "email": "r@va.gg", + "url": "https://github.com/rvagg" + }, + "bugs": { + "url": "https://github.com/rvagg/through2/issues" + }, + "bundleDependencies": false, + "dependencies": { + "readable-stream": "~2.0.0", + "xtend": "~4.0.0" + }, + "deprecated": false, + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "devDependencies": { + "bl": "~0.9.4", + "faucet": "0.0.1", + "stream-spigot": "~3.0.5", + "tape": "~4.0.0" + }, + "homepage": "https://github.com/rvagg/through2#readme", + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "license": "MIT", + "main": "through2.js", + "name": "through2", + "repository": { + "type": "git", + "url": "git+https://github.com/rvagg/through2.git" + }, + "scripts": { + "test": "node test/test.js | faucet", + "test-local": "brtapsauce-local test/basic-test.js" + }, + "version": "2.0.1" +} diff --git a/packages/字体精简工具/node_modules/through2/through2.js b/packages/字体精简工具/node_modules/through2/through2.js new file mode 100644 index 0000000..5b7a880 --- /dev/null +++ b/packages/字体精简工具/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream/transform') + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/packages/字体精简工具/node_modules/to-absolute-glob/LICENSE b/packages/字体精简工具/node_modules/to-absolute-glob/LICENSE new file mode 100644 index 0000000..6525171 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-absolute-glob/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2016, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/to-absolute-glob/index.js b/packages/字体精简工具/node_modules/to-absolute-glob/index.js new file mode 100644 index 0000000..268fc47 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-absolute-glob/index.js @@ -0,0 +1,70 @@ +'use strict'; + +var path = require('path'); +var isNegated = require('is-negated-glob'); +var isAbsolute = require('is-absolute'); + +module.exports = function(glob, options) { + // default options + var opts = options || {}; + + // ensure cwd is absolute + var cwd = path.resolve(opts.cwd ? opts.cwd : process.cwd()); + cwd = unixify(cwd); + + var rootDir = opts.root; + // if `options.root` is defined, ensure it's absolute + if (rootDir) { + rootDir = unixify(rootDir); + if (process.platform === 'win32' || !isAbsolute(rootDir)) { + rootDir = unixify(path.resolve(rootDir)); + } + } + + // trim starting ./ from glob patterns + if (glob.slice(0, 2) === './') { + glob = glob.slice(2); + } + + // when the glob pattern is only a . use an empty string + if (glob.length === 1 && glob === '.') { + glob = ''; + } + + // store last character before glob is modified + var suffix = glob.slice(-1); + + // check to see if glob is negated (and not a leading negated-extglob) + var ing = isNegated(glob); + glob = ing.pattern; + + // make glob absolute + if (rootDir && glob.charAt(0) === '/') { + glob = join(rootDir, glob); + } else if (!isAbsolute(glob) || glob.slice(0, 1) === '\\') { + glob = join(cwd, glob); + } + + // if glob had a trailing `/`, re-add it now in case it was removed + if (suffix === '/' && glob.slice(-1) !== '/') { + glob += '/'; + } + + // re-add leading `!` if it was removed + return ing.negated ? '!' + glob : glob; +}; + +function unixify(filepath) { + return filepath.replace(/\\/g, '/'); +} + +function join(dir, glob) { + if (dir.charAt(dir.length - 1) === '/') { + dir = dir.slice(0, -1); + } + if (glob.charAt(0) === '/') { + glob = glob.slice(1); + } + if (!glob) return dir; + return dir + '/' + glob; +} diff --git a/packages/字体精简工具/node_modules/to-absolute-glob/package.json b/packages/字体精简工具/node_modules/to-absolute-glob/package.json new file mode 100644 index 0000000..f4524a9 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-absolute-glob/package.json @@ -0,0 +1,118 @@ +{ + "_from": "to-absolute-glob@^2.0.0", + "_id": "to-absolute-glob@2.0.2", + "_inBundle": false, + "_integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "_location": "/to-absolute-glob", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "to-absolute-glob@^2.0.0", + "name": "to-absolute-glob", + "escapedName": "to-absolute-glob", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/glob-stream" + ], + "_resolved": "https://registry.nlark.com/to-absolute-glob/download/to-absolute-glob-2.0.2.tgz", + "_shasum": "1865f43d9e74b0822db9f145b78cff7d0f7c849b", + "_spec": "to-absolute-glob@^2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\glob-stream", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/to-absolute-glob/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com", + "url": "https://twitter.com/BlaineBublitz" + }, + { + "name": "Brian Woodward", + "email": "brian.woodward@gmail.com", + "url": "https://github.com/doowb" + }, + { + "name": "Erik Kemperman", + "url": "https://github.com/erikkemperman" + }, + { + "name": "Jon Schlinkert", + "email": "jon.schlinkert@sellside.com", + "url": "http://twitter.com/jonschlinkert" + } + ], + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "deprecated": false, + "description": "Make a glob pattern absolute, ensuring that negative globs and patterns with trailing slashes are correctly handled.", + "devDependencies": { + "gulp-format-md": "^0.1.11", + "mocha": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/jonschlinkert/to-absolute-glob", + "keywords": [ + "absolute", + "file", + "filepath", + "glob", + "negate", + "negative", + "path", + "pattern", + "resolve", + "to" + ], + "license": "MIT", + "main": "index.js", + "name": "to-absolute-glob", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/to-absolute-glob.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "related": { + "list": [ + "has-glob", + "is-glob", + "is-valid-glob" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ] + }, + "version": "2.0.2" +} diff --git a/packages/字体精简工具/node_modules/to-absolute-glob/readme.md b/packages/字体精简工具/node_modules/to-absolute-glob/readme.md new file mode 100644 index 0000000..d93fbed --- /dev/null +++ b/packages/字体精简工具/node_modules/to-absolute-glob/readme.md @@ -0,0 +1,155 @@ +# to-absolute-glob [![NPM version](https://img.shields.io/npm/v/to-absolute-glob.svg?style=flat)](https://www.npmjs.com/package/to-absolute-glob) [![NPM downloads](https://img.shields.io/npm/dm/to-absolute-glob.svg?style=flat)](https://npmjs.org/package/to-absolute-glob) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/to-absolute-glob.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/to-absolute-glob) [![Windows Build Status](https://img.shields.io/appveyor/ci/jonschlinkert/to-absolute-glob.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/jonschlinkert/to-absolute-glob) + +> Make a glob pattern absolute, ensuring that negative globs and patterns with trailing slashes are correctly handled. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save to-absolute-glob +``` + +## Usage + +```js +var toAbsGlob = require('to-absolute-glob'); +toAbsGlob('a/*.js'); +//=> '/dev/foo/a/*.js' +``` + +## Examples + +Given the current project folder (cwd) is `/dev/foo/`: + +**makes a path absolute** + +```js +toAbsGlob('a'); +//=> '/dev/foo/a' +``` + +**makes a glob absolute** + +```js +toAbsGlob('a/*.js'); +//=> '/dev/foo/a/*.js' +``` + +**retains trailing slashes** + +```js +toAbsGlob('a/*/'); +//=> '/dev/foo/a/*/' +``` + +**retains trailing slashes with cwd** + +```js +toAbsGlob('./fixtures/whatsgoingon/*/', {cwd: __dirname}); +//=> '/dev/foo/' +``` + +**makes a negative glob absolute** + +```js +toAbsGlob('!a/*.js'); +//=> '!/dev/foo/a/*.js' +``` + +**from a cwd** + +```js +toAbsGlob('a/*.js', {cwd: 'foo'}); +//=> '/dev/foo/foo/a/*.js' +``` + +**makes a negative glob absolute from a cwd** + +```js +toAbsGlob('!a/*.js', {cwd: 'foo'}); +//=> '!/dev/foo/foo/a/*.js' +``` + +**from a root path** + +```js +toAbsGlob('/a/*.js', {root: 'baz'}); +//=> '/dev/foo/baz/a/*.js' +``` + +**from a root slash** + +```js +toAbsGlob('/a/*.js', {root: '/'}); +//=> '/dev/foo/a/*.js' +``` + +**from a negative root path** + +```js +toAbsGlob('!/a/*.js', {root: 'baz'}); +//=> '!/dev/foo/baz/a/*.js' +``` + +**from a negative root slash** + +```js +toAbsGlob('!/a/*.js', {root: '/'}); +//=> '!/dev/foo/a/*.js' +``` + +## About + +### Related projects + +* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.") +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [is-valid-glob](https://www.npmjs.com/package/is-valid-glob): Return true if a value is a valid glob pattern or patterns. | [homepage](https://github.com/jonschlinkert/is-valid-glob "Return true if a value is a valid glob pattern or patterns.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Contributors + +| **Commits** | **Contributor**
| +| --- | --- | +| 16 | [doowb](https://github.com/doowb) | +| 15 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [phated](https://github.com/phated) | +| 1 | [erikkemperman](https://github.com/erikkemperman) | + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/to-absolute-glob/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.2.0, on October 17, 2016._ \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/to-through/LICENSE b/packages/字体精简工具/node_modules/to-through/LICENSE new file mode 100644 index 0000000..b8fc743 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-through/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/to-through/README.md b/packages/字体精简工具/node_modules/to-through/README.md new file mode 100644 index 0000000..0c02b7c --- /dev/null +++ b/packages/字体精简工具/node_modules/to-through/README.md @@ -0,0 +1,56 @@ +

+ + + +

+ +# to-through + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Wrap a ReadableStream in a TransformStream. + +## Usage + +```js +var from = require('from2'); +var concat = require('concat-stream'); +var toThrough = require('to-through'); + +var readable = from([' ', 'hello', ' ', 'world']); + +// Can be used as a Readable or Transform +var maybeTransform = toThrough(readable); + +from(['hi', ' ', 'there', ',']) + .pipe(maybeTransform) + .pipe(concat(function(result) { + // result.toString() === 'hi there, hello world' + })); +``` + +## API + +### `toThrough(readableStream)` + +Takes a `readableStream` as the only argument and returns a `through2` stream. If the returned stream is piped before `nextTick`, the wrapped `readableStream` will not flow until the upstream is flushed. If the stream is not piped before `nextTick`, it is ended and flushed (acting as a proper readable). + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/to-through.svg +[npm-url]: https://npmjs.com/package/to-through +[npm-image]: http://img.shields.io/npm/v/to-through.svg + +[travis-url]: https://travis-ci.org/gulpjs/to-through +[travis-image]: http://img.shields.io/travis/gulpjs/to-through.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/to-through +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/to-through.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/to-through +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/to-through/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/packages/字体精简工具/node_modules/to-through/index.js b/packages/字体精简工具/node_modules/to-through/index.js new file mode 100644 index 0000000..c71a677 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-through/index.js @@ -0,0 +1,60 @@ +'use strict'; + +var through = require('through2'); + +function forward(chunk, enc, cb) { + cb(null, chunk); +} + +function toThrough(readable) { + + var opts = { + objectMode: readable._readableState.objectMode, + highWaterMark: readable._readableState.highWaterMark, + }; + + function flush(cb) { + var self = this; + + readable.on('readable', onReadable); + readable.on('end', cb); + + function onReadable() { + var chunk; + while (chunk = readable.read()) { + self.push(chunk); + } + } + } + + var wrapper = through(opts, forward, flush); + + var shouldFlow = true; + wrapper.once('pipe', onPipe); + wrapper.on('newListener', onListener); + readable.on('error', wrapper.emit.bind(wrapper, 'error')); + + function onListener(event) { + // Once we've seen the data or readable event, check if we need to flow + if (event === 'data' || event === 'readable') { + maybeFlow(); + this.removeListener('newListener', onListener); + } + } + + function onPipe() { + // If the wrapper is piped, disable flow + shouldFlow = false; + } + + function maybeFlow() { + // If we need to flow, end the stream which triggers flush + if (shouldFlow) { + wrapper.end(); + } + } + + return wrapper; +} + +module.exports = toThrough; diff --git a/packages/字体精简工具/node_modules/to-through/node_modules/through2/LICENSE.md b/packages/字体精简工具/node_modules/to-through/node_modules/through2/LICENSE.md new file mode 100644 index 0000000..a2429b6 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-through/node_modules/through2/LICENSE.md @@ -0,0 +1,9 @@ +# The MIT License (MIT) + +**Copyright (c) Rod Vagg (the "Original Author") and additional contributors** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/to-through/node_modules/through2/README.md b/packages/字体精简工具/node_modules/to-through/node_modules/through2/README.md new file mode 100644 index 0000000..b5e44c7 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-through/node_modules/through2/README.md @@ -0,0 +1,134 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2/3) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: As 2.x.x this module starts using **Streams3** instead of Stream2. To continue using a Streams2 version use `npm install through2@0` to fetch the latest version of 0.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) + .on('finish', () => doSomethingSpecial()) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', (data) => { + all.push(data) + }) + .on('end', () => { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +through2([ options, ] [ transformFunction ] [, flushFunction ]) + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + (chunk, enc, cb) => { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + (chunk, enc, cb) => cb(null, chunk), // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +through2.ctor([ options, ] transformFunction[, flushFunction ]) + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit == "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + - the [mississippi stream utility collection](https://github.com/maxogden/mississippi) includes `through2` as well as many more useful stream modules similar to this one + +## License + +**through2** is Copyright (c) Rod Vagg [@rvagg](https://twitter.com/rvagg) and additional contributors and licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/packages/字体精简工具/node_modules/to-through/node_modules/through2/package.json b/packages/字体精简工具/node_modules/to-through/node_modules/through2/package.json new file mode 100644 index 0000000..2419925 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-through/node_modules/through2/package.json @@ -0,0 +1,66 @@ +{ + "_from": "through2@^2.0.3", + "_id": "through2@2.0.5", + "_inBundle": false, + "_integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "_location": "/to-through/through2", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "through2@^2.0.3", + "name": "through2", + "escapedName": "through2", + "rawSpec": "^2.0.3", + "saveSpec": null, + "fetchSpec": "^2.0.3" + }, + "_requiredBy": [ + "/to-through" + ], + "_resolved": "https://registry.nlark.com/through2/download/through2-2.0.5.tgz", + "_shasum": "01c1e39eb31d07cb7d03a96a70823260b23132cd", + "_spec": "through2@^2.0.3", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\to-through", + "author": { + "name": "Rod Vagg", + "email": "r@va.gg", + "url": "https://github.com/rvagg" + }, + "bugs": { + "url": "https://github.com/rvagg/through2/issues" + }, + "bundleDependencies": false, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "deprecated": false, + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "devDependencies": { + "bl": "~2.0.1", + "faucet": "0.0.1", + "nyc": "~13.1.0", + "safe-buffer": "~5.1.2", + "stream-spigot": "~3.0.6", + "tape": "~4.9.1" + }, + "homepage": "https://github.com/rvagg/through2#readme", + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "license": "MIT", + "main": "through2.js", + "name": "through2", + "repository": { + "type": "git", + "url": "git+https://github.com/rvagg/through2.git" + }, + "scripts": { + "test": "node test/test.js | faucet" + }, + "version": "2.0.5" +} diff --git a/packages/字体精简工具/node_modules/to-through/node_modules/through2/through2.js b/packages/字体精简工具/node_modules/to-through/node_modules/through2/through2.js new file mode 100644 index 0000000..6baa6a1 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-through/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream').Transform + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/packages/字体精简工具/node_modules/to-through/package.json b/packages/字体精简工具/node_modules/to-through/package.json new file mode 100644 index 0000000..c652af3 --- /dev/null +++ b/packages/字体精简工具/node_modules/to-through/package.json @@ -0,0 +1,88 @@ +{ + "_from": "to-through@^2.0.0", + "_id": "to-through@2.0.0", + "_inBundle": false, + "_integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "_location": "/to-through", + "_phantomChildren": { + "readable-stream": "2.3.7", + "xtend": "4.0.2" + }, + "_requested": { + "type": "range", + "registry": true, + "raw": "to-through@^2.0.0", + "name": "to-through", + "escapedName": "to-through", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/vinyl-fs" + ], + "_resolved": "https://registry.nlark.com/to-through/download/to-through-2.0.0.tgz", + "_shasum": "fc92adaba072647bc0b67d6b03664aa195093af6", + "_spec": "to-through@^2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/to-through/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": { + "through2": "^2.0.3" + }, + "deprecated": false, + "description": "Wrap a ReadableStream in a TransformStream.", + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.3.0", + "mocha": "^3.2.0" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/gulpjs/to-through#readme", + "keywords": [ + "transform", + "readable", + "through", + "wrap" + ], + "license": "MIT", + "main": "index.js", + "name": "to-through", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/to-through.git" + }, + "scripts": { + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls", + "lint": "eslint index.js test/ && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only" + }, + "version": "2.0.0" +} diff --git a/packages/字体精简工具/node_modules/tough-cookie/LICENSE b/packages/字体精简工具/node_modules/tough-cookie/LICENSE new file mode 100644 index 0000000..22204e8 --- /dev/null +++ b/packages/字体精简工具/node_modules/tough-cookie/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2015, Salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/字体精简工具/node_modules/tough-cookie/README.md b/packages/字体精简工具/node_modules/tough-cookie/README.md new file mode 100644 index 0000000..656a255 --- /dev/null +++ b/packages/字体精简工具/node_modules/tough-cookie/README.md @@ -0,0 +1,527 @@ +[RFC6265](https://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js + +[![npm package](https://nodei.co/npm/tough-cookie.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/tough-cookie/) + +[![Build Status](https://travis-ci.org/salesforce/tough-cookie.png?branch=master)](https://travis-ci.org/salesforce/tough-cookie) + +# Synopsis + +``` javascript +var tough = require('tough-cookie'); +var Cookie = tough.Cookie; +var cookie = Cookie.parse(header); +cookie.value = 'somethingdifferent'; +header = cookie.toString(); + +var cookiejar = new tough.CookieJar(); +cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb); +// ... +cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) { + res.headers['cookie'] = cookies.join('; '); +}); +``` + +# Installation + +It's _so_ easy! + +`npm install tough-cookie` + +Why the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken. + +## Version Support + +Support for versions of node.js will follow that of the [request](https://www.npmjs.com/package/request) module. + +# API + +## tough + +Functions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be "bound". + +**Note**: prior to 1.0.x, several of these functions took a `strict` parameter. This has since been removed from the API as it was no longer necessary. + +### `parseDate(string)` + +Parse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`. + +### `formatDate(date)` + +Format a Date into a RFC1123 string (the RFC6265-recommended format). + +### `canonicalDomain(str)` + +Transforms a domain-name into a canonical domain-name. The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). For the most part, this function is idempotent (can be run again on its output without ill effects). + +### `domainMatch(str,domStr[,canonicalize=true])` + +Answers "does this real domain match the domain in a cookie?". The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name. Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match". + +The `canonicalize` parameter will run the other two parameters through `canonicalDomain` or not. + +### `defaultPath(path)` + +Given a current request/response path, gives the Path apropriate for storing in a cookie. This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC. + +The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). This is the `.pathname` property of node's `uri.parse()` output. + +### `pathMatch(reqPath,cookiePath)` + +Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4. Returns a boolean. + +This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`. + +### `parse(cookieString[, options])` + +alias for `Cookie.parse(cookieString[, options])` + +### `fromJSON(string)` + +alias for `Cookie.fromJSON(string)` + +### `getPublicSuffix(hostname)` + +Returns the public suffix of this hostname. The public suffix is the shortest domain-name upon which a cookie can be set. Returns `null` if the hostname cannot have cookies set for it. + +For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`. + +For further information, see http://publicsuffix.org/. This module derives its list from that site. This call is currently a wrapper around [`psl`](https://www.npmjs.com/package/psl)'s [get() method](https://www.npmjs.com/package/psl#pslgetdomain). + +### `cookieCompare(a,b)` + +For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). The sort algorithm is, in order of precedence: + +* Longest `.path` +* oldest `.creation` (which has a 1ms precision, same as `Date`) +* lowest `.creationIndex` (to get beyond the 1ms precision) + +``` javascript +var cookies = [ /* unsorted array of Cookie objects */ ]; +cookies = cookies.sort(cookieCompare); +``` + +**Note**: Since JavaScript's `Date` is limited to a 1ms precision, cookies within the same milisecond are entirely possible. This is especially true when using the `now` option to `.setCookie()`. The `.creationIndex` property is a per-process global counter, assigned during construction with `new Cookie()`. This preserves the spirit of the RFC sorting: older cookies go first. This works great for `MemoryCookieStore`, since `Set-Cookie` headers are parsed in order, but may not be so great for distributed systems. Sophisticated `Store`s may wish to set this to some other _logical clock_ such that if cookies A and B are created in the same millisecond, but cookie A is created before cookie B, then `A.creationIndex < B.creationIndex`. If you want to alter the global counter, which you probably _shouldn't_ do, it's stored in `Cookie.cookiesCreated`. + +### `permuteDomain(domain)` + +Generates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores. + +### `permutePath(path)` + +Generates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores. + + +## Cookie + +Exported via `tough.Cookie`. + +### `Cookie.parse(cookieString[, options])` + +Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. + +The options parameter is not required and currently has only one property: + + * _loose_ - boolean - if `true` enable parsing of key-less cookies like `=abc` and `=`, which are not RFC-compliant. + +If options is not an object, it is ignored, which means you can use `Array#map` with it. + +Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response: + +``` javascript +if (res.headers['set-cookie'] instanceof Array) + cookies = res.headers['set-cookie'].map(Cookie.parse); +else + cookies = [Cookie.parse(res.headers['set-cookie'])]; +``` + +_Note:_ in version 2.3.3, tough-cookie limited the number of spaces before the `=` to 256 characters. This limitation has since been removed. +See [Issue 92](https://github.com/salesforce/tough-cookie/issues/92) + +### Properties + +Cookie object properties: + + * _key_ - string - the name or key of the cookie (default "") + * _value_ - string - the value of the cookie (default "") + * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()` + * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie. May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively. See `setMaxAge()` + * _domain_ - string - the `Domain=` attribute of the cookie + * _path_ - string - the `Path=` of the cookie + * _secure_ - boolean - the `Secure` cookie flag + * _httpOnly_ - boolean - the `HttpOnly` cookie flag + * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside) + * _creation_ - `Date` - when this cookie was constructed + * _creationIndex_ - number - set at construction, used to provide greater sort precision (please see `cookieCompare(a,b)` for a full explanation) + +After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes: + + * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied) + * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one. + * _creation_ - `Date` - **modified** from construction to when the cookie was added to the jar + * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute. + +### `Cookie([{properties}])` + +Receives an options object that can contain any of the above Cookie properties, uses the default for unspecified properties. + +### `.toString()` + +encode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`. + +### `.cookieString()` + +encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '='). + +### `.setExpires(String)` + +sets the expiry based on a date-string passed through `parseDate()`. If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set. + +### `.setMaxAge(number)` + +sets the maxAge in seconds. Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly. + +### `.expiryTime([now=Date.now()])` + +### `.expiryDate([now=Date.now()])` + +expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object. Note that in both cases the `now` parameter should be milliseconds. + +Max-Age takes precedence over Expires (as per the RFC). The `.creation` attribute -- or, by default, the `now` parameter -- is used to offset the `.maxAge` attribute. + +If Expires (`.expires`) is set, that's returned. + +Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents). + +### `.TTL([now=Date.now()])` + +compute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply. + +The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired. Otherwise a time-to-live in milliseconds is returned. + +### `.canonicalizedDomain()` + +### `.cdomain()` + +return the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters. + +### `.toJSON()` + +For convenience in using `JSON.serialize(cookie)`. Returns a plain-old `Object` that can be JSON-serialized. + +Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are exported in ISO format (`.toISOString()`). + +**NOTE**: Custom `Cookie` properties will be discarded. In tough-cookie 1.x, since there was no `.toJSON` method explicitly defined, all enumerable properties were captured. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. + +### `Cookie.fromJSON(strOrObj)` + +Does the reverse of `cookie.toJSON()`. If passed a string, will `JSON.parse()` that first. + +Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are parsed via `Date.parse()`, not the tough-cookie `parseDate`, since it's JavaScript/JSON-y timestamps being handled at this layer. + +Returns `null` upon JSON parsing error. + +### `.clone()` + +Does a deep clone of this cookie, exactly implemented as `Cookie.fromJSON(cookie.toJSON())`. + +### `.validate()` + +Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive. + +validates cookie attributes for semantic correctness. Useful for "lint" checking any Set-Cookie headers you generate. For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct: + +``` javascript +if (cookie.validate() === true) { + // it's tasty +} else { + // yuck! +} +``` + + +## CookieJar + +Exported via `tough.CookieJar`. + +### `CookieJar([store],[options])` + +Simply use `new CookieJar()`. If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used. + +The `options` object can be omitted and can have the following properties: + + * _rejectPublicSuffixes_ - boolean - default `true` - reject cookies with domains like "com" and "co.uk" + * _looseMode_ - boolean - default `false` - accept malformed cookies like `bar` and `=bar`, which have an implied empty name. + This is not in the standard, but is used sometimes on the web and is accepted by (most) browsers. + +Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods. + +### `.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))` + +Attempt to set the cookie in the cookie jar. If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through. The cookie will have updated `.creation`, `.lastAccessed` and `.hostOnly` properties. + +The `options` object can be omitted and can have the following properties: + + * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. + * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. + * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies + * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. `Store` errors aren't ignored by this option. + +As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object). The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual). + +### `.setCookieSync(cookieOrString, currentUrl, [{options}])` + +Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getCookies(currentUrl, [{options},] cb(err,cookies))` + +Retrieve the list of cookies that can be sent in a Cookie header for the current url. + +If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed. The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given. + +The `options` object can be omitted and can have the following properties: + + * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. + * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. + * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies + * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store. Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially). + * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the underlying store (the default `MemoryCookieStore` supports it). + +The `.lastAccessed` property of the returned cookies will have been updated. + +### `.getCookiesSync(currentUrl, [{options}])` + +Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getCookieString(...)` + +Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback. Simply maps the `Cookie` array via `.cookieString()`. + +### `.getCookieStringSync(...)` + +Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.getSetCookieStrings(...)` + +Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`. + +### `.getSetCookieStringsSync(...)` + +Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +### `.serialize(cb(err,serializedObject))` + +Serialize the Jar if the underlying store supports `.getAllCookies`. + +**NOTE**: Custom `Cookie` properties will be discarded. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. + +See [Serialization Format]. + +### `.serializeSync()` + +Sync version of .serialize + +### `.toJSON()` + +Alias of .serializeSync() for the convenience of `JSON.stringify(cookiejar)`. + +### `CookieJar.deserialize(serialized, [store], cb(err,object))` + +A new Jar is created and the serialized Cookies are added to the underlying store. Each `Cookie` is added via `store.putCookie` in the order in which they appear in the serialization. + +The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. + +As a convenience, if `serialized` is a string, it is passed through `JSON.parse` first. If that throws an error, this is passed to the callback. + +### `CookieJar.deserializeSync(serialized, [store])` + +Sync version of `.deserialize`. _Note_ that the `store` must be synchronous for this to work. + +### `CookieJar.fromJSON(string)` + +Alias of `.deserializeSync` to provide consistency with `Cookie.fromJSON()`. + +### `.clone([store,]cb(err,newJar))` + +Produces a deep clone of this jar. Modifications to the original won't affect the clone, and vice versa. + +The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. Transferring between store types is supported so long as the source implements `.getAllCookies()` and the destination implements `.putCookie()`. + +### `.cloneSync([store])` + +Synchronous version of `.clone`, returning a new `CookieJar` instance. + +The `store` argument is optional, but must be a _synchronous_ `Store` instance if specified. If not passed, a new instance of `MemoryCookieStore` is used. + +The _source_ and _destination_ must both be synchronous `Store`s. If one or both stores are asynchronous, use `.clone` instead. Recall that `MemoryCookieStore` supports both synchronous and asynchronous API calls. + +### `.removeAllCookies(cb(err))` + +Removes all cookies from the jar. + +This is a new backwards-compatible feature of `tough-cookie` version 2.5, so not all Stores will implement it efficiently. For Stores that do not implement `removeAllCookies`, the fallback is to call `removeCookie` after `getAllCookies`. If `getAllCookies` fails or isn't implemented in the Store, that error is returned. If one or more of the `removeCookie` calls fail, only the first error is returned. + +### `.removeAllCookiesSync()` + +Sync version of `.removeAllCookies()` + +## Store + +Base class for CookieJar stores. Available as `tough.Store`. + +## Store API + +The storage model for each `CookieJar` instance can be replaced with a custom implementation. The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file. The API uses continuation-passing-style to allow for asynchronous stores. + +Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`. + +Stores are asynchronous by default, but if `store.synchronous` is set to `true`, then the `*Sync` methods on the of the containing `CookieJar` can be used (however, the continuation-passing style + +All `domain` parameters will have been normalized before calling. + +The Cookie store must have all of the following methods. + +### `store.findCookie(domain, path, key, cb(err,cookie))` + +Retrieve a cookie with the given domain, path and key (a.k.a. name). The RFC maintains that exactly one of these cookies should exist in a store. If the store is using versioning, this means that the latest/newest such cookie should be returned. + +Callback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error). + +### `store.findCookies(domain, path, cb(err,cookies))` + +Locates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above. + +If no cookies are found, the callback MUST be passed an empty array. + +The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method. However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done. + +As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`. If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only). + +### `store.putCookie(cookie, cb(err))` + +Adds a new cookie to the store. The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur. + +The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties. + +Pass an error if the cookie cannot be stored. + +### `store.updateCookie(oldCookie, newCookie, cb(err))` + +Update an existing cookie. The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`. The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store. + +The `.lastAccessed` property will always be different between the two objects (to the precision possible via JavaScript's clock). Both `.creation` and `.creationIndex` are guaranteed to be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are selected for automatic deletion (e.g., least-recently-used, which is up to the store to implement). + +Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie. If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object. + +The `newCookie` and `oldCookie` objects MUST NOT be modified. + +Pass an error if the newCookie cannot be stored. + +### `store.removeCookie(domain, path, key, cb(err))` + +Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint). + +The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie. + +### `store.removeCookies(domain, path, cb(err))` + +Removes matching cookies from the store. The `path` parameter is optional, and if missing means all paths in a domain should be removed. + +Pass an error ONLY if removing any existing cookies failed. + +### `store.removeAllCookies(cb(err))` + +_Optional_. Removes all cookies from the store. + +Pass an error if one or more cookies can't be removed. + +**Note**: New method as of `tough-cookie` version 2.5, so not all Stores will implement this, plus some stores may choose not to implement this. + +### `store.getAllCookies(cb(err, cookies))` + +_Optional_. Produces an `Array` of all cookies during `jar.serialize()`. The items in the array can be true `Cookie` objects or generic `Object`s with the [Serialization Format] data structure. + +Cookies SHOULD be returned in creation order to preserve sorting via `compareCookies()`. For reference, `MemoryCookieStore` will sort by `.creationIndex` since it uses true `Cookie` objects internally. If you don't return the cookies in creation order, they'll still be sorted by creation time, but this only has a precision of 1ms. See `compareCookies` for more detail. + +Pass an error if retrieval fails. + +**Note**: not all Stores can implement this due to technical limitations, so it is optional. + +## MemoryCookieStore + +Inherits from `Store`. + +A just-in-memory CookieJar synchronous store implementation, used by default. Despite being a synchronous implementation, it's usable with both the synchronous and asynchronous forms of the `CookieJar` API. Supports serialization, `getAllCookies`, and `removeAllCookies`. + +## Community Cookie Stores + +These are some Store implementations authored and maintained by the community. They aren't official and we don't vouch for them but you may be interested to have a look: + +- [`db-cookie-store`](https://github.com/JSBizon/db-cookie-store): SQL including SQLite-based databases +- [`file-cookie-store`](https://github.com/JSBizon/file-cookie-store): Netscape cookie file format on disk +- [`redis-cookie-store`](https://github.com/benkroeger/redis-cookie-store): Redis +- [`tough-cookie-filestore`](https://github.com/mitsuru/tough-cookie-filestore): JSON on disk +- [`tough-cookie-web-storage-store`](https://github.com/exponentjs/tough-cookie-web-storage-store): DOM localStorage and sessionStorage + + +# Serialization Format + +**NOTE**: if you want to have custom `Cookie` properties serialized, add the property name to `Cookie.serializableProperties`. + +```js + { + // The version of tough-cookie that serialized this jar. + version: 'tough-cookie@1.x.y', + + // add the store type, to make humans happy: + storeType: 'MemoryCookieStore', + + // CookieJar configuration: + rejectPublicSuffixes: true, + // ... future items go here + + // Gets filled from jar.store.getAllCookies(): + cookies: [ + { + key: 'string', + value: 'string', + // ... + /* other Cookie.serializableProperties go here */ + } + ] + } +``` + +# Copyright and License + +BSD-3-Clause: + +```text + Copyright (c) 2015, Salesforce.com, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of Salesforce.com nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +``` diff --git a/packages/字体精简工具/node_modules/tough-cookie/lib/cookie.js b/packages/字体精简工具/node_modules/tough-cookie/lib/cookie.js new file mode 100644 index 0000000..32dc0f8 --- /dev/null +++ b/packages/字体精简工具/node_modules/tough-cookie/lib/cookie.js @@ -0,0 +1,1482 @@ +/*! + * Copyright (c) 2015, Salesforce.com, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of Salesforce.com nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +'use strict'; +var net = require('net'); +var urlParse = require('url').parse; +var util = require('util'); +var pubsuffix = require('./pubsuffix-psl'); +var Store = require('./store').Store; +var MemoryCookieStore = require('./memstore').MemoryCookieStore; +var pathMatch = require('./pathMatch').pathMatch; +var VERSION = require('./version'); + +var punycode; +try { + punycode = require('punycode'); +} catch(e) { + console.warn("tough-cookie: can't load punycode; won't use punycode for domain normalization"); +} + +// From RFC6265 S4.1.1 +// note that it excludes \x3B ";" +var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/; + +var CONTROL_CHARS = /[\x00-\x1F]/; + +// From Chromium // '\r', '\n' and '\0' should be treated as a terminator in +// the "relaxed" mode, see: +// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60 +var TERMINATORS = ['\n', '\r', '\0']; + +// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"' +// Note ';' is \x3B +var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; + +// date-time parsing constants (RFC6265 S5.1.1) + +var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; + +var MONTH_TO_NUM = { + jan:0, feb:1, mar:2, apr:3, may:4, jun:5, + jul:6, aug:7, sep:8, oct:9, nov:10, dec:11 +}; +var NUM_TO_MONTH = [ + 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' +]; +var NUM_TO_DAY = [ + 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' +]; + +var MAX_TIME = 2147483647000; // 31-bit max +var MIN_TIME = 0; // 31-bit min + +/* + * Parses a Natural number (i.e., non-negative integer) with either the + * *DIGIT ( non-digit *OCTET ) + * or + * *DIGIT + * grammar (RFC6265 S5.1.1). + * + * The "trailingOK" boolean controls if the grammar accepts a + * "( non-digit *OCTET )" trailer. + */ +function parseDigits(token, minDigits, maxDigits, trailingOK) { + var count = 0; + while (count < token.length) { + var c = token.charCodeAt(count); + // "non-digit = %x00-2F / %x3A-FF" + if (c <= 0x2F || c >= 0x3A) { + break; + } + count++; + } + + // constrain to a minimum and maximum number of digits. + if (count < minDigits || count > maxDigits) { + return null; + } + + if (!trailingOK && count != token.length) { + return null; + } + + return parseInt(token.substr(0,count), 10); +} + +function parseTime(token) { + var parts = token.split(':'); + var result = [0,0,0]; + + /* RF6256 S5.1.1: + * time = hms-time ( non-digit *OCTET ) + * hms-time = time-field ":" time-field ":" time-field + * time-field = 1*2DIGIT + */ + + if (parts.length !== 3) { + return null; + } + + for (var i = 0; i < 3; i++) { + // "time-field" must be strictly "1*2DIGIT", HOWEVER, "hms-time" can be + // followed by "( non-digit *OCTET )" so therefore the last time-field can + // have a trailer + var trailingOK = (i == 2); + var num = parseDigits(parts[i], 1, 2, trailingOK); + if (num === null) { + return null; + } + result[i] = num; + } + + return result; +} + +function parseMonth(token) { + token = String(token).substr(0,3).toLowerCase(); + var num = MONTH_TO_NUM[token]; + return num >= 0 ? num : null; +} + +/* + * RFC6265 S5.1.1 date parser (see RFC for full grammar) + */ +function parseDate(str) { + if (!str) { + return; + } + + /* RFC6265 S5.1.1: + * 2. Process each date-token sequentially in the order the date-tokens + * appear in the cookie-date + */ + var tokens = str.split(DATE_DELIM); + if (!tokens) { + return; + } + + var hour = null; + var minute = null; + var second = null; + var dayOfMonth = null; + var month = null; + var year = null; + + for (var i=0; i= 70 && year <= 99) { + year += 1900; + } else if (year >= 0 && year <= 69) { + year += 2000; + } + } + } + } + + /* RFC 6265 S5.1.1 + * "5. Abort these steps and fail to parse the cookie-date if: + * * at least one of the found-day-of-month, found-month, found- + * year, or found-time flags is not set, + * * the day-of-month-value is less than 1 or greater than 31, + * * the year-value is less than 1601, + * * the hour-value is greater than 23, + * * the minute-value is greater than 59, or + * * the second-value is greater than 59. + * (Note that leap seconds cannot be represented in this syntax.)" + * + * So, in order as above: + */ + if ( + dayOfMonth === null || month === null || year === null || second === null || + dayOfMonth < 1 || dayOfMonth > 31 || + year < 1601 || + hour > 23 || + minute > 59 || + second > 59 + ) { + return; + } + + return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second)); +} + +function formatDate(date) { + var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d; + var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h; + var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m; + var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s; + return NUM_TO_DAY[date.getUTCDay()] + ', ' + + d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+ + h+':'+m+':'+s+' GMT'; +} + +// S5.1.2 Canonicalized Host Names +function canonicalDomain(str) { + if (str == null) { + return null; + } + str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading . + + // convert to IDN if any non-ASCII characters + if (punycode && /[^\u0001-\u007f]/.test(str)) { + str = punycode.toASCII(str); + } + + return str.toLowerCase(); +} + +// S5.1.3 Domain Matching +function domainMatch(str, domStr, canonicalize) { + if (str == null || domStr == null) { + return null; + } + if (canonicalize !== false) { + str = canonicalDomain(str); + domStr = canonicalDomain(domStr); + } + + /* + * "The domain string and the string are identical. (Note that both the + * domain string and the string will have been canonicalized to lower case at + * this point)" + */ + if (str == domStr) { + return true; + } + + /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */ + + /* "* The string is a host name (i.e., not an IP address)." */ + if (net.isIP(str)) { + return false; + } + + /* "* The domain string is a suffix of the string" */ + var idx = str.indexOf(domStr); + if (idx <= 0) { + return false; // it's a non-match (-1) or prefix (0) + } + + // e.g "a.b.c".indexOf("b.c") === 2 + // 5 === 3+2 + if (str.length !== domStr.length + idx) { // it's not a suffix + return false; + } + + /* "* The last character of the string that is not included in the domain + * string is a %x2E (".") character." */ + if (str.substr(idx-1,1) !== '.') { + return false; + } + + return true; +} + + +// RFC6265 S5.1.4 Paths and Path-Match + +/* + * "The user agent MUST use an algorithm equivalent to the following algorithm + * to compute the default-path of a cookie:" + * + * Assumption: the path (and not query part or absolute uri) is passed in. + */ +function defaultPath(path) { + // "2. If the uri-path is empty or if the first character of the uri-path is not + // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. + if (!path || path.substr(0,1) !== "/") { + return "/"; + } + + // "3. If the uri-path contains no more than one %x2F ("/") character, output + // %x2F ("/") and skip the remaining step." + if (path === "/") { + return path; + } + + var rightSlash = path.lastIndexOf("/"); + if (rightSlash === 0) { + return "/"; + } + + // "4. Output the characters of the uri-path from the first character up to, + // but not including, the right-most %x2F ("/")." + return path.slice(0, rightSlash); +} + +function trimTerminator(str) { + for (var t = 0; t < TERMINATORS.length; t++) { + var terminatorIdx = str.indexOf(TERMINATORS[t]); + if (terminatorIdx !== -1) { + str = str.substr(0,terminatorIdx); + } + } + + return str; +} + +function parseCookiePair(cookiePair, looseMode) { + cookiePair = trimTerminator(cookiePair); + + var firstEq = cookiePair.indexOf('='); + if (looseMode) { + if (firstEq === 0) { // '=' is immediately at start + cookiePair = cookiePair.substr(1); + firstEq = cookiePair.indexOf('='); // might still need to split on '=' + } + } else { // non-loose mode + if (firstEq <= 0) { // no '=' or is at start + return; // needs to have non-empty "cookie-name" + } + } + + var cookieName, cookieValue; + if (firstEq <= 0) { + cookieName = ""; + cookieValue = cookiePair.trim(); + } else { + cookieName = cookiePair.substr(0, firstEq).trim(); + cookieValue = cookiePair.substr(firstEq+1).trim(); + } + + if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) { + return; + } + + var c = new Cookie(); + c.key = cookieName; + c.value = cookieValue; + return c; +} + +function parse(str, options) { + if (!options || typeof options !== 'object') { + options = {}; + } + str = str.trim(); + + // We use a regex to parse the "name-value-pair" part of S5.2 + var firstSemi = str.indexOf(';'); // S5.2 step 1 + var cookiePair = (firstSemi === -1) ? str : str.substr(0, firstSemi); + var c = parseCookiePair(cookiePair, !!options.loose); + if (!c) { + return; + } + + if (firstSemi === -1) { + return c; + } + + // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string + // (including the %x3B (";") in question)." plus later on in the same section + // "discard the first ";" and trim". + var unparsed = str.slice(firstSemi + 1).trim(); + + // "If the unparsed-attributes string is empty, skip the rest of these + // steps." + if (unparsed.length === 0) { + return c; + } + + /* + * S5.2 says that when looping over the items "[p]rocess the attribute-name + * and attribute-value according to the requirements in the following + * subsections" for every item. Plus, for many of the individual attributes + * in S5.3 it says to use the "attribute-value of the last attribute in the + * cookie-attribute-list". Therefore, in this implementation, we overwrite + * the previous value. + */ + var cookie_avs = unparsed.split(';'); + while (cookie_avs.length) { + var av = cookie_avs.shift().trim(); + if (av.length === 0) { // happens if ";;" appears + continue; + } + var av_sep = av.indexOf('='); + var av_key, av_value; + + if (av_sep === -1) { + av_key = av; + av_value = null; + } else { + av_key = av.substr(0,av_sep); + av_value = av.substr(av_sep+1); + } + + av_key = av_key.trim().toLowerCase(); + + if (av_value) { + av_value = av_value.trim(); + } + + switch(av_key) { + case 'expires': // S5.2.1 + if (av_value) { + var exp = parseDate(av_value); + // "If the attribute-value failed to parse as a cookie date, ignore the + // cookie-av." + if (exp) { + // over and underflow not realistically a concern: V8's getTime() seems to + // store something larger than a 32-bit time_t (even with 32-bit node) + c.expires = exp; + } + } + break; + + case 'max-age': // S5.2.2 + if (av_value) { + // "If the first character of the attribute-value is not a DIGIT or a "-" + // character ...[or]... If the remainder of attribute-value contains a + // non-DIGIT character, ignore the cookie-av." + if (/^-?[0-9]+$/.test(av_value)) { + var delta = parseInt(av_value, 10); + // "If delta-seconds is less than or equal to zero (0), let expiry-time + // be the earliest representable date and time." + c.setMaxAge(delta); + } + } + break; + + case 'domain': // S5.2.3 + // "If the attribute-value is empty, the behavior is undefined. However, + // the user agent SHOULD ignore the cookie-av entirely." + if (av_value) { + // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E + // (".") character." + var domain = av_value.trim().replace(/^\./, ''); + if (domain) { + // "Convert the cookie-domain to lower case." + c.domain = domain.toLowerCase(); + } + } + break; + + case 'path': // S5.2.4 + /* + * "If the attribute-value is empty or if the first character of the + * attribute-value is not %x2F ("/"): + * Let cookie-path be the default-path. + * Otherwise: + * Let cookie-path be the attribute-value." + * + * We'll represent the default-path as null since it depends on the + * context of the parsing. + */ + c.path = av_value && av_value[0] === "/" ? av_value : null; + break; + + case 'secure': // S5.2.5 + /* + * "If the attribute-name case-insensitively matches the string "Secure", + * the user agent MUST append an attribute to the cookie-attribute-list + * with an attribute-name of Secure and an empty attribute-value." + */ + c.secure = true; + break; + + case 'httponly': // S5.2.6 -- effectively the same as 'secure' + c.httpOnly = true; + break; + + default: + c.extensions = c.extensions || []; + c.extensions.push(av); + break; + } + } + + return c; +} + +// avoid the V8 deoptimization monster! +function jsonParse(str) { + var obj; + try { + obj = JSON.parse(str); + } catch (e) { + return e; + } + return obj; +} + +function fromJSON(str) { + if (!str) { + return null; + } + + var obj; + if (typeof str === 'string') { + obj = jsonParse(str); + if (obj instanceof Error) { + return null; + } + } else { + // assume it's an Object + obj = str; + } + + var c = new Cookie(); + for (var i=0; i 1) { + var lindex = path.lastIndexOf('/'); + if (lindex === 0) { + break; + } + path = path.substr(0,lindex); + permutations.push(path); + } + permutations.push('/'); + return permutations; +} + +function getCookieContext(url) { + if (url instanceof Object) { + return url; + } + // NOTE: decodeURI will throw on malformed URIs (see GH-32). + // Therefore, we will just skip decoding for such URIs. + try { + url = decodeURI(url); + } + catch(err) { + // Silently swallow error + } + + return urlParse(url); +} + +function Cookie(options) { + options = options || {}; + + Object.keys(options).forEach(function(prop) { + if (Cookie.prototype.hasOwnProperty(prop) && + Cookie.prototype[prop] !== options[prop] && + prop.substr(0,1) !== '_') + { + this[prop] = options[prop]; + } + }, this); + + this.creation = this.creation || new Date(); + + // used to break creation ties in cookieCompare(): + Object.defineProperty(this, 'creationIndex', { + configurable: false, + enumerable: false, // important for assert.deepEqual checks + writable: true, + value: ++Cookie.cookiesCreated + }); +} + +Cookie.cookiesCreated = 0; // incremented each time a cookie is created + +Cookie.parse = parse; +Cookie.fromJSON = fromJSON; + +Cookie.prototype.key = ""; +Cookie.prototype.value = ""; + +// the order in which the RFC has them: +Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity +Cookie.prototype.maxAge = null; // takes precedence over expires for TTL +Cookie.prototype.domain = null; +Cookie.prototype.path = null; +Cookie.prototype.secure = false; +Cookie.prototype.httpOnly = false; +Cookie.prototype.extensions = null; + +// set by the CookieJar: +Cookie.prototype.hostOnly = null; // boolean when set +Cookie.prototype.pathIsDefault = null; // boolean when set +Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse +Cookie.prototype.lastAccessed = null; // Date when set +Object.defineProperty(Cookie.prototype, 'creationIndex', { + configurable: true, + enumerable: false, + writable: true, + value: 0 +}); + +Cookie.serializableProperties = Object.keys(Cookie.prototype) + .filter(function(prop) { + return !( + Cookie.prototype[prop] instanceof Function || + prop === 'creationIndex' || + prop.substr(0,1) === '_' + ); + }); + +Cookie.prototype.inspect = function inspect() { + var now = Date.now(); + return 'Cookie="'+this.toString() + + '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') + + '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') + + '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') + + '"'; +}; + +// Use the new custom inspection symbol to add the custom inspect function if +// available. +if (util.inspect.custom) { + Cookie.prototype[util.inspect.custom] = Cookie.prototype.inspect; +} + +Cookie.prototype.toJSON = function() { + var obj = {}; + + var props = Cookie.serializableProperties; + for (var i=0; i=0.8" + }, + "files": [ + "lib" + ], + "homepage": "https://github.com/salesforce/tough-cookie", + "keywords": [ + "HTTP", + "cookie", + "cookies", + "set-cookie", + "cookiejar", + "jar", + "RFC6265", + "RFC2965" + ], + "license": "BSD-3-Clause", + "main": "./lib/cookie", + "name": "tough-cookie", + "repository": { + "type": "git", + "url": "git://github.com/salesforce/tough-cookie.git" + }, + "scripts": { + "cover": "nyc --reporter=lcov --reporter=html vows test/*_test.js", + "test": "vows test/*_test.js", + "version": "genversion lib/version.js && git add lib/version.js" + }, + "version": "2.5.0" +} diff --git a/packages/字体精简工具/node_modules/trim-newlines/index.js b/packages/字体精简工具/node_modules/trim-newlines/index.js new file mode 100644 index 0000000..da31efd --- /dev/null +++ b/packages/字体精简工具/node_modules/trim-newlines/index.js @@ -0,0 +1,13 @@ +'use strict'; + +var fn = module.exports = function (x) { + return fn.end(fn.start(x)); +}; + +fn.start = function (x) { + return x.replace(/^[\r\n]+/, ''); +}; + +fn.end = function (x) { + return x.replace(/[\r\n]+$/, ''); +}; diff --git a/packages/字体精简工具/node_modules/trim-newlines/license b/packages/字体精简工具/node_modules/trim-newlines/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/packages/字体精简工具/node_modules/trim-newlines/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/trim-newlines/package.json b/packages/字体精简工具/node_modules/trim-newlines/package.json new file mode 100644 index 0000000..7302561 --- /dev/null +++ b/packages/字体精简工具/node_modules/trim-newlines/package.json @@ -0,0 +1,74 @@ +{ + "_from": "trim-newlines@^1.0.0", + "_id": "trim-newlines@1.0.0", + "_inBundle": false, + "_integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "_location": "/trim-newlines", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "trim-newlines@^1.0.0", + "name": "trim-newlines", + "escapedName": "trim-newlines", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/meow" + ], + "_resolved": "https://registry.nlark.com/trim-newlines/download/trim-newlines-1.0.0.tgz?cache=0&sync_timestamp=1619005721489&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftrim-newlines%2Fdownload%2Ftrim-newlines-1.0.0.tgz", + "_shasum": "5887966bb582a4503a41eb524f7d35011815a613", + "_spec": "trim-newlines@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\meow", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/trim-newlines/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Trim newlines from the start and/or end of a string", + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/trim-newlines#readme", + "keywords": [ + "trim", + "newline", + "newlines", + "linebreak", + "lf", + "crlf", + "left", + "right", + "start", + "end", + "string", + "str", + "remove", + "delete", + "strip" + ], + "license": "MIT", + "name": "trim-newlines", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/trim-newlines.git" + }, + "scripts": { + "test": "xo && ava" + }, + "version": "1.0.0" +} diff --git a/packages/字体精简工具/node_modules/trim-newlines/readme.md b/packages/字体精简工具/node_modules/trim-newlines/readme.md new file mode 100644 index 0000000..fedb3ca --- /dev/null +++ b/packages/字体精简工具/node_modules/trim-newlines/readme.md @@ -0,0 +1,46 @@ +# trim-newlines [![Build Status](https://travis-ci.org/sindresorhus/trim-newlines.svg?branch=master)](https://travis-ci.org/sindresorhus/trim-newlines) + +> Trim [newlines](https://en.wikipedia.org/wiki/Newline) from the start and/or end of a string + + +## Install + +``` +$ npm install --save trim-newlines +``` + + +## Usage + +```js +var trimNewlines = require('trim-newlines'); + +trimNewlines('\nunicorn\r\n'); +//=> 'unicorn' +``` + + +## API + +### trimNewlines(input) + +Trim from the start and end of a string. + +### trimNewlines.start(input) + +Trim from the start of a string. + +### trimNewlines.end(input) + +Trim from the end of a string. + + +## Related + +- [trim-left](https://github.com/sindresorhus/trim-left) - Similar to `String#trim()` but removes only whitespace on the left +- [trim-right](https://github.com/sindresorhus/trim-right) - Similar to `String#trim()` but removes only whitespace on the right. + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/packages/字体精简工具/node_modules/ttf2woff2/.eslintrc b/packages/字体精简工具/node_modules/ttf2woff2/.eslintrc new file mode 100644 index 0000000..cf585c0 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/.eslintrc @@ -0,0 +1,22 @@ +{ + "extends": "eslint-config-simplifield", + "env": { + "node": true, + "mocha": true + }, + "globals": { + "require": false, + "describe": false, + "beforeEach": false, + "afterEach": false, + "before": false, + "after": false, + "it": false, + "sinon": false, + "module": false + }, + "rules": { + "global-require": [0], + "strict": [2, "global"] + } +} diff --git a/packages/字体精简工具/node_modules/ttf2woff2/.istanbul.yml b/packages/字体精简工具/node_modules/ttf2woff2/.istanbul.yml new file mode 100644 index 0000000..c02c943 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/.istanbul.yml @@ -0,0 +1,6 @@ +instrumentation: + root: src/ + extensions: + - .js + default-excludes: true + excludes: [] diff --git a/packages/字体精简工具/node_modules/ttf2woff2/.travis.yml b/packages/字体精简工具/node_modules/ttf2woff2/.travis.yml new file mode 100644 index 0000000..3b5b7ea --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/.travis.yml @@ -0,0 +1,33 @@ +os: + - linux + - osx +sudo: false +language: cpp +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-4.8 +env: + matrix: + - TRAVIS_NODE_VERSION="4" + - TRAVIS_NODE_VERSION="5" + - TRAVIS_NODE_VERSION="6" + - TRAVIS_NODE_VERSION="7" + - TRAVIS_NODE_VERSION="8" + - TRAVIS_NODE_VERSION="9" + - TRAVIS_NODE_VERSION="10" + - TRAVIS_NODE_VERSION="11" + - TRAVIS_NODE_VERSION="12" +cache: + directories: + - node_modules +install: + - rm -rf ~/.nvm && git clone https://github.com/creationix/nvm.git ~/.nvm && (cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`) && source ~/.nvm/nvm.sh && nvm install $TRAVIS_NODE_VERSION + - node --version + - if [[ $TRAVIS_OS_NAME == "linux" ]]; then export CXX=g++-4.8; fi + - $CXX --version + - travis_retry npm install +script: + - npm test diff --git a/packages/字体精简工具/node_modules/ttf2woff2/LICENCE b/packages/字体精简工具/node_modules/ttf2woff2/LICENCE new file mode 100644 index 0000000..454ab9d --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/LICENCE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2013 Nicolas Froidure, + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/ttf2woff2/README.md b/packages/字体精简工具/node_modules/ttf2woff2/README.md new file mode 100644 index 0000000..1e828d5 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/README.md @@ -0,0 +1,38 @@ +# ttf2woff2 + +> Convert TTF files to WOFF2. + +[![NPM version](https://badge.fury.io/js/ttf2woff2.svg)](https://npmjs.org/package/ttf2woff2) [![Build status](https://secure.travis-ci.org/nfroidure/ttf2woff2.svg)](https://travis-ci.org/nfroidure/ttf2woff2) [![Dependency Status](https://david-dm.org/nfroidure/ttf2woff2.svg)](https://david-dm.org/nfroidure/ttf2woff2) [![devDependency Status](https://david-dm.org/nfroidure/ttf2woff2/dev-status.svg)](https://david-dm.org/nfroidure/ttf2woff2#info=devDependencies) [![Coverage Status](https://coveralls.io/repos/nfroidure/ttf2woff2/badge.svg?branch=master)](https://coveralls.io/r/nfroidure/ttf2woff2?branch=master) [![Code Climate](https://codeclimate.com/github/nfroidure/ttf2woff2.svg)](https://codeclimate.com/github/nfroidure/ttf2woff2) + +This is a NodeJS wrapper for the Google [WOFF2](https://github.com/google/woff2) + project. If the C++ wrapper compilation fail, it [fallbacks to an Emscripten + build](http://insertafter.com/en/blog/native-node-module.html). + +## Usage + +### CLI + +Install `ttf2woff2` globally, then: + +```sh +cat font.ttf | ttf2woff2 >> font.woff2 +``` + +### API + +```js +var fs = require('fs'); +var ttf2woff2 = require('ttf2woff2'); + +var input = fs.readFileSync('font.ttf'); + +fs.writeFileSync('font.woff2', ttf2woff2(input)); + +``` + +## Contributing +Feel free to push your code if you agree with publishing under the MIT license. + +## Stats +[![NPM](https://nodei.co/npm/ttf2woff2.png?downloads=true&stars=true)](https://nodei.co/npm/ttf2woff2/) +[![NPM](https://nodei.co/npm-dl/ttf2woff2.png)](https://nodei.co/npm/ttf2woff2/) diff --git a/packages/字体精简工具/node_modules/ttf2woff2/bin/ttf2woff2.js b/packages/字体精简工具/node_modules/ttf2woff2/bin/ttf2woff2.js new file mode 100644 index 0000000..bfe9f68 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/bin/ttf2woff2.js @@ -0,0 +1,11 @@ +#! /usr/bin/env node + +var BufferStreams = require('bufferstreams'); +var ttf2woff2 = require('../src'); + +process.stdin.pipe(new BufferStreams(function(err, buf, cb) { + if (err) { + throw err; + } + cb(null, ttf2woff2(buf)); +})).pipe(process.stdout); diff --git a/packages/字体精简工具/node_modules/ttf2woff2/binding.gyp b/packages/字体精简工具/node_modules/ttf2woff2/binding.gyp new file mode 100644 index 0000000..21d8b88 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/binding.gyp @@ -0,0 +1,50 @@ +{ + "targets": [ + { + "target_name": "addon", + "sources": [ + "csrc/addon.cc", + + "csrc/woff2/glyph.cc", + "csrc/woff2/font.cc", + "csrc/woff2/normalize.cc", + "csrc/woff2/table_tags.cc", + "csrc/woff2/transform.cc", + "csrc/woff2/variable_length.cc", + "csrc/woff2/woff2_common.cc", + "csrc/woff2/woff2_enc.cc", + + "csrc/enc/backward_references.cc", + "csrc/enc/block_splitter.cc", + "csrc/enc/brotli_bit_stream.cc", + "csrc/enc/encode.cc", + "csrc/enc/encode_parallel.cc", + "csrc/enc/entropy_encode.cc", + "csrc/enc/histogram.cc", + "csrc/enc/literal_cost.cc", + "csrc/enc/metablock.cc", + "csrc/enc/streams.cc" + ], + "include_dirs" : [ + " + 0000:00000000 __guard_fids_count 0000000000000000 + 0000:00000000 ___safe_se_handler_table 0000000000000000 + 0000:00000000 __x64_code_ranges_to_entry_points_count 0000000000000000 + 0000:00000000 __arm64x_extra_rfe_table 0000000000000000 + 0000:00000000 __arm64x_redirection_metadata 0000000000000000 + 0000:00000000 __hybrid_code_map 0000000000000000 + 0000:00000000 __guard_iat_table 0000000000000000 + 0000:00000000 __volatile_metadata 0000000000000000 + 0000:00000000 __arm64x_extra_rfe_table_size 0000000000000000 + 0000:00000000 ___safe_se_handler_count 0000000000000000 + 0000:00000000 __guard_longjmp_table 0000000000000000 + 0000:00000000 __guard_iat_count 0000000000000000 + 0000:00000000 __guard_longjmp_count 0000000000000000 + 0000:00000000 __dynamic_value_reloc_table 0000000000000000 + 0000:00000000 __hybrid_auxiliary_iat 0000000000000000 + 0000:00000000 __guard_eh_cont_count 0000000000000000 + 0000:00000000 __AbsoluteZero 0000000000000000 + 0000:00000000 __guard_fids_table 0000000000000000 + 0000:00000000 __arm64x_redirection_metadata_count 0000000000000000 + 0000:00000000 __enclave_config 0000000000000000 + 0000:00000000 __guard_eh_cont_table 0000000000000000 + 0000:00000000 __arm64x_native_entrypoint 0000000000000000 + 0000:00000000 __hybrid_code_map_count 0000000000000000 + 0000:00000100 __guard_flags 0000000000000100 + 0000:00000000 __ImageBase 0000000180000000 + 0001:000000e0 ?convert@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@Nan@@@Z 00000001800010e0 f addon.obj + 0001:00000470 ?Init@@YAXV?$Local@VObject@v8@@@v8@@@Z 0000000180001470 f addon.obj + 0001:00000680 ?what@exception@stdext@@UEBAPEBDXZ 0000000180001680 f i glyph.obj + 0001:000006a0 ?_Raise@exception@stdext@@QEBAXXZ 00000001800016a0 f i glyph.obj + 0001:000006e0 _guard_check_icall_nop 00000001800016e0 f i LIBCMT:guard_support.obj + 0001:000006e0 ?_Doraise@exception@stdext@@MEBAXXZ 00000001800016e0 f i glyph.obj + 0001:000006f0 ??_Ebad_array_new_length@stdext@@UEAAPEAXI@Z 00000001800016f0 f i * CIL library *:* CIL module * + 0001:000006f0 ??_Gexception@stdext@@UEAAPEAXI@Z 00000001800016f0 f i glyph.obj + 0001:000006f0 ??_Eexception@stdext@@UEAAPEAXI@Z 00000001800016f0 f i * CIL library *:* CIL module * + 0001:000006f0 ??_Gbad_array_new_length@stdext@@UEAAPEAXI@Z 00000001800016f0 f i glyph.obj + 0001:00000720 ?_Doraise@bad_alloc@stdext@@MEBAXXZ 0000000180001720 f i glyph.obj + 0001:00000740 ??0bad_array_new_length@stdext@@QEAA@XZ 0000000180001740 f i glyph.obj + 0001:00000760 ?_Throw_bad_array_new_length@std@@YAXXZ 0000000180001760 f i glyph.obj + 0001:00000780 ?ReadGlyph@woff2@@YA_NPEBE_KPEAVGlyph@1@@Z 0000000180001780 f glyph.obj + 0001:000013f0 ?StoreGlyph@woff2@@YA_NAEBVGlyph@1@PEAEPEA_K@Z 00000001800023f0 f glyph.obj + 0001:00001650 ?resize@?$vector@EV?$allocator@E@std@@@std@@QEAAX_K@Z 0000000180002650 f i glyph.obj + 0001:000017a0 ??$_Destroy_range@V?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@std@@@std@@YAXPEAV?$vector@EV?$allocator@E@std@@@0@QEAV10@AEAV?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@0@@Z 00000001800027a0 f i glyph.obj + 0001:00001820 ??$_Destroy_range@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@std@@@std@@YAXPEAV?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@0@QEAV10@AEAV?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@0@@Z 0000000180002820 f i glyph.obj + 0001:000018e0 ?_Xlength@?$vector@V?$vector@EV?$allocator@E@std@@@std@@V?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@2@@std@@CAXXZ 00000001800028e0 f i glyph.obj + 0001:000018e0 ?_Xlength@?$vector@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@2@@std@@CAXXZ 00000001800028e0 f i glyph.obj + 0001:000018e0 ?_Xlength@?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@CAXXZ 00000001800028e0 f i block_splitter.obj + 0001:000018e0 ?_Xlength@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@CAXXZ 00000001800028e0 f i block_splitter.obj + 0001:000018e0 ?_Xlength@?$vector@HV?$allocator@H@std@@@std@@CAXXZ 00000001800028e0 f i block_splitter.obj + 0001:000018e0 ?_Xlength@?$vector@GV?$allocator@G@std@@@std@@CAXXZ 00000001800028e0 f i block_splitter.obj + 0001:000018e0 ?_Xlength@?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@CAXXZ 00000001800028e0 f i glyph.obj + 0001:000018e0 ?_Xlength@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@CAXXZ 00000001800028e0 f i font.obj + 0001:000018e0 ?_Xlength@?$vector@EV?$allocator@E@std@@@std@@CAXXZ 00000001800028e0 f i glyph.obj + 0001:000018e0 ?_Xlength@?$vector@IV?$allocator@I@std@@@std@@CAXXZ 00000001800028e0 f i font.obj + 0001:000018e0 ?_Xlength@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@CAXXZ 00000001800028e0 f i block_splitter.obj + 0001:000018e0 ?_Xlength@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@CAXXZ 00000001800028e0 f i block_splitter.obj + 0001:000018e0 ?_Xlength@?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@CAXXZ 00000001800028e0 f i woff2_enc.obj + 0001:00001900 ?allocate@?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@std@@QEAAPEAV?$vector@EV?$allocator@E@std@@@2@_K@Z 0000000180002900 f i glyph.obj + 0001:00001980 ??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 0000000180002980 f i glyph.obj + 0001:00001b40 ??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@2@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 0000000180002b40 f i glyph.obj + 0001:00001d70 ?_Change_array@?$vector@EV?$allocator@E@std@@@std@@AEAAXQEAE_K1@Z 0000000180002d70 f i glyph.obj + 0001:00001e00 ?_Throw_tree_length_error@std@@YAXXZ 0000000180002e00 f i font.obj + 0001:00001e20 ?Log2Floor@woff2@@YAHI@Z 0000000180002e20 f i font.obj + 0001:00001ed0 ?OutputOrderedTags@Font@woff2@@QEBA?AV?$vector@IV?$allocator@I@std@@@std@@XZ 0000000180002ed0 f font.obj + 0001:00001fc0 ?ReadTrueTypeFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@@Z 0000000180002fc0 f font.obj + 0001:000024e0 ?ReadCollectionFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@PEAV?$map@IPEAUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@5@@std@@@Z 00000001800034e0 f font.obj + 0001:00002680 ?ReadTrueTypeCollection@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFontCollection@1@@Z 0000000180003680 f font.obj + 0001:000028e0 ?NumGlyphs@woff2@@YAHAEBUFont@1@@Z 00000001800038e0 f font.obj + 0001:00002a10 ?GetGlyphData@woff2@@YA_NAEBUFont@1@HPEAPEBEPEA_K@Z 0000000180003a10 f font.obj + 0001:00002cc0 ?resize@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@QEAAX_K@Z 0000000180003cc0 f i font.obj + 0001:00002de0 ??A?$map@IPEAUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@5@@std@@QEAAAEAPEAUTable@Font@woff2@@AEBI@Z 0000000180003de0 f i font.obj + 0001:00002ed0 ??A?$map@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@@std@@QEAAAEAUTable@Font@woff2@@AEBI@Z 0000000180003ed0 f i font.obj + 0001:00002ed0 ??A?$map@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@@std@@QEAAAEAUTable@Font@woff2@@$$QEAI@Z 0000000180003ed0 f i transform.obj + 0001:00002fd0 ??$_Emplace_reallocate@AEBI@?$vector@IV?$allocator@I@std@@@std@@QEAAPEAIQEAIAEBI@Z 0000000180003fd0 f i font.obj + 0001:00003170 ?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@H@std@@@std@@QEAAPEAU?$_Tree_node@HPEAX@2@U?$_Tree_id@PEAU?$_Tree_node@HPEAX@std@@@2@QEAU32@@Z 0000000180004170 f i block_splitter.obj + 0001:00003170 ?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@2@QEAU32@@Z 0000000180004170 f i font.obj + 0001:00003170 ?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBHH@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@std@@@2@QEAU32@@Z 0000000180004170 f i block_splitter.obj + 0001:00003170 ?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBII@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBII@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBII@std@@PEAX@std@@@2@QEAU32@@Z 0000000180004170 f i font.obj + 0001:00003170 ?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIG@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@2@QEAU32@@Z 0000000180004170 f i woff2_enc.obj + 0001:00003170 ?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@std@@@2@QEAU32@@Z 0000000180004170 f i font.obj + 0001:00003170 ?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBEE@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@std@@@2@QEAU32@@Z 0000000180004170 f i block_splitter.obj + 0001:000033f0 ?_Extract@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@2@V?$_Tree_unchecked_const_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@U_Iterator_base0@2@@2@@Z 00000001800043f0 f i font.obj + 0001:00003890 ??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIG@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@1@@Z 0000000180004890 f i woff2_enc.obj + 0001:00003890 ??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBHH@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@1@@Z 0000000180004890 f i block_splitter.obj + 0001:00003890 ??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBII@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBII@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBII@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBII@std@@PEAX@1@@Z 0000000180004890 f i font.obj + 0001:000038f0 ??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800048f0 f i font.obj + 0001:00003c30 ??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@1@@Z 0000000180004c30 f i font.obj + 0001:00003c90 ?_Buy_raw@?$vector@EV?$allocator@E@std@@@std@@AEAAX_K@Z 0000000180004c90 f i font.obj + 0001:00003d10 ??$_Sort_unchecked@PEAIU?$less@X@std@@@std@@YAXPEAI0_JU?$less@X@0@@Z 0000000180004d10 f i font.obj + 0001:00003fd0 ??$_Partition_by_median_guess_unchecked@PEAIU?$less@X@std@@@std@@YA?AU?$pair@PEAIPEAI@0@PEAI0U?$less@X@0@@Z 0000000180004fd0 f i font.obj + 0001:00004150 ??$_Guess_median_unchecked@PEAIU?$less@X@std@@@std@@YAXPEAI00U?$less@X@0@@Z 0000000180005150 f i font.obj + 0001:000042a0 ??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@@Z 00000001800052a0 f i font.obj + 0001:00004360 ??$_Copy_nodes@U_Copy_tag@?$_Tree@V?$_Tmap_traits@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@$0A@@std@@@std@@@?$_Tree@V?$_Tmap_traits@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@$0A@@std@@@std@@IEAAPEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@PEAU21@0U_Copy_tag@01@@Z 0000000180005360 f i font.obj + 0001:00004450 ??0?$vector@EV?$allocator@E@std@@@std@@QEAA@AEBV01@@Z 0000000180005450 f i font.obj + 0001:000044d0 __local_stdio_printf_options 00000001800054d0 f i normalize.obj + 0001:000044e0 fprintf 00000001800054e0 f i normalize.obj + 0001:00004960 ?NormalizeGlyphs@woff2@@YA_NPEAUFont@1@@Z 0000000180005960 f normalize.obj + 0001:00004bc0 ?FixChecksums@woff2@@YA_NPEAUFont@1@@Z 0000000180005bc0 f normalize.obj + 0001:00004e80 ?NormalizeWithoutFixingChecksums@woff2@@YA_NPEAUFont@1@@Z 0000000180005e80 f normalize.obj + 0001:00005180 ?NormalizeFontCollection@woff2@@YA_NPEAUFontCollection@1@@Z 0000000180006180 f normalize.obj + 0001:00006020 ?TransformGlyfAndLocaTables@woff2@@YA_NPEAUFont@1@@Z 0000000180007020 f transform.obj + 0001:00006770 ??$emplace_back@AEBE@?$vector@EV?$allocator@E@std@@@std@@QEAAXAEBE@Z 0000000180007770 f i transform.obj + 0001:00006770 ??$emplace_back@E@?$vector@EV?$allocator@E@std@@@std@@QEAAX$$QEAE@Z 0000000180007770 f i transform.obj + 0001:000068d0 ?Write255UShort@woff2@@YAXPEAV?$vector@EV?$allocator@E@std@@@std@@H@Z 00000001800078d0 f variable_length.obj + 0001:00006970 ?Store255UShort@woff2@@YAXHPEA_KPEAE@Z 0000000180007970 f variable_length.obj + 0001:00006aa0 ?_Xlen_string@std@@YAXXZ 0000000180007aa0 f i woff2_enc.obj + 0001:000071a0 ?ConvertTTFToWOFF2@woff2@@YA_NPEBE_KPEAEPEA_KAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 00000001800081a0 f woff2_enc.obj + 0001:000083f0 ??A?$map@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@@std@@QEAAAEAGAEBI@Z 00000001800093f0 f i woff2_enc.obj + 0001:000084e0 ??1?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@QEAA@XZ 00000001800094e0 f i woff2_enc.obj + 0001:000085c0 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@QEBD_K@Z 00000001800095c0 f i woff2_enc.obj + 0001:00008720 ??$_Emplace_reallocate@AEBUTable@woff2@@@?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@QEAAPEAUTable@woff2@@QEAU23@AEBU23@@Z 0000000180009720 f i woff2_enc.obj + 0001:00008940 ??$_Erase_head@V?$allocator@U?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIG@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@1@@Z 0000000180009940 f i woff2_enc.obj + 0001:000089c0 ??$_Copy_nodes@U_Copy_tag@?$_Tree@V?$_Tmap_traits@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@$0A@@std@@@std@@@?$_Tree@V?$_Tmap_traits@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@$0A@@std@@@std@@IEAAPEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@1@PEAU21@0U_Copy_tag@01@@Z 00000001800099c0 f i woff2_enc.obj + 0001:00008a80 ?Log2Floor@brotli@@YAHI@Z 0000000180009a80 f i backward_references.obj + 0001:00008ce0 ?CreateBackwardReferences@brotli@@YAX_K0PEBE0PEBM0_KNHPEAUHashers@1@HPEAH5PEAUCommand@1@5@Z 0000000180009ce0 f backward_references.obj + 0001:00009260 ??$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BA@$00@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BA@$00@0@PEAH5PEAUCommand@0@5@Z 000000018000a260 f i backward_references.obj + 0001:00009880 ??$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BB@$03@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BB@$03@0@PEAH5PEAUCommand@0@5@Z 000000018000a880 f i backward_references.obj + 0001:00009ee0 ??$CreateBackwardReferences@V?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 000000018000aee0 f i backward_references.obj + 0001:0000a600 ??$CreateBackwardReferences@V?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 000000018000b600 f i backward_references.obj + 0001:0000ad20 ??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 000000018000bd20 f i backward_references.obj + 0001:0000b440 ??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 000000018000c440 f i backward_references.obj + 0001:0000bb60 ??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 000000018000cb60 f i backward_references.obj + 0001:0000c250 ??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$00$00@brotli@@$00$00@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$00$00@0@PEAH5PEAUCommand@0@5@Z 000000018000d250 f i backward_references.obj + 0001:0000cec0 ??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@$00$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@0@PEAH5PEAUCommand@0@5@Z 000000018000dec0 f i backward_references.obj + 0001:0000d8e0 ?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 000000018000e8e0 f i backward_references.obj + 0001:0000e060 ?FindLongestMatch@?$HashLongestMatch@$0P@$07$03$0BA@$00$00@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 000000018000f060 f i backward_references.obj + 0001:0000e950 ?FindLongestMatch@?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 000000018000f950 f i backward_references.obj + 0001:0000f210 ?FindLongestMatch@?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 0000000180010210 f i backward_references.obj + 0001:0000f890 ?FindLongestMatch@?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 0000000180010890 f i backward_references.obj + 0001:0000ff10 ?FindLongestMatch@?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 0000000180010f10 f i backward_references.obj + 0001:00010720 ?FindLongestMatch@?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 0000000180011720 f i backward_references.obj + 0001:00010f30 ?FindLongestMatch@?$HashLongestMatchQuickly@$0BB@$03@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 0000000180011f30 f i backward_references.obj + 0001:00011400 ?FindLongestMatch@?$HashLongestMatchQuickly@$0BA@$00@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 0000000180012400 f i backward_references.obj + 0001:00011870 ?ClusterCostDiff@brotli@@YANHH@Z 0000000180012870 f i block_splitter.obj + 0001:00011a50 ?RemapBlockIds@brotli@@YAHPEAE_K@Z 0000000180012a50 f block_splitter.obj + 0001:00011c70 ?BuildBlockSplit@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@PEAUBlockSplit@1@@Z 0000000180012c70 f block_splitter.obj + 0001:00011d50 ?SplitBlock@brotli@@YAXPEBUCommand@1@_KPEBEPEAUBlockSplit@1@33@Z 0000000180012d50 f block_splitter.obj + 0001:00012000 ??A?$map@EEU?$less@E@std@@V?$allocator@U?$pair@$$CBEE@std@@@2@@std@@QEAAAEAEAEBE@Z 0000000180013000 f i block_splitter.obj + 0001:000120e0 ?push_back@?$vector@HV?$allocator@H@std@@@std@@QEAAXAEBH@Z 00000001800130e0 f i block_splitter.obj + 0001:000120e0 ?push_back@?$vector@HV?$allocator@H@std@@@std@@QEAAX$$QEAH@Z 00000001800130e0 f i block_splitter.obj + 0001:000121f0 ??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800131f0 f i block_splitter.obj + 0001:00012670 ??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 0000000180013670 f i block_splitter.obj + 0001:00012a60 ??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 0000000180013a60 f i block_splitter.obj + 0001:00012ee0 ??$_Emplace_reallocate@AEBG@?$vector@GV?$allocator@G@std@@@std@@QEAAPEAGQEAGAEBG@Z 0000000180013ee0 f i block_splitter.obj + 0001:00013040 ?_Change_array@?$vector@GV?$allocator@G@std@@@std@@AEAAXQEAG_K1@Z 0000000180014040 f i block_splitter.obj + 0001:000130d0 ?_Change_array@?$vector@HV?$allocator@H@std@@@std@@AEAAXQEAH_K1@Z 00000001800140d0 f i block_splitter.obj + 0001:00013160 ?allocate@?$allocator@H@std@@QEAAPEAH_K@Z 0000000180014160 f i block_splitter.obj + 0001:000131d0 ?_Tidy@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAXXZ 00000001800141d0 f i block_splitter.obj + 0001:00013250 ?_Tidy@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAXXZ 0000000180014250 f i block_splitter.obj + 0001:000132d0 ?_Tidy@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@AEAAXXZ 00000001800142d0 f i block_splitter.obj + 0001:00013350 ??$RefineEntropyCodes@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXPEBE_K1PEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@@Z 0000000180014350 f i block_splitter.obj + 0001:000135a0 ??$FindBlocks@E$0BAA@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAE@Z 00000001800145a0 f i block_splitter.obj + 0001:00013940 ??$ClusterBlocks@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXPEBE_KPEAE@Z 0000000180014940 f i block_splitter.obj + 0001:00013bf0 ??$RefineEntropyCodes@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXPEBG_K1PEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@@Z 0000000180014bf0 f i block_splitter.obj + 0001:00013e40 ??$FindBlocks@G$0CMA@@brotli@@YAXPEBG_KNAEBV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAE@Z 0000000180014e40 f i block_splitter.obj + 0001:000141d0 ??$ClusterBlocks@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXPEBG_KPEAE@Z 00000001800151d0 f i block_splitter.obj + 0001:000145a0 ??$RefineEntropyCodes@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXPEBE_K1PEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@@Z 00000001800155a0 f i block_splitter.obj + 0001:00014810 ??$FindBlocks@E$0CAI@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAE@Z 0000000180015810 f i block_splitter.obj + 0001:00014bb0 ??$ClusterBlocks@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXPEBE_KPEAE@Z 0000000180015bb0 f i block_splitter.obj + 0001:00014e60 ??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBEE@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@1@@Z 0000000180015e60 f i block_splitter.obj + 0001:00014e60 ??$_Erase_tree@V?$allocator@U?$_Tree_node@HPEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@H@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@HPEAX@std@@@1@PEAU?$_Tree_node@HPEAX@1@@Z 0000000180015e60 f i block_splitter.obj + 0001:00014ec0 ?push_back@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CAI@@brotli@@@Z 0000000180015ec0 f i block_splitter.obj + 0001:000150a0 ?push_back@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CMA@@brotli@@@Z 00000001800160a0 f i block_splitter.obj + 0001:00015280 ?resize@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAX_K@Z 0000000180016280 f i block_splitter.obj + 0001:00015420 ?push_back@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0BAA@@brotli@@@Z 0000000180016420 f i block_splitter.obj + 0001:00015600 ??$ClusterHistograms@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@HHHPEAV12@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 0000000180016600 f i block_splitter.obj + 0001:00015860 ??$ClusterHistograms@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@HHHPEAV12@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 0000000180016860 f i block_splitter.obj + 0001:00015a60 ??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 0000000180016a60 f i block_splitter.obj + 0001:00015c20 ??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 0000000180016c20 f i block_splitter.obj + 0001:00015de0 ?_Change_array@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAXQEAU?$Histogram@$0CAI@@brotli@@_K1@Z 0000000180016de0 f i block_splitter.obj + 0001:00015ea0 ?allocate@?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@QEAAPEAU?$Histogram@$0CAI@@brotli@@_K@Z 0000000180016ea0 f i block_splitter.obj + 0001:00015f10 ?_Change_array@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAXQEAU?$Histogram@$0CMA@@brotli@@_K1@Z 0000000180016f10 f i block_splitter.obj + 0001:00015fd0 ?allocate@?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@QEAAPEAU?$Histogram@$0CMA@@brotli@@_K@Z 0000000180016fd0 f i block_splitter.obj + 0001:00016040 ?_Change_array@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@AEAAXQEAU?$Histogram@$0BAA@@brotli@@_K1@Z 0000000180017040 f i block_splitter.obj + 0001:00016100 ?allocate@?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@QEAAPEAU?$Histogram@$0BAA@@brotli@@_K@Z 0000000180017100 f i block_splitter.obj + 0001:00016170 ?resize@?$vector@HV?$allocator@H@std@@@std@@QEAAX_K@Z 0000000180017170 f i block_splitter.obj + 0001:00016280 ??$PopulationCost@$0BAA@@brotli@@YANAEBU?$Histogram@$0BAA@@0@@Z 0000000180017280 f i block_splitter.obj + 0001:00016490 ??$HistogramCombine@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAU?$Histogram@$0BAA@@0@PEAH1HH@Z 0000000180017490 f i block_splitter.obj + 0001:00016a90 ??$HistogramRemap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@HPEAU10@PEAH@Z 0000000180017a90 f i block_splitter.obj + 0001:00016f00 ??$HistogramReindex@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 0000000180017f00 f i block_splitter.obj + 0001:00017250 ??$PopulationCost@$0CMA@@brotli@@YANAEBU?$Histogram@$0CMA@@0@@Z 0000000180018250 f i block_splitter.obj + 0001:00017460 ??$HistogramCombine@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAU?$Histogram@$0CMA@@0@PEAH1HH@Z 0000000180018460 f i block_splitter.obj + 0001:00017a60 ??$HistogramRemap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@HPEAU10@PEAH@Z 0000000180018a60 f i block_splitter.obj + 0001:00017ed0 ??$HistogramReindex@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 0000000180018ed0 f i block_splitter.obj + 0001:00018180 ??$PopulationCost@$0CAI@@brotli@@YANAEBU?$Histogram@$0CAI@@0@@Z 0000000180019180 f i block_splitter.obj + 0001:000183b0 ??$HistogramCombine@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAU?$Histogram@$0CAI@@0@PEAH1HH@Z 00000001800193b0 f i block_splitter.obj + 0001:000189c0 ??$HistogramRemap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@HPEAU10@PEAH@Z 00000001800199c0 f i block_splitter.obj + 0001:00018de0 ??$HistogramReindex@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 0000000180019de0 f i block_splitter.obj + 0001:00019090 ??$_Uninitialized_move@PEAU?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@YAPEAU?$Histogram@$0BAA@@brotli@@QEAU12@0PEAU12@AEAV?$allocator@U?$Histogram@$0BAA@@brotli@@@0@@Z 000000018001a090 f i block_splitter.obj + 0001:00019130 ??A?$map@HHU?$less@H@std@@V?$allocator@U?$pair@$$CBHH@std@@@2@@std@@QEAAAEAHAEBH@Z 000000018001a130 f i block_splitter.obj + 0001:00019220 ??$CompareAndPushToHeap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 000000018001a220 f i block_splitter.obj + 0001:000194f0 ??$HistogramBitCostDistance@U?$Histogram@$0BAA@@brotli@@@brotli@@YANAEBU?$Histogram@$0BAA@@0@0@Z 000000018001a4f0 f i block_splitter.obj + 0001:00019640 ??$CompareAndPushToHeap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 000000018001a640 f i block_splitter.obj + 0001:000198b0 ??$HistogramBitCostDistance@U?$Histogram@$0CMA@@brotli@@@brotli@@YANAEBU?$Histogram@$0CMA@@0@0@Z 000000018001a8b0 f i block_splitter.obj + 0001:000199b0 ??$CompareAndPushToHeap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 000000018001a9b0 f i block_splitter.obj + 0001:00019c20 ??$HistogramBitCostDistance@U?$Histogram@$0CAI@@brotli@@@brotli@@YANAEBU?$Histogram@$0CAI@@0@0@Z 000000018001ac20 f i block_splitter.obj + 0001:00019d40 ??$push_heap@V?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@UHistogramPair@brotli@@@std@@@std@@@std@@UHistogramPairComparator@brotli@@@std@@YAXV?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@UHistogramPair@brotli@@@std@@@std@@@0@0UHistogramPairComparator@brotli@@@Z 000000018001ad40 f i block_splitter.obj + 0001:00019e20 ??$_Emplace_reallocate@AEBUHistogramPair@brotli@@@?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@QEAAPEAUHistogramPair@brotli@@QEAU23@AEBU23@@Z 000000018001ae20 f i block_splitter.obj + 0001:00019fd0 ??$_Pop_heap_hole_by_index@PEAUHistogramPair@brotli@@U12@UHistogramPairComparator@2@@std@@YAXPEAUHistogramPair@brotli@@_J1$$QEAU12@UHistogramPairComparator@2@@Z 000000018001afd0 f i block_splitter.obj + 0001:0001a3a0 ?WriteBits@brotli@@YAXH_KPEIAHPEIAE@Z 000000018001b3a0 f i brotli_bit_stream.obj + 0001:0001a420 ?StoreVarLenUint8@brotli@@YAXHPEAHPEAE@Z 000000018001b420 f brotli_bit_stream.obj + 0001:0001a4d0 ?StoreCompressedMetaBlockHeader@brotli@@YA_N_N_KPEAHPEAE@Z 000000018001b4d0 f brotli_bit_stream.obj + 0001:0001a5d0 ?StoreHuffmanTreeOfHuffmanTreeToBitMask@brotli@@YAXHPEBEPEAHPEAE@Z 000000018001b5d0 f brotli_bit_stream.obj + 0001:0001a770 ?StoreSimpleHuffmanTree@brotli@@YAXPEBEQEAHHHPEAHPEAE@Z 000000018001b770 f brotli_bit_stream.obj + 0001:0001a970 ?StoreHuffmanTree@brotli@@YAXPEBE_KPEAHPEAE@Z 000000018001b970 f brotli_bit_stream.obj + 0001:0001ad10 ?BuildAndStoreHuffmanTree@brotli@@YAXPEBHHPEAEPEAGPEAH1@Z 000000018001bd10 f brotli_bit_stream.obj + 0001:0001ae80 ?MoveToFrontTransform@brotli@@YA?AV?$vector@HV?$allocator@H@std@@@std@@AEBV23@@Z 000000018001be80 f brotli_bit_stream.obj + 0001:0001b0f0 ?RunLengthCodeZeros@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@PEAHPEAV23@2@Z 000000018001c0f0 f brotli_bit_stream.obj + 0001:0001b300 ?BestMaxZeroRunLengthPrefix@brotli@@YAHAEBV?$vector@HV?$allocator@H@std@@@std@@@Z 000000018001c300 f brotli_bit_stream.obj + 0001:0001b660 ?EncodeContextMap@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@HPEAHPEAE@Z 000000018001c660 f brotli_bit_stream.obj + 0001:0001ba50 ?BuildAndStoreBlockSplitCode@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@0HPEAUBlockSplitCode@1@PEAHPEAE@Z 000000018001ca50 f brotli_bit_stream.obj + 0001:0001be00 ?StoreTrivialContextMap@brotli@@YAXHHPEAHPEAE@Z 000000018001ce00 f brotli_bit_stream.obj + 0001:0001c2c0 ??0BlockEncoder@brotli@@QEAA@HHAEBV?$vector@HV?$allocator@H@std@@@std@@0@Z 000000018001d2c0 f i brotli_bit_stream.obj + 0001:0001c3b0 ?StoreSymbol@BlockEncoder@brotli@@QEAAXHPEAHPEAE@Z 000000018001d3b0 f i brotli_bit_stream.obj + 0001:0001c4e0 ??1BlockSplitCode@brotli@@QEAA@XZ 000000018001d4e0 f i brotli_bit_stream.obj + 0001:0001c770 ?StoreMetaBlock@brotli@@YA_NPEBE_K11EE_NHHHPEBUCommand@1@1AEBUMetaBlockSplit@1@PEAHPEAE@Z 000000018001d770 f brotli_bit_stream.obj + 0001:0001d390 ??1BlockEncoder@brotli@@QEAA@XZ 000000018001e390 f i brotli_bit_stream.obj + 0001:0001d470 ?StoreUncompressedMetaBlock@brotli@@YA_N_NPEBE_K22PEAHPEAE@Z 000000018001e470 f brotli_bit_stream.obj + 0001:0001d630 ??$PopulationCost@$0BBA@@brotli@@YANAEBU?$Histogram@$0BBA@@0@@Z 000000018001e630 f i brotli_bit_stream.obj + 0001:0001d840 ??$_Resize@U_Value_init_tag@std@@@?$vector@GV?$allocator@G@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 000000018001e840 f i brotli_bit_stream.obj + 0001:0001d9b0 ?ApplyTransform@brotli@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBUTransform@1@PEBEH@Z 000000018001e9b0 f i encode.obj + 0001:0001de70 ??0StaticDictionary@brotli@@QEAA@XZ 000000018001ee70 f i encode.obj + 0001:0001df30 ?Fill@StaticDictionary@brotli@@QEAAX_N@Z 000000018001ef30 f i encode.obj + 0001:0001e0a0 ?Insert@StaticDictionary@brotli@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HH@Z 000000018001f0a0 f i encode.obj + 0001:0001e250 ?Init@Hashers@brotli@@QEAAXH@Z 000000018001f250 f i encode.obj + 0001:0001e600 ??_GBrotliOut@brotli@@UEAAPEAXI@Z 000000018001f600 f i encode.obj + 0001:0001e600 ??_EBrotliOut@brotli@@UEAAPEAXI@Z 000000018001f600 f i * CIL library *:* CIL module * + 0001:0001e600 ??_EBrotliIn@brotli@@UEAAPEAXI@Z 000000018001f600 f i * CIL library *:* CIL module * + 0001:0001e600 ??_GBrotliIn@brotli@@UEAAPEAXI@Z 000000018001f600 f i encode.obj + 0001:0001e630 ?ParseAsUTF8@brotli@@YAHPEAHPEBEH@Z 000000018001f630 f encode.obj + 0001:0001e770 ??0BrotliCompressor@brotli@@QEAA@UBrotliParams@1@@Z 000000018001f770 f encode.obj + 0001:0001eb20 ?CopyInputToRingBuffer@BrotliCompressor@brotli@@QEAAX_KPEBE@Z 000000018001fb20 f encode.obj + 0001:0001ec20 ?WriteBrotliData@BrotliCompressor@brotli@@QEAA_N_N0PEA_KPEAPEAE@Z 000000018001fc20 f encode.obj + 0001:0001f000 ?WriteMetaBlockInternal@BrotliCompressor@brotli@@AEAA_N_N0PEA_KPEAPEAE@Z 0000000180020000 f encode.obj + 0001:0001f710 ?BrotliCompress@brotli@@YAHUBrotliParams@1@PEAVBrotliIn@1@PEAVBrotliOut@1@@Z 0000000180020710 f encode.obj + 0001:0001f8f0 ??1MetaBlockSplit@brotli@@QEAA@XZ 00000001800208f0 f i encode.obj + 0001:0001fa00 ??1BlockSplit@brotli@@QEAA@XZ 0000000180020a00 f i encode.obj + 0001:0001fab0 ??1?$unique_ptr@UHashers@brotli@@U?$default_delete@UHashers@brotli@@@std@@@std@@QEAA@XZ 0000000180020ab0 f i encode.obj + 0001:0001fb90 ?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@2@@Z 0000000180020b90 f i encode.obj + 0001:0001fb90 ?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@2@@Z 0000000180020b90 f i encode.obj + 0001:0001fcd0 ??$_Try_emplace@AEBI$$V@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@PEAU?$_List_node@U?$pair@$$CBIH@std@@PEAX@std@@_N@1@AEBI@Z 0000000180020cd0 f i encode.obj + 0001:0001ff90 ??$_Try_emplace@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$V@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@PEAU?$_List_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@PEAX@std@@_N@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z 0000000180020f90 f i encode.obj + 0001:00020350 ??$_Reallocate_grow_by@V@@PEBD_K@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@PEBD_K@Z 0000000180021350 f i encode.obj + 0001:000204e0 ?_Forced_rehash@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800214e0 f i encode.obj + 0001:000206a0 ?_Forced_rehash@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800216a0 f i encode.obj + 0001:00020920 ??$_Reallocate_grow_by@V@@$$V@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@@Z 0000000180021920 f i encode.obj + 0001:00020a70 ??$_Reallocate_grow_by@V@@D@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@D@Z 0000000180021a70 f i encode.obj + 0001:00020c80 ?CreateHuffmanTree@brotli@@YAXPEBHHHPEAE@Z 0000000180021c80 f entropy_encode.obj + 0001:000211e0 ?WriteHuffmanTreeRepetitions@brotli@@YAXHHHPEAV?$vector@EV?$allocator@E@std@@@std@@0@Z 00000001800221e0 f entropy_encode.obj + 0001:00021380 ?WriteHuffmanTreeRepetitionsZeros@brotli@@YAXHPEAV?$vector@EV?$allocator@E@std@@@std@@0@Z 0000000180022380 f entropy_encode.obj + 0001:000214f0 ?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800224f0 f entropy_encode.obj + 0001:00021a40 ?WriteHuffmanTree@brotli@@YAXPEBEIPEAV?$vector@EV?$allocator@E@std@@@std@@1@Z 0000000180022a40 f entropy_encode.obj + 0001:00021be0 ?ConvertBitDepthsToSymbols@brotli@@YAXPEBEHPEAG@Z 0000000180022be0 f entropy_encode.obj + 0001:00022af0 ?BuildHistograms@brotli@@YAXPEBUCommand@1@_KAEBVBlockSplit@1@22PEBE_K4EEAEBV?$vector@HV?$allocator@H@std@@@std@@PEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@5@PEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@5@PEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@5@@Z 0000000180023af0 f histogram.obj + 0001:00022e30 ?EstimateBitCostsForLiteralsUTF8@brotli@@YAX_K000PEBEPEAM@Z 0000000180023e30 f literal_cost.obj + 0001:000233b0 ?EstimateBitCostsForLiterals@brotli@@YAX_K000PEBEPEAM@Z 00000001800243b0 f literal_cost.obj + 0001:00023740 ?BuildMetaBlock@brotli@@YAXPEBE_K1EEPEBUCommand@1@_KH_NPEAUMetaBlockSplit@1@@Z 0000000180024740 f metablock.obj + 0001:00023f70 ?BuildMetaBlockGreedy@brotli@@YAXPEBE_K1PEBUCommand@1@1PEAUMetaBlockSplit@1@@Z 0000000180024f70 f metablock.obj + 0001:000243d0 ?OptimizeHistograms@brotli@@YAXHHPEAUMetaBlockSplit@1@@Z 00000001800253d0 f metablock.obj + 0001:00024590 ?FinishBlock@?$BlockSplitter@U?$Histogram@$0CAI@@brotli@@@brotli@@QEAAX_N@Z 0000000180025590 f i metablock.obj + 0001:00024a40 ?FinishBlock@?$BlockSplitter@U?$Histogram@$0CMA@@brotli@@@brotli@@QEAAX_N@Z 0000000180025a40 f i metablock.obj + 0001:00024ee0 ?FinishBlock@?$BlockSplitter@U?$Histogram@$0BAA@@brotli@@@brotli@@QEAAX_N@Z 0000000180025ee0 f i metablock.obj + 0001:00025480 ??_EBrotliMemOut@brotli@@UEAAPEAXI@Z 0000000180026480 f i * CIL library *:* CIL module * + 0001:00025480 ??_EBrotliMemIn@brotli@@UEAAPEAXI@Z 0000000180026480 f i * CIL library *:* CIL module * + 0001:00025480 ??_GBrotliMemIn@brotli@@UEAAPEAXI@Z 0000000180026480 f i streams.obj + 0001:00025480 ??_GBrotliMemOut@brotli@@UEAAPEAXI@Z 0000000180026480 f i streams.obj + 0001:000254b0 ?Write@BrotliMemOut@brotli@@UEAA_NPEBX_K@Z 00000001800264b0 f streams.obj + 0001:00025500 ?Read@BrotliMemIn@brotli@@UEAAPEBX_KPEA_K@Z 0000000180026500 f streams.obj + 0001:00025564 __imp_load_?Value@External@v8@@QEBAPEAXXZ 0000000180026564 f node:node.exe + 0001:00025570 __tailMerge_node_exe 0000000180026570 node:node.exe + 0001:000255e9 __imp_load_?New@External@v8@@SA?AV?$Local@VExternal@v8@@@2@PEAVIsolate@2@PEAX@Z 00000001800265e9 f node:node.exe + 0001:000255f5 __imp_load_?ThrowException@Isolate@v8@@QEAA?AV?$Local@VValue@v8@@@2@V32@@Z 00000001800265f5 f node:node.exe + 0001:00025601 __imp_load_?GetCurrentContext@Isolate@v8@@QEAA?AV?$Local@VContext@v8@@@2@XZ 0000000180026601 f node:node.exe + 0001:0002560d __imp_load_?GetCurrent@Isolate@v8@@SAPEAV12@XZ 000000018002660d f node:node.exe + 0001:00025619 __imp_load_?CreateHandle@HandleScope@v8@@CAPEAPEAVObject@internal@2@PEAVHeapObject@42@PEAV342@@Z 0000000180026619 f node:node.exe + 0001:00025625 __imp_load_??1HandleScope@v8@@QEAA@XZ 0000000180026625 f node:node.exe + 0001:00025631 __imp_load_??0HandleScope@v8@@QEAA@PEAVIsolate@1@@Z 0000000180026631 f node:node.exe + 0001:0002563d __imp_load_?Error@Exception@v8@@SA?AV?$Local@VValue@v8@@@2@V?$Local@VString@v8@@@2@@Z 000000018002663d f node:node.exe + 0001:00025649 __imp_load_?TypeError@Exception@v8@@SA?AV?$Local@VValue@v8@@@2@V?$Local@VString@v8@@@2@@Z 0000000180026649 f node:node.exe + 0001:00025655 __imp_load_?GetFunction@FunctionTemplate@v8@@QEAA?AV?$MaybeLocal@VFunction@v8@@@2@V?$Local@VContext@v8@@@2@@Z 0000000180026655 f node:node.exe + 0001:00025661 __imp_load_?New@FunctionTemplate@v8@@SA?AV?$Local@VFunctionTemplate@v8@@@2@PEAVIsolate@2@P6AXAEBV?$FunctionCallbackInfo@VValue@v8@@@2@@ZV?$Local@VValue@v8@@@2@V?$Local@VSignature@v8@@@2@HW4ConstructorBehavior@2@W4SideEffectType@2@@Z 0000000180026661 f node:node.exe + 0001:0002566d __imp_load_?ToLocalEmpty@V8@v8@@CAXXZ 000000018002666d f node:node.exe + 0001:00025679 __imp_load_?ToObject@Value@v8@@QEBA?AV?$MaybeLocal@VObject@v8@@@2@V?$Local@VContext@v8@@@2@@Z 0000000180026679 f node:node.exe + 0001:00025685 __imp_load_?Escape@EscapableHandleScope@v8@@AEAAPEAPEAVObject@internal@2@PEAPEAV342@@Z 0000000180026685 f node:node.exe + 0001:00025691 __imp_load_??0EscapableHandleScope@v8@@QEAA@PEAVIsolate@1@@Z 0000000180026691 f node:node.exe + 0001:0002569d __imp_load_?NewFromUtf8@String@v8@@SA?AV?$MaybeLocal@VString@v8@@@2@PEAVIsolate@2@PEBDW4NewStringType@2@H@Z 000000018002669d f node:node.exe + 0001:000256a9 __imp_load_?SlowGetInternalField@Object@v8@@AEAA?AV?$Local@VValue@v8@@@2@H@Z 00000001800266a9 f node:node.exe + 0001:000256b5 __imp_load_?SetInternalField@Object@v8@@QEAAXHV?$Local@VValue@v8@@@2@@Z 00000001800266b5 f node:node.exe + 0001:000256c1 __imp_load_?Set@Object@v8@@QEAA?AV?$Maybe@_N@2@V?$Local@VContext@v8@@@2@V?$Local@VValue@v8@@@2@1@Z 00000001800266c1 f node:node.exe + 0001:000256cd __imp_load_?SetInternalFieldCount@ObjectTemplate@v8@@QEAAXH@Z 00000001800266cd f node:node.exe + 0001:000256d9 __imp_load_?NewInstance@ObjectTemplate@v8@@QEAA?AV?$MaybeLocal@VObject@v8@@@2@V?$Local@VContext@v8@@@2@@Z 00000001800266d9 f node:node.exe + 0001:000256e5 __imp_load_?New@ObjectTemplate@v8@@SA?AV?$Local@VObjectTemplate@v8@@@2@PEAVIsolate@2@V?$Local@VFunctionTemplate@v8@@@2@@Z 00000001800266e5 f node:node.exe + 0001:000256f1 __imp_load_node_module_register 00000001800266f1 f node:node.exe + 0001:000256fd __imp_load_?HasInstance@Buffer@node@@YA_NV?$Local@VObject@v8@@@v8@@@Z 00000001800266fd f node:node.exe + 0001:00025709 __imp_load_?New@Buffer@node@@YA?AV?$MaybeLocal@VObject@v8@@@v8@@PEAVIsolate@4@PEAD_K@Z 0000000180026709 f node:node.exe + 0001:00025715 __imp_load_?Data@Buffer@node@@YAPEADV?$Local@VObject@v8@@@v8@@@Z 0000000180026715 f node:node.exe + 0001:00025721 __imp_load_?Length@Buffer@node@@YA_KV?$Local@VObject@v8@@@v8@@@Z 0000000180026721 f node:node.exe + 0001:00025730 ??0bad_alloc@std@@QEAA@AEBV01@@Z 0000000180026730 f i libcpmt:xthrow.obj + 0001:0002576c ??0bad_alloc@std@@QEAA@XZ 000000018002676c f i libcpmt:xthrow.obj + 0001:0002578c ??0exception@std@@QEAA@AEBV01@@Z 000000018002678c f i libcpmt:xthrow.obj + 0001:000257c0 ??0length_error@std@@QEAA@AEBV01@@Z 00000001800267c0 f i libcpmt:xthrow.obj + 0001:000257fc ??0length_error@std@@QEAA@PEBD@Z 00000001800267fc f i libcpmt:xthrow.obj + 0001:00025844 ??0logic_error@std@@QEAA@AEBV01@@Z 0000000180026844 f i libcpmt:xthrow.obj + 0001:00025880 ??0out_of_range@std@@QEAA@AEBV01@@Z 0000000180026880 f i libcpmt:xthrow.obj + 0001:000258bc ??0out_of_range@std@@QEAA@PEBD@Z 00000001800268bc f i libcpmt:xthrow.obj + 0001:00025904 ??1bad_alloc@std@@UEAA@XZ 0000000180026904 f i libcpmt:xthrow.obj + 0001:00025904 ??1bad_array_new_length@std@@UEAA@XZ 0000000180026904 f i LIBCMT:throw_bad_alloc.obj + 0001:00025904 ??1out_of_range@std@@UEAA@XZ 0000000180026904 f i libcpmt:xthrow.obj + 0001:00025904 ??1bad_exception@std@@UEAA@XZ 0000000180026904 f i libvcruntime:frame.obj + 0001:00025904 ??1length_error@std@@UEAA@XZ 0000000180026904 f i libcpmt:xthrow.obj + 0001:00025918 ??_Gbad_alloc@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Ebad_exception@std@@UEAAPEAXI@Z 0000000180026918 f i libvcruntime:frame.obj + 0001:00025918 ??_Gbad_array_new_length@std@@UEAAPEAXI@Z 0000000180026918 f i LIBCMT:throw_bad_alloc.obj + 0001:00025918 ??_Gout_of_range@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Eout_of_range@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Ebad_array_new_length@std@@UEAAPEAXI@Z 0000000180026918 f i LIBCMT:throw_bad_alloc.obj + 0001:00025918 ??_Gexception@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Elength_error@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Gbad_exception@std@@UEAAPEAXI@Z 0000000180026918 f i libvcruntime:frame.obj + 0001:00025918 ??_Elogic_error@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Eexception@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Glength_error@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Ebad_alloc@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:00025918 ??_Glogic_error@std@@UEAAPEAXI@Z 0000000180026918 f i libcpmt:xthrow.obj + 0001:0002595c ?_Xlength_error@std@@YAXPEBD@Z 000000018002695c f libcpmt:xthrow.obj + 0001:00025980 ?_Xout_of_range@std@@YAXPEBD@Z 0000000180026980 f libcpmt:xthrow.obj + 0001:000259a4 ?what@exception@std@@UEBAPEBDXZ 00000001800269a4 f i libcpmt:xthrow.obj + 0001:000259b8 __std_reverse_trivially_swappable_8 00000001800269b8 f libcpmt:vector_algorithms.obj + 0001:00025a90 __security_check_cookie 0000000180026a90 f LIBCMT:amdsecgs.obj + 0001:00025ab4 ??2@YAPEAX_K@Z 0000000180026ab4 f LIBCMT:new_scalar.obj + 0001:00025af0 ??_V@YAXPEAX@Z 0000000180026af0 f LIBCMT:delete_array.obj + 0001:00025af0 ??3@YAXPEAX_K@Z 0000000180026af0 f LIBCMT:delete_scalar_size.obj + 0001:00025af8 ??_U@YAPEAX_K@Z 0000000180026af8 f LIBCMT:new_array.obj + 0001:00025b00 __raise_securityfailure 0000000180026b00 f LIBCMT:gs_report.obj + 0001:00025b34 __report_gsfailure 0000000180026b34 f LIBCMT:gs_report.obj + 0001:00025c08 __report_rangecheckfailure 0000000180026c08 f LIBCMT:gs_report.obj + 0001:00025c1c __report_securityfailure 0000000180026c1c f LIBCMT:gs_report.obj + 0001:00025e94 _Init_thread_footer 0000000180026e94 f LIBCMT:thread_safe_statics.obj + 0001:00025ef4 _Init_thread_header 0000000180026ef4 f LIBCMT:thread_safe_statics.obj + 0001:00025f5c _Init_thread_notify 0000000180026f5c f LIBCMT:thread_safe_statics.obj + 0001:00025fa0 _Init_thread_wait 0000000180026fa0 f LIBCMT:thread_safe_statics.obj + 0001:00026004 ??2@YAPEAX_KAEBUnothrow_t@std@@@Z 0000000180027004 f LIBCMT:new_scalar_nothrow.obj + 0001:00026018 ??3@YAXPEAX@Z 0000000180027018 f LIBCMT:delete_scalar.obj + 0001:00026340 _DllMainCRTStartup 0000000180027340 f LIBCMT:dll_dllmain.obj + 0001:00026380 ??_Etype_info@@UEAAPEAXI@Z 0000000180027380 f i LIBCMT:std_type_info_static.obj + 0001:00026380 ??_Gtype_info@@UEAAPEAXI@Z 0000000180027380 f i LIBCMT:std_type_info_static.obj + 0001:000263ac __isa_available_init 00000001800273ac f LIBCMT:cpu_disp.obj + 0001:00026550 ??0bad_array_new_length@std@@QEAA@AEBV01@@Z 0000000180027550 f i LIBCMT:throw_bad_alloc.obj + 0001:0002658c ??0bad_array_new_length@std@@QEAA@XZ 000000018002758c f i LIBCMT:throw_bad_alloc.obj + 0001:000265ac ?__scrt_throw_std_bad_alloc@@YAXXZ 00000001800275ac f LIBCMT:throw_bad_alloc.obj + 0001:000265cc ?__scrt_throw_std_bad_array_new_length@@YAXXZ 00000001800275cc f LIBCMT:throw_bad_alloc.obj + 0001:000265ec __scrt_acquire_startup_lock 00000001800275ec f LIBCMT:utility.obj + 0001:00026628 __scrt_dllmain_after_initialize_c 0000000180027628 f LIBCMT:utility.obj + 0001:0002665c __scrt_dllmain_before_initialize_c 000000018002765c f LIBCMT:utility.obj + 0001:00026674 __scrt_dllmain_crt_thread_attach 0000000180027674 f LIBCMT:utility.obj + 0001:0002669c __scrt_dllmain_crt_thread_detach 000000018002769c f LIBCMT:utility.obj + 0001:000266b4 __scrt_dllmain_exception_filter 00000001800276b4 f LIBCMT:utility.obj + 0001:00026714 __scrt_dllmain_uninitialize_c 0000000180027714 f LIBCMT:utility.obj + 0001:00026744 __scrt_dllmain_uninitialize_critical 0000000180027744 f LIBCMT:utility.obj + 0001:00026758 __scrt_initialize_crt 0000000180027758 f LIBCMT:utility.obj + 0001:000267a4 __scrt_initialize_onexit_tables 00000001800277a4 f LIBCMT:utility.obj + 0001:00026830 __scrt_is_nonwritable_in_current_image 0000000180027830 f LIBCMT:utility.obj + 0001:000268c8 __scrt_release_startup_lock 00000001800278c8 f LIBCMT:utility.obj + 0001:000268ec __scrt_uninitialize_crt 00000001800278ec f LIBCMT:utility.obj + 0001:00026918 _onexit 0000000180027918 f LIBCMT:utility.obj + 0001:00026954 atexit 0000000180027954 f LIBCMT:utility.obj + 0001:0002696c __crt_debugger_hook 000000018002796c f LIBCMT:utility_desktop.obj + 0001:00026974 __scrt_fastfail 0000000180027974 f LIBCMT:utility_desktop.obj + 0001:00026ac0 __security_init_cookie 0000000180027ac0 f LIBCMT:gs_support.obj + 0001:00026b6c DllMain 0000000180027b6c f LIBCMT:dll_dllmain_stub.obj + 0001:00026b6c _get_startup_argv_mode 0000000180027b6c f LIBCMT:argv_mode.obj + 0001:00026b74 ?__scrt_initialize_type_info@@YAXXZ 0000000180027b74 f LIBCMT:tncleanup.obj + 0001:00026b84 ?__scrt_uninitialize_type_info@@YAXXZ 0000000180027b84 f LIBCMT:tncleanup.obj + 0001:00026b90 __local_stdio_scanf_options 0000000180027b90 f i LIBCMT:default_local_stdio_options.obj + 0001:00026b98 __scrt_initialize_default_local_stdio_options 0000000180027b98 f LIBCMT:default_local_stdio_options.obj + 0001:00026bb4 __scrt_get_dyn_tls_init_callback 0000000180027bb4 f LIBCMT:dyn_tls_init.obj + 0001:00026bbc _RTC_Initialize 0000000180027bbc f LIBCMT:initsect.obj + 0001:00026bf8 _RTC_Terminate 0000000180027bf8 f LIBCMT:initsect.obj + 0001:00026c34 __scrt_is_ucrt_dll_in_use 0000000180027c34 f LIBCMT:ucrt_detection.obj + 0001:00026c40 _get_purecall_handler 0000000180027c40 f libvcruntime:purevirt.obj + 0001:00026c48 _purecall 0000000180027c48 f libvcruntime:purevirt.obj + 0001:00026c64 __std_exception_copy 0000000180027c64 f libvcruntime:std_exception.obj + 0001:00026cf4 __std_exception_destroy 0000000180027cf4 f libvcruntime:std_exception.obj + 0001:00026d1c _CxxThrowException 0000000180027d1c f libvcruntime:throw.obj + 0001:00026dbc ??$_CallSETranslator@V__FrameHandler4@@@@YAHPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@K1H@Z 0000000180027dbc f i libvcruntime:risctrnsctrl.obj + 0001:00026e10 ?DecompFuncInfo@FH4@@YA_JPEAEAEAUFuncInfo4@1@_KH_N@Z 0000000180027e10 f i libvcruntime:risctrnsctrl.obj + 0001:00026f34 ?ExecutionInCatch@__FrameHandler4@@SA_NPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@@Z 0000000180027f34 f libvcruntime:risctrnsctrl.obj + 0001:00026f3c ?FrameUnwindToEmptyState@__FrameHandler4@@SAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@@Z 0000000180027f3c f libvcruntime:risctrnsctrl.obj + 0001:00026f70 ?GetEstablisherFrame@__FrameHandler4@@SAPEA_KPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@0@Z 0000000180027f70 f libvcruntime:risctrnsctrl.obj + 0001:00026f94 ?GetRangeOfTrysToCheck@__FrameHandler4@@SA?AU?$pair@Viterator@TryBlockMap4@FH4@@V123@@std@@AEAVTryBlockMap4@FH4@@HPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@5@H@Z 0000000180027f94 f libvcruntime:risctrnsctrl.obj + 0001:000270fc ?UnwindNestedFrames@__FrameHandler4@@SAXPEA_KPEAUEHExceptionRecord@@PEAU_CONTEXT@@0PEAXPEAUFuncInfo4@FH4@@HHPEAUHandlerType4@5@PEAU_xDISPATCHER_CONTEXT@@E@Z 00000001800280fc f libvcruntime:risctrnsctrl.obj + 0001:0002721c ?setBuffer@TryBlockMap4@FH4@@QEAAXViterator@12@@Z 000000018002821c f i libvcruntime:risctrnsctrl.obj + 0001:000273dc _CreateFrameInfo 00000001800283dc f libvcruntime:risctrnsctrl.obj + 0001:00027418 _FindAndUnlinkFrame 0000000180028418 f libvcruntime:risctrnsctrl.obj + 0001:0002746c _GetImageBase 000000018002846c f libvcruntime:risctrnsctrl.obj + 0001:00027480 _GetThrowImageBase 0000000180028480 f libvcruntime:risctrnsctrl.obj + 0001:00027494 _SetImageBase 0000000180028494 f libvcruntime:risctrnsctrl.obj + 0001:000274ac _SetThrowImageBase 00000001800284ac f libvcruntime:risctrnsctrl.obj + 0001:000274c4 __CxxFrameHandler4 00000001800284c4 f libvcruntime:risctrnsctrl.obj + 0001:00027584 __C_specific_handler 0000000180028584 f libvcruntime:riscchandler.obj + 0001:00027790 __vcrt_initialize 0000000180028790 f libvcruntime:initialization.obj + 0001:000277b8 __vcrt_thread_attach 00000001800287b8 f libvcruntime:initialization.obj + 0001:000277cc __vcrt_thread_detach 00000001800287cc f libvcruntime:initialization.obj + 0001:000277e0 __vcrt_uninitialize 00000001800287e0 f libvcruntime:initialization.obj + 0001:000277fc __vcrt_uninitialize_critical 00000001800287fc f libvcruntime:initialization.obj + 0001:0002780c __DestructExceptionObject 000000018002880c f libvcruntime:ehhelpers.obj + 0001:0002787c ?_CallMemberFunction0@@YAXQEAX0@Z 000000018002887c f i libvcruntime:ehhelpers.obj + 0001:00027880 _IsExceptionObjectToBeDestroyed 0000000180028880 f libvcruntime:ehhelpers.obj + 0001:000278b0 __AdjustPointer 00000001800288b0 f libvcruntime:ehhelpers.obj + 0001:000278d4 __FrameUnwindFilter 00000001800288d4 f libvcruntime:ehhelpers.obj + 0001:00027950 memset_repmovs 0000000180028950 f libvcruntime:memset.obj + 0001:00027970 memset 0000000180028970 f libvcruntime:memset.obj + 0001:00027b00 __std_type_info_compare 0000000180028b00 f libvcruntime:std_type_info.obj + 0001:00027b28 __std_type_info_destroy_list 0000000180028b28 f libvcruntime:std_type_info.obj + 0001:00027b54 __vcrt_freefls 0000000180028b54 f libvcruntime:per_thread_data.obj + 0001:00027b74 __vcrt_freeptd 0000000180028b74 f libvcruntime:per_thread_data.obj + 0001:00027bc4 __vcrt_getptd 0000000180028bc4 f libvcruntime:per_thread_data.obj + 0001:00027be0 __vcrt_getptd_noexit 0000000180028be0 f libvcruntime:per_thread_data.obj + 0001:00027ca0 __vcrt_initialize_ptd 0000000180028ca0 f libvcruntime:per_thread_data.obj + 0001:00027ce8 __vcrt_uninitialize_ptd 0000000180028ce8 f libvcruntime:per_thread_data.obj + 0001:00027d0c ?StateFromControlPc@__FrameHandler4@@SAHPEAUFuncInfo4@FH4@@PEAU_xDISPATCHER_CONTEXT@@@Z 0000000180028d0c f libvcruntime:ehstate.obj + 0001:00027d14 ?StateFromIp@__FrameHandler4@@SAHPEAUFuncInfo4@FH4@@PEAU_xDISPATCHER_CONTEXT@@_K@Z 0000000180028d14 f libvcruntime:ehstate.obj + 0001:00028998 ??$TypeMatchHelper@V__FrameHandler3@@@@YAHPEBU_s_HandlerType@@PEBU_s_CatchableType@@PEBU_s_ThrowInfo@@@Z 0000000180029998 f i libvcruntime:frame.obj + 0001:00028ad8 ??$TypeMatchHelper@V__FrameHandler4@@@@YAHPEAUHandlerType4@FH4@@PEBU_s_CatchableType@@PEBU_s_ThrowInfo@@@Z 0000000180029ad8 f i libvcruntime:frame.obj + 0001:00028c1c ??$__InternalCxxFrameHandler@V__FrameHandler4@@@@YA?AW4_EXCEPTION_DISPOSITION@@PEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@H1E@Z 0000000180029c1c f i libvcruntime:frame.obj + 0001:00028eb0 ??0HandlerMap4@FH4@@QEAA@PEBUTryBlockMapEntry4@1@_KH@Z 0000000180029eb0 f i libvcruntime:frame.obj + 0001:00028f2c ??0TryBlockMap4@FH4@@QEAA@PEBUFuncInfo4@1@_K@Z 0000000180029f2c f i libvcruntime:frame.obj + 0001:00029004 ??0bad_exception@std@@QEAA@AEBV01@@Z 000000018002a004 f i libvcruntime:frame.obj + 0001:00029040 ??0bad_exception@std@@QEAA@XZ 000000018002a040 f i libvcruntime:frame.obj + 0001:00029060 ?CxxCallCatchBlock@__FrameHandler4@@SAPEAXPEAU_EXCEPTION_RECORD@@@Z 000000018002a060 f libvcruntime:frame.obj + 0001:000292b0 ?DecompHandler@HandlerMap4@FH4@@AEAAXXZ 000000018002a2b0 f i libvcruntime:frame.obj + 0001:000294f0 ?FrameUnwindToState@__FrameHandler4@@SAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@H@Z 000000018002a4f0 f libvcruntime:frame.obj + 0001:00029950 ?ReadEntry@UWMap4@FH4@@AEAAXPEAPEAE@Z 000000018002a950 f i libvcruntime:frame.obj + 0001:000299f0 ?_CallMemberFunction1@@YAXQEAX00@Z 000000018002a9f0 f i libvcruntime:frame.obj + 0001:000299fc ?_CallMemberFunction2@@YAXQEAX00H@Z 000000018002a9fc f i libvcruntime:frame.obj + 0001:00029a0c ?getStartStop@UWMap4@FH4@@QEAAXHHAEAViterator@12@0@Z 000000018002aa0c f i libvcruntime:frame.obj + 0001:00029adc ?getStateFromIterators@UWMap4@FH4@@SAHAEBViterator@12@H0H0@Z 000000018002aadc f i libvcruntime:frame.obj + 0001:00029bc0 _NLG_Notify 000000018002abc0 f libvcruntime:notify.obj + 0001:00029be0 __NLG_Dispatch2 000000018002abe0 f libvcruntime:notify.obj + 0001:00029bf0 __NLG_Return2 000000018002abf0 f libvcruntime:notify.obj + 0001:00029bf4 __except_validate_context_record 000000018002abf4 f libvcruntime:jbcxrval.obj + 0001:00029c2c __vcrt_initialize_locks 000000018002ac2c f libvcruntime:locks.obj + 0001:00029c60 __vcrt_uninitialize_locks 000000018002ac60 f libvcruntime:locks.obj + 0001:00029de4 __vcrt_FlsAlloc 000000018002ade4 f libvcruntime:winapi_downlevel.obj + 0001:00029e2c __vcrt_FlsFree 000000018002ae2c f libvcruntime:winapi_downlevel.obj + 0001:00029e74 __vcrt_FlsGetValue 000000018002ae74 f libvcruntime:winapi_downlevel.obj + 0001:00029ebc __vcrt_FlsSetValue 000000018002aebc f libvcruntime:winapi_downlevel.obj + 0001:00029f10 __vcrt_InitializeCriticalSectionEx 000000018002af10 f libvcruntime:winapi_downlevel.obj + 0001:00029f90 _CallSettingFrame 000000018002af90 f libvcruntime:handlers.obj + 0001:00029fe0 _CallSettingFrame_LookupContinuationIndex 000000018002afe0 f libvcruntime:handlers.obj + 0001:0002a010 _CallSettingFrame_NotifyContinuationAddr 000000018002b010 f libvcruntime:handlers.obj + 0001:0002a040 _CallSettingFrameEncoded 000000018002b040 f libvcruntime:handlers.obj + 0001:0002a0a0 memcpy_repmovs 000000018002b0a0 f libvcruntime:memcpy.obj + 0001:0002a0c0 memcpy 000000018002b0c0 f libvcruntime:memcpy.obj + 0001:0002a0c0 memmove 000000018002b0c0 f libvcruntime:memcpy.obj + 0001:0002a498 calloc 000000018002b498 f libucrt:calloc.obj + 0001:0002a4a0 realloc 000000018002b4a0 f libucrt:realloc.obj + 0001:0002abc0 ??$ftprintf@PEAU_iobuf@@PEB_WAEBQEB_WAEBQEB_WAEBI@?$__crt_char_traits@_W@@SAH$$QEAPEAU_iobuf@@$$QEAPEB_WAEBQEB_W2AEBI@Z 000000018002bbc0 f i libucrt:assert.obj + 0001:0002abe8 _wassert 000000018002bbe8 f libucrt:assert.obj + 0001:0002ac5c fwprintf 000000018002bc5c f i libucrt:assert.obj + 0001:0002aca0 swprintf 000000018002bca0 f i libucrt:assert.obj + 0001:0002acf4 __acrt_call_reportfault 000000018002bcf4 f libucrt:invalid_parameter.obj + 0001:0002ae50 __acrt_initialize_invalid_parameter_handler 000000018002be50 f libucrt:invalid_parameter.obj + 0001:0002ae58 _invalid_parameter 000000018002be58 f libucrt:invalid_parameter.obj + 0001:0002af08 _invalid_parameter_noinfo 000000018002bf08 f libucrt:invalid_parameter.obj + 0001:0002af28 _invalid_parameter_noinfo_noreturn 000000018002bf28 f libucrt:invalid_parameter.obj + 0001:0002af58 _invoke_watson 000000018002bf58 f libucrt:invalid_parameter.obj + 0001:0002afa0 __acrt_initialize_stdio 000000018002bfa0 f libucrt:_file.obj + 0001:0002b0c0 __acrt_iob_func 000000018002c0c0 f libucrt:_file.obj + 0001:0002b0d4 __acrt_uninitialize_stdio 000000018002c0d4 f libucrt:_file.obj + 0001:0002b130 _lock_file 000000018002c130 f libucrt:_file.obj + 0001:0002b13c _unlock_file 000000018002c13c f libucrt:_file.obj + 0001:0002b39c ??$ensure_buffer_is_big_enough@D@formatting_buffer@__crt_stdio_output@@QEAA_N_K@Z 000000018002c39c f i libucrt:output.obj + 0001:0002b444 ??$ensure_buffer_is_big_enough@_W@formatting_buffer@__crt_stdio_output@@QEAA_N_K@Z 000000018002c444 f i libucrt:output.obj + 0001:0002b4f0 ??$is_wide_character_specifier@_W@__crt_stdio_output@@YA_N_K_WW4length_modifier@0@@Z 000000018002c4f0 f i libucrt:output.obj + 0001:0002b530 ??$type_case_integer_parse_into_buffer@I@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 000000018002c530 f i libucrt:output.obj + 0001:0002b5b8 ??$type_case_integer_parse_into_buffer@I@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 000000018002c5b8 f i libucrt:output.obj + 0001:0002b5b8 ??$type_case_integer_parse_into_buffer@I@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 000000018002c5b8 f i libucrt:output.obj + 0001:0002b65c ??$type_case_integer_parse_into_buffer@_K@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 000000018002c65c f i libucrt:output.obj + 0001:0002b6ec ??$type_case_integer_parse_into_buffer@_K@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 000000018002c6ec f i libucrt:output.obj + 0001:0002b6ec ??$type_case_integer_parse_into_buffer@_K@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 000000018002c6ec f i libucrt:output.obj + 0001:0002b790 ??$write_multiple_characters@V?$stream_output_adapter@D@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$stream_output_adapter@D@0@DHQEAH@Z 000000018002c790 f i libucrt:output.obj + 0001:0002b81c ??$write_multiple_characters@V?$stream_output_adapter@_W@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$stream_output_adapter@_W@0@DHQEAH@Z 000000018002c81c f i libucrt:output.obj + 0001:0002b8b0 ??$write_multiple_characters@V?$string_output_adapter@_W@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$string_output_adapter@_W@0@DHQEAH@Z 000000018002c8b0 f i libucrt:output.obj + 0001:0002b92c ??0_LocaleUpdate@@QEAA@QEAU__crt_locale_pointers@@@Z 000000018002c92c f i libucrt:output.obj + 0001:0002bc2c ?crop_zeroes@__crt_stdio_output@@YAXPEADQEAU__crt_locale_pointers@@@Z 000000018002cc2c f i libucrt:output.obj + 0001:0002bc98 ?parse_int_from_format_string@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 000000018002cc98 f i libucrt:output.obj + 0001:0002bd3c ?parse_int_from_format_string@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 000000018002cd3c f i libucrt:output.obj + 0001:0002bd3c ?parse_int_from_format_string@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 000000018002cd3c f i libucrt:output.obj + 0001:0002bde0 ?process@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 000000018002cde0 f i libucrt:output.obj + 0001:0002bff8 ?process@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 000000018002cff8 f i libucrt:output.obj + 0001:0002c264 ?process@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 000000018002d264 f i libucrt:output.obj + 0001:0002c4e0 ?state_case_normal@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002d4e0 f i libucrt:output.obj + 0001:0002c550 ?state_case_normal_tchar@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 000000018002d550 f i libucrt:output.obj + 0001:0002c5f4 ?state_case_size@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002d5f4 f i libucrt:output.obj + 0001:0002c768 ?state_case_size@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002d768 f i libucrt:output.obj + 0001:0002c900 ?state_case_size@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002d900 f i libucrt:output.obj + 0001:0002ca98 ?state_case_type@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002da98 f i libucrt:output.obj + 0001:0002cd1c ?state_case_type@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002dd1c f i libucrt:output.obj + 0001:0002cffc ?state_case_type@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002dffc f i libucrt:output.obj + 0001:0002d2c8 ?type_case_Z@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002e2c8 f i libucrt:output.obj + 0001:0002d33c ?type_case_Z@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002e33c f i libucrt:output.obj + 0001:0002d33c ?type_case_Z@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002e33c f i libucrt:output.obj + 0001:0002d3b8 ?type_case_a@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002e3b8 f i libucrt:output.obj + 0001:0002d5d0 ?type_case_a@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002e5d0 f i libucrt:output.obj + 0001:0002d5d0 ?type_case_a@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002e5d0 f i libucrt:output.obj + 0001:0002d80c ?type_case_c_tchar@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 000000018002e80c f i libucrt:output.obj + 0001:0002d8c8 ?type_case_c_tchar@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_N_W@Z 000000018002e8c8 f i libucrt:output.obj + 0001:0002d8c8 ?type_case_c_tchar@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_N_W@Z 000000018002e8c8 f i libucrt:output.obj + 0001:0002d970 ?type_case_integer@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 000000018002e970 f i libucrt:output.obj + 0001:0002db38 ?type_case_integer@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 000000018002eb38 f i libucrt:output.obj + 0001:0002db38 ?type_case_integer@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 000000018002eb38 f i libucrt:output.obj + 0001:0002dd04 ?type_case_n@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002ed04 f i libucrt:output.obj + 0001:0002dd04 ?type_case_n@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002ed04 f i libucrt:output.obj + 0001:0002dd04 ?type_case_n@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002ed04 f i libucrt:output.obj + 0001:0002dde0 ?type_case_s@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002ede0 f i libucrt:output.obj + 0001:0002de78 ?type_case_s@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002ee78 f i libucrt:output.obj + 0001:0002de78 ?type_case_s@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018002ee78 f i libucrt:output.obj + 0001:0002df40 ?validate_stream_is_ansi_if_required@?$__acrt_stdio_char_traits@D@@SA_NQEAU_iobuf@@@Z 000000018002ef40 f i libucrt:output.obj + 0001:0002dfdc ?write_stored_string_tchar@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 000000018002efdc f i libucrt:output.obj + 0001:0002e100 ?write_stored_string_tchar@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_N_W@Z 000000018002f100 f i libucrt:output.obj + 0001:0002e208 ?write_stored_string_tchar@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_N_W@Z 000000018002f208 f i libucrt:output.obj + 0001:0002e2f4 ?write_string@?$string_output_adapter@_W@__crt_stdio_output@@QEBAXQEB_WHQEAHAEAV__crt_deferred_errno_cache@@@Z 000000018002f2f4 f i libucrt:output.obj + 0001:0002e39c ?write_string_impl@?$output_adapter_common@DV?$stream_output_adapter@D@__crt_stdio_output@@@__crt_stdio_output@@IEBAXQEBDHQEAHAEAV__crt_deferred_errno_cache@@@Z 000000018002f39c f i libucrt:output.obj + 0001:0002e494 ?write_string_impl@?$output_adapter_common@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@__crt_stdio_output@@IEBAXQEB_WHQEAHAEAV__crt_deferred_errno_cache@@@Z 000000018002f494 f i libucrt:output.obj + 0001:0002e598 __stdio_common_vfprintf 000000018002f598 f libucrt:output.obj + 0001:0002e624 __stdio_common_vfwprintf 000000018002f624 f libucrt:output.obj + 0001:0002e6b0 __stdio_common_vswprintf 000000018002f6b0 f libucrt:output.obj + 0001:0002e6b8 log2 000000018002f6b8 f libucrt:log2.obj + 0001:0002e9e0 free 000000018002f9e0 f libucrt:free.obj + 0001:0002e9f4 malloc 000000018002f9f4 f libucrt:malloc.obj + 0001:0002e9fc __ascii_stricmp 000000018002f9fc f libucrt:stricmp.obj + 0001:0002ea38 _stricmp 000000018002fa38 f libucrt:stricmp.obj + 0001:0002ea80 _stricmp_l 000000018002fa80 f libucrt:stricmp.obj + 0001:0002eb08 __acrt_initialize_new_handler 000000018002fb08 f libucrt:new_handler.obj + 0001:0002eb10 _callnewh 000000018002fb10 f libucrt:new_handler.obj + 0001:0002eb40 _query_new_handler 000000018002fb40 f libucrt:new_handler.obj + 0001:0002eb74 _initterm 000000018002fb74 f libucrt:initterm.obj + 0001:0002ebd8 _initterm_e 000000018002fbd8 f libucrt:initterm.obj + 0001:0002ec18 _seh_filter_dll 000000018002fc18 f libucrt:exception_filter.obj + 0001:0002ec2c _seh_filter_exe 000000018002fc2c f libucrt:exception_filter.obj + 0001:0002f01c __acrt_initialize_thread_local_exit_callback 000000018003001c f libucrt:exit.obj + 0001:0002f024 _cexit 0000000180030024 f libucrt:exit.obj + 0001:0002f034 _exit 0000000180030034 f libucrt:exit.obj + 0001:0002f040 _is_c_termination_complete 0000000180030040 f libucrt:exit.obj + 0001:0002f20c __acrt_allocate_buffer_for_argv 000000018003020c f libucrt:argv_parsing.obj + 0001:0002f26c _configure_narrow_argv 000000018003026c f libucrt:argv_parsing.obj + 0001:0002f5e4 __dcrt_uninitialize_environments_nolock 00000001800305e4 f libucrt:environment_initialization.obj + 0001:0002f61c _initialize_narrow_environment 000000018003061c f libucrt:environment_initialization.obj + 0001:0002f964 _crt_atexit 0000000180030964 f libucrt:onexit.obj + 0001:0002f974 _execute_onexit_table 0000000180030974 f libucrt:onexit.obj + 0001:0002f9b0 _initialize_onexit_table 00000001800309b0 f libucrt:onexit.obj + 0001:0002f9d8 _register_onexit_function 00000001800309d8 f libucrt:onexit.obj + 0001:0002fa58 __acrt_uninitialize_command_line 0000000180030a58 f libucrt:argv_data.obj + 0001:0002fb50 __acrt_initialize 0000000180030b50 f libucrt:initialization.obj + 0001:0002fb64 __acrt_thread_attach 0000000180030b64 f libucrt:initialization.obj + 0001:0002fb78 __acrt_thread_detach 0000000180030b78 f libucrt:initialization.obj + 0001:0002fb88 __acrt_uninitialize 0000000180030b88 f libucrt:initialization.obj + 0001:0002fbc0 __acrt_uninitialize_critical 0000000180030bc0 f libucrt:initialization.obj + 0001:0002fbd0 terminate 0000000180030bd0 f libucrt:terminate.obj + 0001:0002fbf0 abort 0000000180030bf0 f libucrt:abort.obj + 0001:0002fc48 strcpy_s 0000000180030c48 f libucrt:strcpy_s.obj + 0001:0002fca8 ??$parse_integer@KV?$c_string_character_source@D@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@D@0@H_N@Z 0000000180030ca8 f i libucrt:atox.obj + 0001:0002ffb0 ??$parse_integer@KV?$c_string_character_source@_W@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@_W@0@H_N@Z 0000000180030fb0 f i libucrt:atox.obj + 0001:00030658 _ischartype_l 0000000180031658 f i libucrt:atox.obj + 0001:000306e0 strncmp 00000001800316e0 f libucrt:strncmp.obj + 0001:00030760 wcsncmp 0000000180031760 f libucrt:wcsncmp.obj + 0001:0003078c _calloc_base 000000018003178c f libucrt:calloc_base.obj + 0001:00030804 _realloc_base 0000000180031804 f libucrt:realloc_base.obj + 0001:00030880 _query_app_type 0000000180031880 f libucrt:report_runtime_error.obj + 0001:00030888 __acrt_errno_from_os_error 0000000180031888 f libucrt:errno.obj + 0001:000308d0 __acrt_errno_map_os_error 00000001800318d0 f libucrt:errno.obj + 0001:00030920 __doserrno 0000000180031920 f libucrt:errno.obj + 0001:00030940 _errno 0000000180031940 f libucrt:errno.obj + 0001:00030aa0 _itow_s 0000000180031aa0 f libucrt:xtoa.obj + 0001:00030ac0 _set_error_mode 0000000180031ac0 f libucrt:set_error_mode.obj + 0001:00030b00 wcscat_s 0000000180031b00 f libucrt:wcscat_s.obj + 0001:00030b80 wcscpy_s 0000000180031b80 f libucrt:wcscpy_s.obj + 0001:00030be8 wcsncat_s 0000000180031be8 f libucrt:wcsncat_s.obj + 0001:00030ce8 ??$__acrt_wcs_to_mbs_cp@U__crt_win32_buffer_no_resizing@@@@YAHQEB_WAEAV?$__crt_win32_buffer@DU__crt_win32_buffer_no_resizing@@@@I@Z 0000000180031ce8 f i libucrt:getmodulefilenamea.obj + 0001:00030dfc __acrt_GetModuleFileNameA 0000000180031dfc f libucrt:getmodulefilenamea.obj + 0001:00030f1c __acrt_show_wide_message_box 0000000180031f1c f libucrt:crtmbox.obj + 0001:000311dc __acrt_stdio_flush_nolock 00000001800321dc f libucrt:fflush.obj + 0001:00031258 _fflush_nolock 0000000180032258 f libucrt:fflush.obj + 0001:000312a4 _flushall 00000001800322a4 f libucrt:fflush.obj + 0001:000312ac fflush 00000001800322ac f libucrt:fflush.obj + 0001:00031434 setvbuf 0000000180032434 f libucrt:setvbuf.obj + 0001:00031518 __acrt_get_sigabrt_handler 0000000180032518 f libucrt:signal.obj + 0001:00031548 __acrt_initialize_signal_handlers 0000000180032548 f libucrt:signal.obj + 0001:00031568 raise 0000000180032568 f libucrt:signal.obj + 0001:00031b4c __acrt_freeptd 0000000180032b4c f libucrt:per_thread_data.obj + 0001:00031b90 __acrt_getptd 0000000180032b90 f libucrt:per_thread_data.obj + 0001:00031c64 __acrt_getptd_head 0000000180032c64 f libucrt:per_thread_data.obj + 0001:00031d0c __acrt_getptd_noexit 0000000180032d0c f libucrt:per_thread_data.obj + 0001:00031dd8 __acrt_initialize_ptd 0000000180032dd8 f libucrt:per_thread_data.obj + 0001:00031e14 __acrt_uninitialize_ptd 0000000180032e14 f libucrt:per_thread_data.obj + 0001:00031e38 _free_base 0000000180032e38 f libucrt:free_base.obj + 0001:00032050 __acrt_AppPolicyGetProcessTerminationMethodInternal 0000000180033050 f libucrt:winapi_thunks.obj + 0001:000320a0 __acrt_AppPolicyGetShowDeveloperDiagnosticInternal 00000001800330a0 f libucrt:winapi_thunks.obj + 0001:000320f0 __acrt_AppPolicyGetWindowingModelInternal 00000001800330f0 f libucrt:winapi_thunks.obj + 0001:00032140 __acrt_AreFileApisANSI 0000000180033140 f libucrt:winapi_thunks.obj + 0001:0003217c __acrt_FlsAlloc 000000018003317c f libucrt:winapi_thunks.obj + 0001:000321c4 __acrt_FlsFree 00000001800331c4 f libucrt:winapi_thunks.obj + 0001:0003220c __acrt_FlsGetValue 000000018003320c f libucrt:winapi_thunks.obj + 0001:00032254 __acrt_FlsSetValue 0000000180033254 f libucrt:winapi_thunks.obj + 0001:000322a8 __acrt_InitializeCriticalSectionEx 00000001800332a8 f libucrt:winapi_thunks.obj + 0001:0003230c __acrt_LCMapStringEx 000000018003330c f libucrt:winapi_thunks.obj + 0001:000323e8 __acrt_LocaleNameToLCID 00000001800333e8 f libucrt:winapi_thunks.obj + 0001:00032438 __acrt_MessageBoxW 0000000180033438 f libucrt:winapi_thunks.obj + 0001:000324ac __acrt_can_show_message_box 00000001800334ac f libucrt:winapi_thunks.obj + 0001:0003251c __acrt_get_parent_window 000000018003351c f libucrt:winapi_thunks.obj + 0001:00032594 __acrt_initialize_winapi_thunks 0000000180033594 f libucrt:winapi_thunks.obj + 0001:000325c8 __acrt_is_interactive 00000001800335c8 f libucrt:winapi_thunks.obj + 0001:00032690 __acrt_uninitialize_winapi_thunks 0000000180033690 f libucrt:winapi_thunks.obj + 0001:000326d4 _fcloseall 00000001800336d4 f libucrt:closeall.obj + 0001:00032788 __acrt_stdio_free_buffer_nolock 0000000180033788 f libucrt:_freebuf.obj + 0001:000329c4 __acrt_initialize_lowio 00000001800339c4 f libucrt:ioinit.obj + 0001:00032a00 __acrt_uninitialize_lowio 0000000180033a00 f libucrt:ioinit.obj + 0001:00032a40 _malloc_base 0000000180033a40 f libucrt:malloc_base.obj + 0001:00032aa0 strtol 0000000180033aa0 f libucrt:strtox.obj + 0001:00032acc wcstol 0000000180033acc f libucrt:strtox.obj + 0001:00032af8 _mbtowc_l 0000000180033af8 f libucrt:mbtowc.obj + 0001:00032c78 mbtowc 0000000180033c78 f libucrt:mbtowc.obj + 0001:00032c80 _wctomb_s_l 0000000180033c80 f libucrt:wctomb.obj + 0001:00032e1c wctomb_s 0000000180033e1c f libucrt:wctomb.obj + 0001:00032e30 strnlen 0000000180033e30 f libucrt:strnlen.obj + 0001:00032f80 wcsnlen 0000000180033f80 f libucrt:strnlen.obj + 0001:00033158 __acrt_update_locale_info 0000000180034158 f libucrt:locale_update.obj + 0001:0003318c __acrt_update_multibyte_info 000000018003418c f libucrt:locale_update.obj + 0001:00033a58 __acrt_fp_format 0000000180034a58 f libucrt:cvt.obj + 0001:00033d5c _fputwc_nolock 0000000180034d5c f libucrt:fputwc.obj + 0001:00033ed8 _fileno 0000000180034ed8 f libucrt:fileno.obj + 0001:00033f00 _fputc_nolock 0000000180034f00 f libucrt:fputc.obj + 0001:00033f18 _get_printf_count_output 0000000180034f18 f libucrt:printf_count_output.obj + 0001:00033f30 __acrt_stdio_begin_temporary_buffering_nolock 0000000180034f30 f libucrt:_sftbuf.obj + 0001:00034000 __acrt_stdio_end_temporary_buffering_nolock 0000000180035000 f libucrt:_sftbuf.obj + 0001:000340ac __acrt_set_locale_changed 00000001800350ac f libucrt:wsetlocale.obj + 0001:000340b8 __acrt_uninitialize_locale 00000001800350b8 f libucrt:wsetlocale.obj + 0001:0003420c _handle_error 000000018003520c f libucrt:libm_error.obj + 0001:00034334 _handle_nan 0000000180035334 f libucrt:libm_error.obj + 0001:00034350 _handle_nanf 0000000180035350 f libucrt:libm_error.obj + 0001:00034bc0 _write 0000000180035bc0 f libucrt:write.obj + 0001:00034cac _write_nolock 0000000180035cac f libucrt:write.obj + 0001:000351d0 __acrt_stdio_flush_and_write_narrow_nolock 00000001800361d0 f libucrt:_flsbuf.obj + 0001:000352bc __acrt_stdio_flush_and_write_wide_nolock 00000001800362bc f libucrt:_flsbuf.obj + 0001:000353a8 __acrt_initialize_locks 00000001800363a8 f libucrt:locks.obj + 0001:000353f0 __acrt_lock 00000001800363f0 f libucrt:locks.obj + 0001:0003540c __acrt_uninitialize_locks 000000018003640c f libucrt:locks.obj + 0001:00035444 __acrt_unlock 0000000180036444 f libucrt:locks.obj + 0001:00035460 __acrt_get_developer_information_policy 0000000180036460 f libucrt:win_policies.obj + 0001:000354b4 __acrt_get_process_end_policy 00000001800364b4 f libucrt:win_policies.obj + 0001:000354f0 __acrt_get_windowing_model_policy 00000001800364f0 f libucrt:win_policies.obj + 0001:00035570 ??$__acrt_mbs_to_wcs_cp@U__crt_win32_buffer_internal_dynamic_resizing@@@@YAHQEBDAEAV?$__crt_win32_buffer@_WU__crt_win32_buffer_internal_dynamic_resizing@@@@I@Z 0000000180036570 f i libucrt:argv_wildcards.obj + 0001:000356e8 ??$__acrt_wcs_to_mbs_cp@U__crt_win32_buffer_internal_dynamic_resizing@@@@YAHQEB_WAEAV?$__crt_win32_buffer@DU__crt_win32_buffer_internal_dynamic_resizing@@@@I@Z 00000001800366e8 f i libucrt:argv_wildcards.obj + 0001:00035f18 __acrt_expand_narrow_argv_wildcards 0000000180036f18 f libucrt:argv_wildcards.obj + 0001:0003664c __acrt_initialize_multibyte 000000018003764c f libucrt:mbctype.obj + 0001:000366ac __acrt_update_thread_multibyte_data 00000001800376ac f libucrt:mbctype.obj + 0001:000366c8 _setmbcp_nolock 00000001800376c8 f libucrt:mbctype.obj + 0001:000369fc _ismbblead 00000001800379fc f libucrt:ismbbyte.obj + 0001:00036a10 __acrt_initialize_command_line 0000000180037a10 f libucrt:argv_data.obj + 0001:00036a38 __acrt_MultiByteToWideChar 0000000180037a38 f libucrt:multibytetowidechar.obj + 0001:00036a94 __acrt_WideCharToMultiByte 0000000180037a94 f libucrt:widechartomultibyte.obj + 0001:00036b2c __dcrt_get_narrow_environment_from_os 0000000180037b2c f libucrt:get_environment_from_os.obj + 0001:00036c30 _recalloc_base 0000000180037c30 f libucrt:recalloc.obj + 0001:00036cc8 __acrt_initialize_heap 0000000180037cc8 f libucrt:heap_handle.obj + 0001:00036ce4 __acrt_uninitialize_heap 0000000180037ce4 f libucrt:heap_handle.obj + 0001:00036cf0 __acrt_execute_initializers 0000000180037cf0 f libucrt:shared_initialization.obj + 0001:00036d70 __acrt_execute_uninitializers 0000000180037d70 f libucrt:shared_initialization.obj + 0001:00036dac __acrt_has_user_matherr 0000000180037dac f libucrt:matherr.obj + 0001:00036dcc __acrt_initialize_user_matherr 0000000180037dcc f libucrt:matherr.obj + 0001:00036dd4 __acrt_invoke_user_matherr 0000000180037dd4 f libucrt:matherr.obj + 0001:00036e04 __pctype_func 0000000180037e04 f libucrt:ctype.obj + 0001:00036e34 iswctype 0000000180037e34 f libucrt:iswctype.obj + 0001:00036ea4 _isctype_l 0000000180037ea4 f libucrt:isctype.obj + 0001:00036fac _query_new_mode 0000000180037fac f libucrt:new_mode.obj + 0001:00037040 _commit 0000000180038040 f libucrt:commit.obj + 0001:000370d4 __acrt_add_locale_ref 00000001800380d4 f libucrt:locale_refcounting.obj + 0001:00037160 __acrt_free_locale 0000000180038160 f libucrt:locale_refcounting.obj + 0001:000372d8 __acrt_locale_add_lc_time_reference 00000001800382d8 f libucrt:locale_refcounting.obj + 0001:00037300 __acrt_locale_free_lc_time_if_unreferenced 0000000180038300 f libucrt:locale_refcounting.obj + 0001:00037338 __acrt_locale_release_lc_time_reference 0000000180038338 f libucrt:locale_refcounting.obj + 0001:00037360 __acrt_release_locale_ref 0000000180038360 f libucrt:locale_refcounting.obj + 0001:00037408 __acrt_update_thread_locale_data 0000000180038408 f libucrt:locale_refcounting.obj + 0001:00037474 _updatetlocinfoEx_nolock 0000000180038474 f libucrt:locale_refcounting.obj + 0001:000374dc __acrt_DownlevelLocaleNameToLCID 00000001800384dc f libucrt:lcidtoname_downlevel.obj + 0001:0003758c _fclose_nolock 000000018003858c f libucrt:fclose.obj + 0001:00037610 fclose 0000000180038610 f libucrt:fclose.obj + 0001:00037674 __acrt_lowio_create_handle_array 0000000180038674 f libucrt:osfinfo.obj + 0001:0003771c __acrt_lowio_destroy_handle_array 000000018003871c f libucrt:osfinfo.obj + 0001:0003776c __acrt_lowio_ensure_fh_exists 000000018003876c f libucrt:osfinfo.obj + 0001:00037814 __acrt_lowio_lock_fh 0000000180038814 f libucrt:osfinfo.obj + 0001:0003783c __acrt_lowio_unlock_fh 000000018003883c f libucrt:osfinfo.obj + 0001:00037864 _free_osfhnd 0000000180038864 f libucrt:osfinfo.obj + 0001:00037920 _get_osfhandle 0000000180038920 f libucrt:osfinfo.obj + 0001:00037998 _isleadbyte_l 0000000180038998 f i libucrt:_wctype.obj + 0001:000379e4 ?__mbrtowc_utf8@__crt_mbstring@@YA_KPEA_WPEBD_KPEAU_Mbstatet@@@Z 00000001800389e4 f libucrt:mbrtowc.obj + 0001:00037a20 ?__mbsrtowcs_utf8@__crt_mbstring@@YA_KPEA_WPEAPEBD_KPEAU_Mbstatet@@@Z 0000000180038a20 f libucrt:mbrtowc.obj + 0001:00037b98 ?__c32rtomb_utf8@__crt_mbstring@@YA_KPEAD_UPEAU_Mbstatet@@@Z 0000000180038b98 f libucrt:c32rtomb.obj + 0001:00037c4c __acrt_fp_strflt_to_string 0000000180038c4c f libucrt:_fptostr.obj + 0001:00037d30 ?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 0000000180038d30 f i libucrt:cfout.obj + 0001:0003815c __acrt_fltout 000000018003915c f libucrt:cfout.obj + 0001:00039418 _isatty 000000018003a418 f libucrt:isatty.obj + 0001:00039478 __acrt_locale_free_monetary 000000018003a478 f libucrt:initmon.obj + 0001:00039584 __acrt_locale_free_numeric 000000018003a584 f libucrt:initnum.obj + 0001:00039648 __acrt_locale_free_time 000000018003a648 f libucrt:inittime.obj + 0001:00039750 __acrt_GetStringTypeA 000000018003a750 f libucrt:getstringtypea.obj + 0001:000398e0 _raise_exc 000000018003a8e0 f libucrt:fpexcept.obj + 0001:00039908 _raise_exc_ex 000000018003a908 f libucrt:fpexcept.obj + 0001:00039c18 _set_errno_from_matherr 000000018003ac18 f libucrt:fpexcept.obj + 0001:00039c48 _clrfp 000000018003ac48 f libucrt:fpctrl.obj + 0001:00039c68 _ctrlfp 000000018003ac68 f libucrt:fpctrl.obj + 0001:00039ce4 _set_statfp 000000018003ace4 f libucrt:fpctrl.obj + 0001:00039d04 _statfp 000000018003ad04 f libucrt:fpctrl.obj + 0001:00039ea4 _lseeki64 000000018003aea4 f libucrt:lseek.obj + 0001:00039eac _lseeki64_nolock 000000018003aeac f libucrt:lseek.obj + 0001:00039eb4 _putwch_nolock 000000018003aeb4 f libucrt:putwch.obj + 0001:00039ef0 __acrt_stdio_allocate_buffer_nolock 000000018003aef0 f libucrt:_getbuf.obj + 0001:00039f60 qsort 000000018003af60 f libucrt:qsort.obj + 0001:0003a310 strncpy_s 000000018003b310 f libucrt:strncpy_s.obj + 0001:0003a490 strpbrk 000000018003b490 f libucrt:strpbrk.obj + 0001:0003a870 _mbsdec 000000018003b870 f libucrt:mbsdec.obj + 0001:0003a878 _mbsdec_l 000000018003b878 f libucrt:mbsdec.obj + 0001:0003ac24 __acrt_LCMapStringA 000000018003bc24 f libucrt:lcmapstringa.obj + 0001:0003acd4 _msize_base 000000018003bcd4 f libucrt:msize.obj + 0001:0003ad10 __acrt_GetStringTypeW 000000018003bd10 f libucrt:getstringtypew.obj + 0001:0003ad18 __ascii_wcsnicmp 000000018003bd18 f libucrt:wcsnicmp.obj + 0001:0003add8 _close 000000018003bdd8 f libucrt:close.obj + 0001:0003ae7c _close_nolock 000000018003be7c f libucrt:close.obj + 0001:0003af3c ?__acrt_stdio_free_stream@@YAXV__crt_stdio_stream@@@Z 000000018003bf3c f libucrt:stream.obj + 0001:0003af58 ?__mbrtoc32_utf8@__crt_mbstring@@YA_KPEA_UPEBD_KPEAU_Mbstatet@@@Z 000000018003bf58 f libucrt:mbrtoc32.obj + 0001:0003b134 fegetenv 000000018003c134 f libucrt:fegetenv.obj + 0001:0003b154 fesetenv 000000018003c154 f libucrt:fesetenv.obj + 0001:0003b1a0 feholdexcept 000000018003c1a0 f libucrt:feholdexcept.obj + 0001:0003b1f0 ceil 000000018003c1f0 f libucrt:ceil.obj + 0001:0003b2c0 log10 000000018003c2c0 f libucrt:log10.obj + 0001:0003b880 _get_fpsr 000000018003c880 f libucrt:fpsr.obj + 0001:0003b890 _set_fpsr 000000018003c890 f libucrt:fpsr.obj + 0001:0003b89a _fclrf 000000018003c89a f libucrt:fpsr.obj + 0001:0003b8ae _frnd 000000018003c8ae f libucrt:fpsr.obj + 0001:0003b8d0 __dcrt_lowio_ensure_console_output_initialized 000000018003c8d0 f libucrt:initcon.obj + 0001:0003b924 __dcrt_terminate_console_output 000000018003c924 f libucrt:initcon.obj + 0001:0003b940 __dcrt_write_console 000000018003c940 f libucrt:initcon.obj + 0001:0003ba00 __strncnt 000000018003ca00 f libucrt:strncnt.obj + 0001:0003ba18 __acrt_fenv_get_control 000000018003ca18 f libucrt:_fenvutils.obj + 0001:0003bb0c __acrt_fenv_get_status 000000018003cb0c f libucrt:_fenvutils.obj + 0001:0003bb60 __acrt_fenv_set_control 000000018003cb60 f libucrt:_fenvutils.obj + 0001:0003bca8 __acrt_fenv_set_status 000000018003cca8 f libucrt:_fenvutils.obj + 0001:0003bd2c _clearfp 000000018003cd2c f libucrt:ieee.obj + 0001:0003bda0 __acrt_initialize_fma3 000000018003cda0 f libucrt:fma3_available.obj + 0001:0003be10 _log10_special 000000018003ce10 f libucrt:log_special.obj + 0001:0003bec6 IsProcessorFeaturePresent 000000018003cec6 f kernel32:KERNEL32.dll + 0001:0003becc ?DloadAcquireSectionWriteAccess@@YAXXZ 000000018003cecc f i DelayImp:delayhlp.obj + 0001:0003bf78 ?DloadGetSRWLockFunctionPointers@@YAEXZ 000000018003cf78 f i DelayImp:delayhlp.obj + 0001:0003c014 ?DloadMakePermanentImageCommit@@YAXPEAX_K@Z 000000018003d014 f i DelayImp:delayhlp.obj + 0001:0003c0ac ?DloadObtainSection@@YAPEAXPEAK0@Z 000000018003d0ac f i DelayImp:delayhlp.obj + 0001:0003c148 ?DloadProtectSection@@YAXKPEAK@Z 000000018003d148 f i DelayImp:delayhlp.obj + 0001:0003c1d8 ?DloadReleaseSectionWriteAccess@@YAXXZ 000000018003d1d8 f i DelayImp:delayhlp.obj + 0001:0003c26c __delayLoadHelper2 000000018003d26c f DelayImp:delayhlp.obj + 0001:0003c544 __GSHandlerCheck 000000018003d544 f LIBCMT:gshandler.obj + 0001:0003c564 __GSHandlerCheckCommon 000000018003d564 f LIBCMT:gshandler.obj + 0001:0003c5c0 _FindPESection 000000018003d5c0 f LIBCMT:pesect.obj + 0001:0003c610 _IsNonwritableInCurrentImage 000000018003d610 f LIBCMT:pesect.obj + 0001:0003c660 _ValidateImageBase 000000018003d660 f LIBCMT:pesect.obj + 0001:0003c690 __GSHandlerCheck_SEH 000000018003d690 f LIBCMT:gshandlerseh.obj + 0001:0003c730 __chkstk 000000018003d730 f LIBCMT:chkstk.obj + 0001:0003c730 _alloca_probe 000000018003d730 f LIBCMT:chkstk.obj + 0001:0003c784 strrchr 000000018003d784 f libvcruntime:strrchr.obj + 0001:0003c8d0 memcmp 000000018003d8d0 f libvcruntime:memcmp.obj + 0001:0003c998 ceilf 000000018003d998 f libucrt:ceilf.obj + 0001:0003ca30 _guard_dispatch_icall_nop 000000018003da30 f LIBCMT:guard_dispatch.obj + 0001:0003ca50 _guard_xfg_dispatch_icall_nop 000000018003da50 f LIBCMT:guard_xfg_dispatch.obj + 0002:00000000 __imp_GetModuleHandleA 000000018003e000 kernel32:KERNEL32.dll + 0002:00000008 __imp_LoadLibraryExA 000000018003e008 kernel32:KERNEL32.dll + 0002:00000010 __imp_RtlCaptureContext 000000018003e010 kernel32:KERNEL32.dll + 0002:00000018 __imp_RtlLookupFunctionEntry 000000018003e018 kernel32:KERNEL32.dll + 0002:00000020 __imp_RtlVirtualUnwind 000000018003e020 kernel32:KERNEL32.dll + 0002:00000028 __imp_UnhandledExceptionFilter 000000018003e028 kernel32:KERNEL32.dll + 0002:00000030 __imp_SetUnhandledExceptionFilter 000000018003e030 kernel32:KERNEL32.dll + 0002:00000038 __imp_GetCurrentProcess 000000018003e038 kernel32:KERNEL32.dll + 0002:00000040 __imp_TerminateProcess 000000018003e040 kernel32:KERNEL32.dll + 0002:00000048 __imp_IsProcessorFeaturePresent 000000018003e048 kernel32:KERNEL32.dll + 0002:00000050 __imp_CloseHandle 000000018003e050 kernel32:KERNEL32.dll + 0002:00000058 __imp_EnterCriticalSection 000000018003e058 kernel32:KERNEL32.dll + 0002:00000060 __imp_LeaveCriticalSection 000000018003e060 kernel32:KERNEL32.dll + 0002:00000068 __imp_InitializeCriticalSectionAndSpinCount 000000018003e068 kernel32:KERNEL32.dll + 0002:00000070 __imp_DeleteCriticalSection 000000018003e070 kernel32:KERNEL32.dll + 0002:00000078 __imp_SetEvent 000000018003e078 kernel32:KERNEL32.dll + 0002:00000080 __imp_ResetEvent 000000018003e080 kernel32:KERNEL32.dll + 0002:00000088 __imp_WaitForSingleObjectEx 000000018003e088 kernel32:KERNEL32.dll + 0002:00000090 __imp_CreateEventW 000000018003e090 kernel32:KERNEL32.dll + 0002:00000098 __imp_GetModuleHandleW 000000018003e098 kernel32:KERNEL32.dll + 0002:000000a0 __imp_GetProcAddress 000000018003e0a0 kernel32:KERNEL32.dll + 0002:000000a8 __imp_IsDebuggerPresent 000000018003e0a8 kernel32:KERNEL32.dll + 0002:000000b0 __imp_GetStartupInfoW 000000018003e0b0 kernel32:KERNEL32.dll + 0002:000000b8 __imp_QueryPerformanceCounter 000000018003e0b8 kernel32:KERNEL32.dll + 0002:000000c0 __imp_GetCurrentProcessId 000000018003e0c0 kernel32:KERNEL32.dll + 0002:000000c8 __imp_GetCurrentThreadId 000000018003e0c8 kernel32:KERNEL32.dll + 0002:000000d0 __imp_GetSystemTimeAsFileTime 000000018003e0d0 kernel32:KERNEL32.dll + 0002:000000d8 __imp_InitializeSListHead 000000018003e0d8 kernel32:KERNEL32.dll + 0002:000000e0 __imp_RtlPcToFileHeader 000000018003e0e0 kernel32:KERNEL32.dll + 0002:000000e8 __imp_RaiseException 000000018003e0e8 kernel32:KERNEL32.dll + 0002:000000f0 __imp_RtlUnwindEx 000000018003e0f0 kernel32:KERNEL32.dll + 0002:000000f8 __imp_InterlockedFlushSList 000000018003e0f8 kernel32:KERNEL32.dll + 0002:00000100 __imp_GetLastError 000000018003e100 kernel32:KERNEL32.dll + 0002:00000108 __imp_SetLastError 000000018003e108 kernel32:KERNEL32.dll + 0002:00000110 __imp_EncodePointer 000000018003e110 kernel32:KERNEL32.dll + 0002:00000118 __imp_TlsAlloc 000000018003e118 kernel32:KERNEL32.dll + 0002:00000120 __imp_TlsGetValue 000000018003e120 kernel32:KERNEL32.dll + 0002:00000128 __imp_TlsSetValue 000000018003e128 kernel32:KERNEL32.dll + 0002:00000130 __imp_TlsFree 000000018003e130 kernel32:KERNEL32.dll + 0002:00000138 __imp_FreeLibrary 000000018003e138 kernel32:KERNEL32.dll + 0002:00000140 __imp_LoadLibraryExW 000000018003e140 kernel32:KERNEL32.dll + 0002:00000148 __imp_GetStdHandle 000000018003e148 kernel32:KERNEL32.dll + 0002:00000150 __imp_GetFileType 000000018003e150 kernel32:KERNEL32.dll + 0002:00000158 __imp_GetModuleFileNameW 000000018003e158 kernel32:KERNEL32.dll + 0002:00000160 __imp_GetModuleHandleExW 000000018003e160 kernel32:KERNEL32.dll + 0002:00000168 __imp_WriteConsoleW 000000018003e168 kernel32:KERNEL32.dll + 0002:00000170 __imp_ExitProcess 000000018003e170 kernel32:KERNEL32.dll + 0002:00000178 __imp_HeapAlloc 000000018003e178 kernel32:KERNEL32.dll + 0002:00000180 __imp_HeapReAlloc 000000018003e180 kernel32:KERNEL32.dll + 0002:00000188 __imp_WriteFile 000000018003e188 kernel32:KERNEL32.dll + 0002:00000190 __imp_OutputDebugStringW 000000018003e190 kernel32:KERNEL32.dll + 0002:00000198 __imp_HeapFree 000000018003e198 kernel32:KERNEL32.dll + 0002:000001a0 __imp_LCMapStringW 000000018003e1a0 kernel32:KERNEL32.dll + 0002:000001a8 __imp_GetConsoleCP 000000018003e1a8 kernel32:KERNEL32.dll + 0002:000001b0 __imp_GetConsoleMode 000000018003e1b0 kernel32:KERNEL32.dll + 0002:000001b8 __imp_GetFileSizeEx 000000018003e1b8 kernel32:KERNEL32.dll + 0002:000001c0 __imp_SetFilePointerEx 000000018003e1c0 kernel32:KERNEL32.dll + 0002:000001c8 __imp_FindClose 000000018003e1c8 kernel32:KERNEL32.dll + 0002:000001d0 __imp_FindFirstFileExW 000000018003e1d0 kernel32:KERNEL32.dll + 0002:000001d8 __imp_FindNextFileW 000000018003e1d8 kernel32:KERNEL32.dll + 0002:000001e0 __imp_IsValidCodePage 000000018003e1e0 kernel32:KERNEL32.dll + 0002:000001e8 __imp_GetACP 000000018003e1e8 kernel32:KERNEL32.dll + 0002:000001f0 __imp_GetOEMCP 000000018003e1f0 kernel32:KERNEL32.dll + 0002:000001f8 __imp_GetCPInfo 000000018003e1f8 kernel32:KERNEL32.dll + 0002:00000200 __imp_GetCommandLineA 000000018003e200 kernel32:KERNEL32.dll + 0002:00000208 __imp_GetCommandLineW 000000018003e208 kernel32:KERNEL32.dll + 0002:00000210 __imp_MultiByteToWideChar 000000018003e210 kernel32:KERNEL32.dll + 0002:00000218 __imp_WideCharToMultiByte 000000018003e218 kernel32:KERNEL32.dll + 0002:00000220 __imp_GetEnvironmentStringsW 000000018003e220 kernel32:KERNEL32.dll + 0002:00000228 __imp_FreeEnvironmentStringsW 000000018003e228 kernel32:KERNEL32.dll + 0002:00000230 __imp_GetProcessHeap 000000018003e230 kernel32:KERNEL32.dll + 0002:00000238 __imp_FlushFileBuffers 000000018003e238 kernel32:KERNEL32.dll + 0002:00000240 __imp_SetStdHandle 000000018003e240 kernel32:KERNEL32.dll + 0002:00000248 __imp_GetStringTypeW 000000018003e248 kernel32:KERNEL32.dll + 0002:00000250 __imp_HeapSize 000000018003e250 kernel32:KERNEL32.dll + 0002:00000258 __imp_CreateFileW 000000018003e258 kernel32:KERNEL32.dll + 0002:00000260 __imp_GetSystemInfo 000000018003e260 kernel32:KERNEL32.dll + 0002:00000268 __imp_VirtualProtect 000000018003e268 kernel32:KERNEL32.dll + 0002:00000270 __imp_VirtualQuery 000000018003e270 kernel32:KERNEL32.dll + 0002:00000278 \177KERNEL32_NULL_THUNK_DATA 000000018003e278 kernel32:KERNEL32.dll + 0002:00000280 __guard_check_icall_fptr 000000018003e280 LIBCMT:guard_support.obj + 0002:00000288 __guard_xfg_check_icall_fptr 000000018003e288 LIBCMT:guard_support.obj + 0002:00000290 __guard_dispatch_icall_fptr 000000018003e290 LIBCMT:guard_support.obj + 0002:00000298 __guard_xfg_dispatch_icall_fptr 000000018003e298 LIBCMT:guard_support.obj + 0002:000002a0 __guard_xfg_table_dispatch_icall_fptr 000000018003e2a0 LIBCMT:guard_support.obj + 0002:000002a8 __xc_a 000000018003e2a8 LIBCMT:initializers.obj + 0002:000002b0 _register_addon_ 000000018003e2b0 addon.obj + 0002:000002b8 __xc_z 000000018003e2b8 LIBCMT:initializers.obj + 0002:000002c0 __xi_a 000000018003e2c0 LIBCMT:initializers.obj + 0002:000002d0 __acrt_stdio_initializer 000000018003e2d0 libucrt:stdio_initializer.obj + 0002:000002d8 __acrt_multibyte_initializer 000000018003e2d8 libucrt:multibyte_initializer.obj + 0002:000002e0 __acrt_tran_fma3_initializer 000000018003e2e0 libucrt:fma3_initializer.obj + 0002:000002e8 __xi_z 000000018003e2e8 LIBCMT:initializers.obj + 0002:000002f0 __xl_a 000000018003e2f0 LIBCMT:tlssup.obj + 0002:000002f8 __xl_z 000000018003e2f8 LIBCMT:tlssup.obj + 0002:00000300 __xp_a 000000018003e300 LIBCMT:initializers.obj + 0002:00000308 __acrt_locale_terminator 000000018003e308 libucrt:locale_initializer.obj + 0002:00000310 __dcrt_console_output_terminator 000000018003e310 libucrt:console_output_initializer.obj + 0002:00000318 __acrt_stdio_terminator 000000018003e318 libucrt:stdio_initializer.obj + 0002:00000320 __xp_z 000000018003e320 LIBCMT:initializers.obj + 0002:00000328 __xt_a 000000018003e328 LIBCMT:initializers.obj + 0002:00000330 __xt_z 000000018003e330 LIBCMT:initializers.obj + 0002:00000340 __sz_node_exe 000000018003e340 node:node.exe + 0002:00000358 ??_7exception@std@@6B@ 000000018003e358 libcpmt:xthrow.obj + 0002:00000368 ??_C@_0BC@EOODALEL@Unknown?5exception@ 000000018003e368 libcpmt:xthrow.obj + 0002:00000388 ??_7bad_alloc@std@@6B@ 000000018003e388 libcpmt:xthrow.obj + 0002:00000398 ??_C@_0P@GHFPNOJB@bad?5allocation@ 000000018003e398 libcpmt:xthrow.obj + 0002:000003b0 ??_7logic_error@std@@6B@ 000000018003e3b0 libcpmt:xthrow.obj + 0002:000003c8 ??_7length_error@std@@6B@ 000000018003e3c8 libcpmt:xthrow.obj + 0002:000003e0 ??_7out_of_range@std@@6B@ 000000018003e3e0 libcpmt:xthrow.obj + 0002:000003f0 ?nothrow@std@@3Unothrow_t@1@B 000000018003e3f0 libcpmt:nothrow.obj + 0002:00000410 ??_C@_1EC@JIJBPKFM@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 000000018003e410 LIBCMT:thread_safe_statics.obj + 0002:00000458 ??_C@_1BK@MGMFAEKH@?$AAk?$AAe?$AAr?$AAn?$AAe?$AAl?$AA3?$AA2?$AA?4?$AAd?$AAl?$AAl@ 000000018003e458 LIBCMT:thread_safe_statics.obj + 0002:00000478 ??_C@_0BJ@JEBJOJFJ@SleepConditionVariableCS@ 000000018003e478 LIBCMT:thread_safe_statics.obj + 0002:00000498 ??_C@_0BJ@PGPPEPCC@WakeAllConditionVariable@ 000000018003e498 LIBCMT:thread_safe_statics.obj + 0002:000004b8 _pDefaultRawDllMain 000000018003e4b8 LIBCMT:dll_dllmain.obj + 0002:000004b8 _pRawDllMain 000000018003e4b8 LIBCMT:dll_dllmain.obj + 0002:000004c8 ??_7type_info@@6B@ 000000018003e4c8 LIBCMT:std_type_info_static.obj + 0002:000004d8 ??_7bad_array_new_length@std@@6B@ 000000018003e4d8 LIBCMT:throw_bad_alloc.obj + 0002:000004e8 ?s_negLengthTab@FH4@@3QBCB 000000018003e4e8 libvcruntime:risctrnsctrl.obj + 0002:000004f8 ?s_shiftTab@FH4@@3QBEB 000000018003e4f8 libvcruntime:risctrnsctrl.obj + 0002:000005a8 _pDestructExceptionObject 000000018003e5a8 libvcruntime:ehhelpers.obj + 0002:000005b8 ??_7bad_exception@std@@6B@ 000000018003e5b8 libvcruntime:frame.obj + 0002:000005c8 ??_C@_0O@DPKOEFFH@bad?5exception@ 000000018003e5c8 libvcruntime:frame.obj + 0002:00000ce0 ??_C@_08EHJDFFNH@__based?$CI@ 000000018003ece0 libvcruntime:undname.obj + 0002:00000cf0 ??_C@_07KOLFKCDI@__cdecl@ 000000018003ecf0 libvcruntime:undname.obj + 0002:00000cf8 ??_C@_08GHMPAG@__pascal@ 000000018003ecf8 libvcruntime:undname.obj + 0002:00000d08 ??_C@_09IFJBGAPI@__stdcall@ 000000018003ed08 libvcruntime:undname.obj + 0002:00000d18 ??_C@_0L@NPHFGOKO@__thiscall@ 000000018003ed18 libvcruntime:undname.obj + 0002:00000d28 ??_C@_0L@JMKHOMEK@__fastcall@ 000000018003ed28 libvcruntime:undname.obj + 0002:00000d38 ??_C@_0N@BCKKPABJ@__vectorcall@ 000000018003ed38 libvcruntime:undname.obj + 0002:00000d48 ??_C@_09HIJEGCPM@__clrcall@ 000000018003ed48 libvcruntime:undname.obj + 0002:00000d54 ??_C@_06GHPCKEAG@__eabi@ 000000018003ed54 libvcruntime:undname.obj + 0002:00000d60 ??_C@_09IOPIDJLG@__swift_1@ 000000018003ed60 libvcruntime:undname.obj + 0002:00000d70 ??_C@_09KFNFGKHF@__swift_2@ 000000018003ed70 libvcruntime:undname.obj + 0002:00000d80 ??_C@_07JOMMBBKO@__ptr64@ 000000018003ed80 libvcruntime:undname.obj + 0002:00000d88 ??_C@_0L@PILCLIHE@__restrict@ 000000018003ed88 libvcruntime:undname.obj + 0002:00000d98 ??_C@_0M@GFIIJFMG@__unaligned@ 000000018003ed98 libvcruntime:undname.obj + 0002:00000da8 ??_C@_09DHDLOLLB@restrict?$CI@ 000000018003eda8 libvcruntime:undname.obj + 0002:00000db4 ??_C@_04NIHEBCM@?5new@ 000000018003edb4 libvcruntime:undname.obj + 0002:00000dc0 ??_C@_07FPCDHGMM@?5delete@ 000000018003edc0 libvcruntime:undname.obj + 0002:00000dc8 ??_C@_01NEMOKFLO@?$DN@ 000000018003edc8 libvcruntime:undname.obj + 0002:00000dcc ??_C@_02GPIOPFAK@?$DO?$DO@ 000000018003edcc libvcruntime:undname.obj + 0002:00000dd0 ??_C@_02FODMEDOG@?$DM?$DM@ 000000018003edd0 libvcruntime:undname.obj + 0002:00000dd4 ??_C@_01DCLJPIOD@?$CB@ 000000018003edd4 libvcruntime:undname.obj + 0002:00000dd8 ??_C@_02EGOFBIJA@?$DN?$DN@ 000000018003edd8 libvcruntime:undname.obj + 0002:00000ddc ??_C@_02FDNJECIE@?$CB?$DN@ 000000018003eddc libvcruntime:undname.obj + 0002:00000de0 ??_C@_02GPECMEKF@?$FL?$FN@ 000000018003ede0 libvcruntime:undname.obj + 0002:00000de8 ??_C@_08LHJFAFGD@operator@ 000000018003ede8 libvcruntime:undname.obj + 0002:00000df4 ??_C@_02HBOOOICD@?9?$DO@ 000000018003edf4 libvcruntime:undname.obj + 0002:00000df8 ??_C@_01NBENCBCI@?$CK@ 000000018003edf8 libvcruntime:undname.obj + 0002:00000dfc ??_C@_02ECNGHCIF@?$CL?$CL@ 000000018003edfc libvcruntime:undname.obj + 0002:00000e00 ??_C@_02BAABKJLB@?9?9@ 000000018003ee00 libvcruntime:undname.obj + 0002:00000e04 ??_C@_01JOAMLHOP@?9@ 000000018003ee04 libvcruntime:undname.obj + 0002:00000e08 ??_C@_01MIFGBAGJ@?$CL@ 000000018003ee08 libvcruntime:undname.obj + 0002:00000e0c ??_C@_01HNPIGOCE@?$CG@ 000000018003ee0c libvcruntime:undname.obj + 0002:00000e10 ??_C@_03MNHNFDLC@?9?$DO?$CK@ 000000018003ee10 libvcruntime:undname.obj + 0002:00000e14 ??_C@_01KMDKNFGN@?1@ 000000018003ee14 libvcruntime:undname.obj + 0002:00000e18 ??_C@_01FGNFDNOH@?$CF@ 000000018003ee18 libvcruntime:undname.obj + 0002:00000e1c ??_C@_01MNNFJEPP@?$DM@ 000000018003ee1c libvcruntime:undname.obj + 0002:00000e20 ??_C@_02EHCHHCKH@?$DM?$DN@ 000000018003ee20 libvcruntime:undname.obj + 0002:00000e24 ??_C@_01PPODPGHN@?$DO@ 000000018003ee24 libvcruntime:undname.obj + 0002:00000e28 ??_C@_02EEKDKGMJ@?$DO?$DN@ 000000018003ee28 libvcruntime:undname.obj + 0002:00000e2c ??_C@_02HCKGKOFO@?$CI?$CJ@ 000000018003ee2c libvcruntime:undname.obj + 0002:00000e30 ??_C@_01PJKLJHI@?$HO@ 000000018003ee30 libvcruntime:undname.obj + 0002:00000e34 ??_C@_01JKBOJNNK@?$FO@ 000000018003ee34 libvcruntime:undname.obj + 0002:00000e38 ??_C@_01DNKMNLPK@?$HM@ 000000018003ee38 libvcruntime:undname.obj + 0002:00000e3c ??_C@_02PPKAJPJL@?$CG?$CG@ 000000018003ee3c libvcruntime:undname.obj + 0002:00000e40 ??_C@_02NONPIBCD@?$HM?$HM@ 000000018003ee40 libvcruntime:undname.obj + 0002:00000e44 ??_C@_02FPIMKNGF@?$CK?$DN@ 000000018003ee44 libvcruntime:undname.obj + 0002:00000e48 ??_C@_02FOEOMHFC@?$CL?$DN@ 000000018003ee48 libvcruntime:undname.obj + 0002:00000e4c ??_C@_02FKMDLLOA@?9?$DN@ 000000018003ee4c libvcruntime:undname.obj + 0002:00000e50 ??_C@_02FJEHGPIO@?1?$DN@ 000000018003ee50 libvcruntime:undname.obj + 0002:00000e54 ??_C@_02FENAOKFI@?$CF?$DN@ 000000018003ee54 libvcruntime:undname.obj + 0002:00000e58 ??_C@_03IKFCCPFF@?$DO?$DO?$DN@ 000000018003ee58 libvcruntime:undname.obj + 0002:00000e5c ??_C@_03CDNPDDLA@?$DM?$DM?$DN@ 000000018003ee5c libvcruntime:undname.obj + 0002:00000e60 ??_C@_02FGJGFEAB@?$CG?$DN@ 000000018003ee60 libvcruntime:undname.obj + 0002:00000e64 ??_C@_02DHLNPPGH@?$HM?$DN@ 000000018003ee64 libvcruntime:undname.obj + 0002:00000e68 ??_C@_02MHEGNOJ@?$FO?$DN@ 000000018003ee68 libvcruntime:undname.obj + 0002:00000e70 ??_C@_09IFPLHPGF@?$GAvftable?8@ 000000018003ee70 libvcruntime:undname.obj + 0002:00000e80 ??_C@_09BLBHBJP@?$GAvbtable?8@ 000000018003ee80 libvcruntime:undname.obj + 0002:00000e90 ??_C@_07FEEIOKP@?$GAvcall?8@ 000000018003ee90 libvcruntime:undname.obj + 0002:00000e98 ??_C@_08LLFFHHDJ@?$GAtypeof?8@ 000000018003ee98 libvcruntime:undname.obj + 0002:00000ea8 ??_C@_0BF@KDPPACIK@?$GAlocal?5static?5guard?8@ 000000018003eea8 libvcruntime:undname.obj + 0002:00000ec0 ??_C@_08OBABFOLI@?$GAstring?8@ 000000018003eec0 libvcruntime:undname.obj + 0002:00000ed0 ??_C@_0BD@JDLKDPAB@?$GAvbase?5destructor?8@ 000000018003eed0 libvcruntime:undname.obj + 0002:00000ee8 ??_C@_0BN@DEGPLNFK@?$GAvector?5deleting?5destructor?8@ 000000018003eee8 libvcruntime:undname.obj + 0002:00000f08 ??_C@_0BO@OBMKPJIG@?$GAdefault?5constructor?5closure?8@ 000000018003ef08 libvcruntime:undname.obj + 0002:00000f28 ??_C@_0BN@IMDCHIKM@?$GAscalar?5deleting?5destructor?8@ 000000018003ef28 libvcruntime:undname.obj + 0002:00000f48 ??_C@_0BO@PFGOCPJJ@?$GAvector?5constructor?5iterator?8@ 000000018003ef48 libvcruntime:undname.obj + 0002:00000f68 ??_C@_0BN@LFPFMEDL@?$GAvector?5destructor?5iterator?8@ 000000018003ef68 libvcruntime:undname.obj + 0002:00000f88 ??_C@_0CE@IKBNEHA@?$GAvector?5vbase?5constructor?5itera@ 000000018003ef88 libvcruntime:undname.obj + 0002:00000fb0 ??_C@_0BL@NILFHHPC@?$GAvirtual?5displacement?5map?8@ 000000018003efb0 libvcruntime:undname.obj + 0002:00000fd0 ??_C@_0CB@JONCMFFK@?$GAeh?5vector?5constructor?5iterator@ 000000018003efd0 libvcruntime:undname.obj + 0002:00000ff8 ??_C@_0CA@GCEOPDGL@?$GAeh?5vector?5destructor?5iterator?8@ 000000018003eff8 libvcruntime:undname.obj + 0002:00001018 ??_C@_0CH@OOJPLCPH@?$GAeh?5vector?5vbase?5constructor?5it@ 000000018003f018 libvcruntime:undname.obj + 0002:00001040 ??_C@_0BL@LLKPOHJI@?$GAcopy?5constructor?5closure?8@ 000000018003f040 libvcruntime:undname.obj + 0002:00001060 ??_C@_0BA@KBCDOMBN@?$GAudt?5returning?8@ 000000018003f060 libvcruntime:undname.obj + 0002:00001070 ??_C@_03KLGMFNMG@?$GAEH@ 000000018003f070 libvcruntime:undname.obj + 0002:00001074 ??_C@_05KHLCHHI@?$GARTTI@ 000000018003f074 libvcruntime:undname.obj + 0002:00001080 ??_C@_0BA@KKLDJDLB@?$GAlocal?5vftable?8@ 000000018003f080 libvcruntime:undname.obj + 0002:00001090 ??_C@_0CE@IIHCMGGL@?$GAlocal?5vftable?5constructor?5clos@ 000000018003f090 libvcruntime:undname.obj + 0002:000010b4 ??_C@_06FHBGPFGH@?5new?$FL?$FN@ 000000018003f0b4 libvcruntime:undname.obj + 0002:000010c0 ??_C@_09LBNFPBCA@?5delete?$FL?$FN@ 000000018003f0c0 libvcruntime:undname.obj + 0002:000010d0 ??_C@_0P@HJKNJFNN@?$GAomni?5callsig?8@ 000000018003f0d0 libvcruntime:undname.obj + 0002:000010e0 ??_C@_0BL@CNOONJFP@?$GAplacement?5delete?5closure?8@ 000000018003f0e0 libvcruntime:undname.obj + 0002:00001100 ??_C@_0BN@CKNJLHMB@?$GAplacement?5delete?$FL?$FN?5closure?8@ 000000018003f100 libvcruntime:undname.obj + 0002:00001120 ??_C@_0CG@CFDHKGGD@?$GAmanaged?5vector?5constructor?5ite@ 000000018003f120 libvcruntime:undname.obj + 0002:00001148 ??_C@_0CF@IMGKMJNO@?$GAmanaged?5vector?5destructor?5iter@ 000000018003f148 libvcruntime:undname.obj + 0002:00001170 ??_C@_0CG@HLDDJMAG@?$GAeh?5vector?5copy?5constructor?5ite@ 000000018003f170 libvcruntime:undname.obj + 0002:00001198 ??_C@_0CM@FCBBDIGB@?$GAeh?5vector?5vbase?5copy?5construct@ 000000018003f198 libvcruntime:undname.obj + 0002:000011c8 ??_C@_0BL@CLIPGLGB@?$GAdynamic?5initializer?5for?5?8@ 000000018003f1c8 libvcruntime:undname.obj + 0002:000011e8 ??_C@_0CB@PDBIFEP@?$GAdynamic?5atexit?5destructor?5for?5@ 000000018003f1e8 libvcruntime:undname.obj + 0002:00001210 ??_C@_0CD@CGAJBKEJ@?$GAvector?5copy?5constructor?5iterat@ 000000018003f210 libvcruntime:undname.obj + 0002:00001238 ??_C@_0CJ@GJELGAMM@?$GAvector?5vbase?5copy?5constructor?5@ 000000018003f238 libvcruntime:undname.obj + 0002:00001268 ??_C@_0CL@FGIJHLCE@?$GAmanaged?5vector?5copy?5constructo@ 000000018003f268 libvcruntime:undname.obj + 0002:00001298 ??_C@_0BM@PMGGMLDN@?$GAlocal?5static?5thread?5guard?8@ 000000018003f298 libvcruntime:undname.obj + 0002:000012b8 ??_C@_0N@BDNMDMOL@operator?5?$CC?$CC?5@ 000000018003f2b8 libvcruntime:undname.obj + 0002:000012c8 ??_C@_0BC@GGEBGALA@operator?5co_await@ 000000018003f2c8 libvcruntime:undname.obj + 0002:000012e0 ??_C@_0M@GAAIMMOH@operator?$DM?$DN?$DO@ 000000018003f2e0 libvcruntime:undname.obj + 0002:000012f0 ??_C@_0BC@DAFEJGAK@?5Type?5Descriptor?8@ 000000018003f2f0 libvcruntime:undname.obj + 0002:00001308 ??_C@_0BM@LDKODKLH@?5Base?5Class?5Descriptor?5at?5?$CI@ 000000018003f308 libvcruntime:undname.obj + 0002:00001328 ??_C@_0BD@LGICGFMM@?5Base?5Class?5Array?8@ 000000018003f328 libvcruntime:undname.obj + 0002:00001340 ??_C@_0BN@MECKDCOJ@?5Class?5Hierarchy?5Descriptor?8@ 000000018003f340 libvcruntime:undname.obj + 0002:00001360 ??_C@_0BK@CFCOFLF@?5Complete?5Object?5Locator?8@ 000000018003f360 libvcruntime:undname.obj + 0002:00001380 ??_C@_0BG@JNJLAMPM@?$GAanonymous?5namespace?8@ 000000018003f380 libvcruntime:undname.obj + 0002:000013b0 ??_C@_1DM@KHCHBNEB@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 000000018003f3b0 libvcruntime:winapi_downlevel.obj + 0002:000013f0 ??_C@_1DK@LPPGFMPP@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 000000018003f3f0 libvcruntime:winapi_downlevel.obj + 0002:00001430 ??_C@_1BC@GDMECMAK@?$AAk?$AAe?$AAr?$AAn?$AAe?$AAl?$AA3?$AA2@ 000000018003f430 libvcruntime:winapi_downlevel.obj + 0002:00001448 ??_C@_1BA@PFFKHIOG@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9@ 000000018003f448 libvcruntime:winapi_downlevel.obj + 0002:00001460 ??_C@_08KNHFBNJ@FlsAlloc@ 000000018003f460 libvcruntime:winapi_downlevel.obj + 0002:00001478 ??_C@_07PEJMOBNF@FlsFree@ 000000018003f478 libvcruntime:winapi_downlevel.obj + 0002:00001488 ??_C@_0M@GDNOONDI@FlsGetValue@ 000000018003f488 libvcruntime:winapi_downlevel.obj + 0002:000014a0 ??_C@_0M@JCPCPOEF@FlsSetValue@ 000000018003f4a0 libvcruntime:winapi_downlevel.obj + 0002:000014b8 ??_C@_0BM@HCFOFFN@InitializeCriticalSectionEx@ 000000018003f4b8 libvcruntime:winapi_downlevel.obj + 0002:000014e0 ??_C@_1FE@LHBLIKM@?$AAA?$AAs?$AAs?$AAe?$AAr?$AAt?$AAi?$AAo?$AAn?$AA?5?$AAf?$AAa?$AAi?$AAl?$AAe@ 000000018003f4e0 libucrt:assert.obj + 0002:00001540 ??_C@_1EK@MBDPDCGA@?$AAM?$AAi?$AAc?$AAr?$AAo?$AAs?$AAo?$AAf?$AAt?$AA?5?$AAV?$AAi?$AAs?$AAu?$AAa@ 000000018003f540 libucrt:assert.obj + 0002:00001590 ??_C@_1CE@OJBNHDMO@?$AAA?$AAs?$AAs?$AAe?$AAr?$AAt?$AAi?$AAo?$AAn?$AA?5?$AAf?$AAa?$AAi?$AAl?$AAe@ 000000018003f590 libucrt:assert.obj + 0002:000015b8 ??_C@_1BE@PHKBBGE@?$AAP?$AAr?$AAo?$AAg?$AAr?$AAa?$AAm?$AA?3?$AA?5@ 000000018003f5b8 libucrt:assert.obj + 0002:000015d0 ??_C@_1O@HEMHKNDC@?$AAF?$AAi?$AAl?$AAe?$AA?3?$AA?5@ 000000018003f5d0 libucrt:assert.obj + 0002:000015e0 ??_C@_1O@KCAFKHJE@?$AAL?$AAi?$AAn?$AAe?$AA?3?$AA?5@ 000000018003f5e0 libucrt:assert.obj + 0002:000015f0 ??_C@_1BK@PEDCIPMA@?$AAE?$AAx?$AAp?$AAr?$AAe?$AAs?$AAs?$AAi?$AAo?$AAn?$AA?3?$AA?5@ 000000018003f5f0 libucrt:assert.obj + 0002:00001610 ??_C@_1OA@EGMLFBHJ@?$AAF?$AAo?$AAr?$AA?5?$AAi?$AAn?$AAf?$AAo?$AAr?$AAm?$AAa?$AAt?$AAi?$AAo?$AAn@ 000000018003f610 libucrt:assert.obj + 0002:000016f0 ??_C@_1HK@POCJMFGK@?$AA?$CI?$AAP?$AAr?$AAe?$AAs?$AAs?$AA?5?$AAR?$AAe?$AAt?$AAr?$AAy?$AA?5?$AAt?$AAo@ 000000018003f6f0 libucrt:assert.obj + 0002:00001770 ??_C@_17LGKOMLJ@?$AA?4?$AA?4?$AA?4@ 000000018003f770 libucrt:assert.obj + 0002:00001778 ??_C@_13LBAGMAIH@?$AA?6@ 000000018003f778 libucrt:assert.obj + 0002:0000177c ??_C@_15IABLJNFO@?$AA?6?$AA?6@ 000000018003f77c libucrt:assert.obj + 0002:00001788 ??_C@_1CO@EAEJAADC@?$AA?$DM?$AAp?$AAr?$AAo?$AAg?$AAr?$AAa?$AAm?$AA?5?$AAn?$AAa?$AAm?$AAe?$AA?5?$AAu@ 000000018003f788 libucrt:assert.obj + 0002:000017c0 standard_lookup_table 000000018003f7c0 libucrt:output.obj + 0002:00001820 ??_C@_1O@CEDCILHN@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ@ 000000018003f820 libucrt:output.obj + 0002:00001830 ??_C@_06OJHGLDPL@?$CInull?$CJ@ 000000018003f830 libucrt:output.obj + 0002:00001c58 ??_C@_04KGLCPMCP@log2@ 000000018003fc58 libucrt:log2.obj + 0002:00001c60 __real@03d0000000000000 000000018003fc60 libucrt:log2.obj + 0002:00001c68 __real@3ecb295c17f0bbbe 000000018003fc68 libucrt:log2.obj + 0002:00001c70 __real@3f3c8034c85dfff0 000000018003fc70 libucrt:log2.obj + 0002:00001c78 __real@3f62492307f1519f 000000018003fc78 libucrt:log2.obj + 0002:00001c80 __real@3f6249423bd94741 000000018003fc80 libucrt:log2.obj + 0002:00001c88 __real@3f80000000000000 000000018003fc88 libucrt:log2.obj + 0002:00001c90 __real@3f89999999865ede 000000018003fc90 libucrt:log2.obj + 0002:00001c98 __real@3f89999999bac6d4 000000018003fc98 libucrt:log2.obj + 0002:00001ca0 __real@3fb55555555554e6 000000018003fca0 libucrt:log2.obj + 0002:00001ca8 __real@3fb5555555555557 000000018003fca8 libucrt:log2.obj + 0002:00001cb0 __real@3ff0000000000000 000000018003fcb0 libucrt:log2.obj + 0002:00001cb8 __real@3ff7154400000000 000000018003fcb8 libucrt:log2.obj + 0002:00001cc0 __acrt_exception_action_table 000000018003fcc0 libucrt:exception_filter.obj + 0002:00001d80 __acrt_signal_action_table_count 000000018003fd80 libucrt:exception_filter.obj + 0002:00001d88 __acrt_signal_action_first_fpe_index 000000018003fd88 libucrt:exception_filter.obj + 0002:00001d90 __acrt_signal_action_fpe_count 000000018003fd90 libucrt:exception_filter.obj + 0002:00001d98 ??_C@_1BI@BGOHAHKC@?$AAm?$AAs?$AAc?$AAo?$AAr?$AAe?$AAe?$AA?4?$AAd?$AAl?$AAl@ 000000018003fd98 libucrt:exit.obj + 0002:00001db0 ??_C@_0P@MIGLKIOC@CorExitProcess@ 000000018003fdb0 libucrt:exit.obj + 0002:000020d0 ??_C@_1EA@JGEFHKEI@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 00000001800400d0 libucrt:winapi_thunks.obj + 0002:00002110 ??_C@_1DI@IJCEHOCB@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 0000000180040110 libucrt:winapi_thunks.obj + 0002:00002150 ??_C@_1EI@MPIAOHOC@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 0000000180040150 libucrt:winapi_thunks.obj + 0002:000021a0 ??_C@_1FK@FPHCKFIE@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 00000001800401a0 libucrt:winapi_thunks.obj + 0002:00002200 ??_C@_1EM@DILCGIIO@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 0000000180040200 libucrt:winapi_thunks.obj + 0002:00002250 ??_C@_1DM@LNCGDDPN@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 0000000180040250 libucrt:winapi_thunks.obj + 0002:00002290 ??_C@_1DO@FPAPJEMD@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 0000000180040290 libucrt:winapi_thunks.obj + 0002:000022d0 ??_C@_1DK@NDHNAHIO@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 00000001800402d0 libucrt:winapi_thunks.obj + 0002:00002310 ??_C@_1DM@KGHDGBCM@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe@ 0000000180040310 libucrt:winapi_thunks.obj + 0002:00002350 ??_C@_1EO@IJIOEFOH@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAr?$AAt?$AAc?$AAo@ 0000000180040350 libucrt:winapi_thunks.obj + 0002:000023a0 ??_C@_1FG@HHGEKANL@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAs?$AAe?$AAc?$AAu@ 00000001800403a0 libucrt:winapi_thunks.obj + 0002:00002400 ??_C@_1EG@DBIOJECG@?$AAe?$AAx?$AAt?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAn?$AAt?$AAu?$AAs@ 0000000180040400 libucrt:winapi_thunks.obj + 0002:00002450 ??_C@_1EO@FIHMJCLF@?$AAe?$AAx?$AAt?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAn?$AAt?$AAu?$AAs@ 0000000180040450 libucrt:winapi_thunks.obj + 0002:000024a0 ??_C@_1BC@DNHGCMLG@?$AAa?$AAd?$AAv?$AAa?$AAp?$AAi?$AA3?$AA2@ 00000001800404a0 libucrt:winapi_thunks.obj + 0002:000024b8 ??_C@_1M@OAIMIKLP@?$AAn?$AAt?$AAd?$AAl?$AAl@ 00000001800404b8 libucrt:winapi_thunks.obj + 0002:000024d0 ??_C@_1EG@DPGNFKGC@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAa?$AAp?$AAp?$AAm@ 00000001800404d0 libucrt:winapi_thunks.obj + 0002:00002518 ??_C@_1O@BCCLBEOE@?$AAu?$AAs?$AAe?$AAr?$AA3?$AA2@ 0000000180040518 libucrt:winapi_thunks.obj + 0002:00002528 ??_C@_1BA@IAIFMGEF@?$AAe?$AAx?$AAt?$AA?9?$AAm?$AAs?$AA?9@ 0000000180040528 libucrt:winapi_thunks.obj + 0002:00002540 ??_C@_0BA@FHFNEAED@AreFileApisANSI@ 0000000180040540 libucrt:winapi_thunks.obj + 0002:00002578 ??_C@_0BA@HNOPNCHB@GetActiveWindow@ 0000000180040578 libucrt:winapi_thunks.obj + 0002:00002590 ??_C@_0BD@HHGDFDBJ@GetLastActivePopup@ 0000000180040590 libucrt:winapi_thunks.obj + 0002:000025b0 ??_C@_0BI@DFKBFLJE@GetProcessWindowStation@ 00000001800405b0 libucrt:winapi_thunks.obj + 0002:000025d0 ??_C@_0BK@DEKFELLI@GetUserObjectInformationW@ 00000001800405d0 libucrt:winapi_thunks.obj + 0002:00002600 ??_C@_0O@KKBNKAPF@LCMapStringEx@ 0000000180040600 libucrt:winapi_thunks.obj + 0002:00002618 ??_C@_0BB@HBDEELFH@LocaleNameToLCID@ 0000000180040618 libucrt:winapi_thunks.obj + 0002:00002638 ??_C@_0M@CHKKJDAI@MessageBoxA@ 0000000180040638 libucrt:winapi_thunks.obj + 0002:00002650 ??_C@_0M@DLDCCGNP@MessageBoxW@ 0000000180040650 libucrt:winapi_thunks.obj + 0002:00002660 ??_C@_0CF@OJOFEIGO@AppPolicyGetProcessTerminationM@ 0000000180040660 libucrt:winapi_thunks.obj + 0002:00002690 ??_C@_0CE@OICFMIKE@AppPolicyGetShowDeveloperDiagno@ 0000000180040690 libucrt:winapi_thunks.obj + 0002:000026b8 ??_C@_0BL@ODDJNEDA@AppPolicyGetWindowingModel@ 00000001800406b8 libucrt:winapi_thunks.obj + 0002:00002760 ??_C@_03OEIAHPBN@INF@ 0000000180040760 libucrt:cvt.obj + 0002:00002764 ??_C@_03OJHLLCGB@inf@ 0000000180040764 libucrt:cvt.obj + 0002:00002768 ??_C@_03LKNCIKJB@NAN@ 0000000180040768 libucrt:cvt.obj + 0002:0000276c ??_C@_03LHCJEHON@nan@ 000000018004076c libucrt:cvt.obj + 0002:00002770 ??_C@_09OFJJIMPC@NAN?$CISNAN?$CJ@ 0000000180040770 libucrt:cvt.obj + 0002:00002780 ??_C@_09IPFBKMDL@nan?$CIsnan?$CJ@ 0000000180040780 libucrt:cvt.obj + 0002:00002790 ??_C@_08IKHNHAJ@NAN?$CIIND?$CJ@ 0000000180040790 libucrt:cvt.obj + 0002:000027a0 ??_C@_08OFCDMILK@nan?$CIind?$CJ@ 00000001800407a0 libucrt:cvt.obj + 0002:000027ac ??_C@_05KLBDPFGC@e?$CL000@ 00000001800407ac libucrt:cvt.obj + 0002:000027c0 __lc_time_c 00000001800407c0 libucrt:nlsdata.obj + 0002:00002a80 ??_C@_03KOEHGMDN@Sun@ 0000000180040a80 libucrt:nlsdata.obj + 0002:00002a84 ??_C@_03PDAGKDH@Mon@ 0000000180040a84 libucrt:nlsdata.obj + 0002:00002a88 ??_C@_03NAGEINEP@Tue@ 0000000180040a88 libucrt:nlsdata.obj + 0002:00002a8c ??_C@_03MHOMLAJA@Wed@ 0000000180040a8c libucrt:nlsdata.obj + 0002:00002a90 ??_C@_03IOFIKPDN@Thu@ 0000000180040a90 libucrt:nlsdata.obj + 0002:00002a94 ??_C@_03IDIOELNC@Fri@ 0000000180040a94 libucrt:nlsdata.obj + 0002:00002a98 ??_C@_03FEFJNEK@Sat@ 0000000180040a98 libucrt:nlsdata.obj + 0002:00002a9c ??_C@_06OOPIFAJ@Sunday@ 0000000180040a9c libucrt:nlsdata.obj + 0002:00002aa4 ??_C@_06JLEDEDGH@Monday@ 0000000180040aa4 libucrt:nlsdata.obj + 0002:00002ab0 ??_C@_07BAAGCFCM@Tuesday@ 0000000180040ab0 libucrt:nlsdata.obj + 0002:00002ab8 ??_C@_09DLIGFAKA@Wednesday@ 0000000180040ab8 libucrt:nlsdata.obj + 0002:00002ac8 ??_C@_08HACCIKIA@Thursday@ 0000000180040ac8 libucrt:nlsdata.obj + 0002:00002ad4 ??_C@_06JECMNKMI@Friday@ 0000000180040ad4 libucrt:nlsdata.obj + 0002:00002ae0 ??_C@_08INBOOONO@Saturday@ 0000000180040ae0 libucrt:nlsdata.obj + 0002:00002aec ??_C@_03JIHJHPIE@Jan@ 0000000180040aec libucrt:nlsdata.obj + 0002:00002af0 ??_C@_03HJBDCHOM@Feb@ 0000000180040af0 libucrt:nlsdata.obj + 0002:00002af4 ??_C@_03ODNJBKGA@Mar@ 0000000180040af4 libucrt:nlsdata.obj + 0002:00002af8 ??_C@_03LEOLGMJP@Apr@ 0000000180040af8 libucrt:nlsdata.obj + 0002:00002afc ??_C@_03CNMDKL@May@ 0000000180040afc libucrt:nlsdata.obj + 0002:00002b00 ??_C@_03IDFGHECI@Jun@ 0000000180040b00 libucrt:nlsdata.obj + 0002:00002b04 ??_C@_03LBGABGKK@Jul@ 0000000180040b04 libucrt:nlsdata.obj + 0002:00002b08 ??_C@_03IFJFEIGA@Aug@ 0000000180040b08 libucrt:nlsdata.obj + 0002:00002b0c ??_C@_03GGCAPAJC@Sep@ 0000000180040b0c libucrt:nlsdata.obj + 0002:00002b10 ??_C@_03BMAOKBAD@Oct@ 0000000180040b10 libucrt:nlsdata.obj + 0002:00002b14 ??_C@_03JPJOFNIA@Nov@ 0000000180040b14 libucrt:nlsdata.obj + 0002:00002b18 ??_C@_03MKABNOCG@Dec@ 0000000180040b18 libucrt:nlsdata.obj + 0002:00002b20 ??_C@_07CGJPFGJA@January@ 0000000180040b20 libucrt:nlsdata.obj + 0002:00002b28 ??_C@_08GNJGEPFN@February@ 0000000180040b28 libucrt:nlsdata.obj + 0002:00002b34 ??_C@_05HPCKOFNC@March@ 0000000180040b34 libucrt:nlsdata.obj + 0002:00002b3c ??_C@_05DMJDNLEJ@April@ 0000000180040b3c libucrt:nlsdata.obj + 0002:00002b44 ??_C@_04CNLMGBGM@June@ 0000000180040b44 libucrt:nlsdata.obj + 0002:00002b4c ??_C@_04MIEPOIFP@July@ 0000000180040b4c libucrt:nlsdata.obj + 0002:00002b54 ??_C@_06LBBHFDDG@August@ 0000000180040b54 libucrt:nlsdata.obj + 0002:00002b60 ??_C@_09BHHEALKD@September@ 0000000180040b60 libucrt:nlsdata.obj + 0002:00002b70 ??_C@_07JJNFCEND@October@ 0000000180040b70 libucrt:nlsdata.obj + 0002:00002b78 ??_C@_08HCHEGEOA@November@ 0000000180040b78 libucrt:nlsdata.obj + 0002:00002b88 ??_C@_08EDHMEBNP@December@ 0000000180040b88 libucrt:nlsdata.obj + 0002:00002b94 ??_C@_02DEDBPAFC@AM@ 0000000180040b94 libucrt:nlsdata.obj + 0002:00002b98 ??_C@_02CJNFDJBF@PM@ 0000000180040b98 libucrt:nlsdata.obj + 0002:00002ba0 ??_C@_08BPBNCDIB@MM?1dd?1yy@ 0000000180040ba0 libucrt:nlsdata.obj + 0002:00002bb0 ??_C@_0BE@CKGJFCPC@dddd?0?5MMMM?5dd?0?5yyyy@ 0000000180040bb0 libucrt:nlsdata.obj + 0002:00002bc8 ??_C@_08JCCMCCIL@HH?3mm?3ss@ 0000000180040bc8 libucrt:nlsdata.obj + 0002:00002bd8 ??_C@_17MBGCMIPB@?$AAS?$AAu?$AAn@ 0000000180040bd8 libucrt:nlsdata.obj + 0002:00002be0 ??_C@_17KBOMKBF@?$AAM?$AAo?$AAn@ 0000000180040be0 libucrt:nlsdata.obj + 0002:00002be8 ??_C@_17BMKGEGOJ@?$AAT?$AAu?$AAe@ 0000000180040be8 libucrt:nlsdata.obj + 0002:00002bf0 ??_C@_17CJEDCEPE@?$AAW?$AAe?$AAd@ 0000000180040bf0 libucrt:nlsdata.obj + 0002:00002bf8 ??_C@_17PDPHAADD@?$AAT?$AAh?$AAu@ 0000000180040bf8 libucrt:nlsdata.obj + 0002:00002c00 ??_C@_17HFOLPPLP@?$AAF?$AAr?$AAi@ 0000000180040c00 libucrt:nlsdata.obj + 0002:00002c08 ??_C@_17GGIBDPIH@?$AAS?$AAa?$AAt@ 0000000180040c08 libucrt:nlsdata.obj + 0002:00002c10 ??_C@_1O@IHNHDHPB@?$AAS?$AAu?$AAn?$AAd?$AAa?$AAy@ 0000000180040c10 libucrt:nlsdata.obj + 0002:00002c20 ??_C@_1O@MMNBFLIA@?$AAM?$AAo?$AAn?$AAd?$AAa?$AAy@ 0000000180040c20 libucrt:nlsdata.obj + 0002:00002c30 ??_C@_1BA@ENFBFFEK@?$AAT?$AAu?$AAe?$AAs?$AAd?$AAa?$AAy@ 0000000180040c30 libucrt:nlsdata.obj + 0002:00002c40 ??_C@_1BE@EBOGMDOH@?$AAW?$AAe?$AAd?$AAn?$AAe?$AAs?$AAd?$AAa?$AAy@ 0000000180040c40 libucrt:nlsdata.obj + 0002:00002c58 ??_C@_1BC@HHMNLIHE@?$AAT?$AAh?$AAu?$AAr?$AAs?$AAd?$AAa?$AAy@ 0000000180040c58 libucrt:nlsdata.obj + 0002:00002c70 ??_C@_1O@PDICJHAG@?$AAF?$AAr?$AAi?$AAd?$AAa?$AAy@ 0000000180040c70 libucrt:nlsdata.obj + 0002:00002c80 ??_C@_1BC@ENMNNPAJ@?$AAS?$AAa?$AAt?$AAu?$AAr?$AAd?$AAa?$AAy@ 0000000180040c80 libucrt:nlsdata.obj + 0002:00002c98 ??_C@_17DKNBKCHM@?$AAJ?$AAa?$AAn@ 0000000180040c98 libucrt:nlsdata.obj + 0002:00002ca0 ??_C@_17LMDJEKJN@?$AAF?$AAe?$AAb@ 0000000180040ca0 libucrt:nlsdata.obj + 0002:00002ca8 ??_C@_17CKNLEDEC@?$AAM?$AAa?$AAr@ 0000000180040ca8 libucrt:nlsdata.obj + 0002:00002cb0 ??_C@_17LFPOIHDD@?$AAA?$AAp?$AAr@ 0000000180040cb0 libucrt:nlsdata.obj + 0002:00002cb8 ??_C@_17PNNKMEED@?$AAM?$AAa?$AAy@ 0000000180040cb8 libucrt:nlsdata.obj + 0002:00002cc0 ??_C@_17KCJGOCPB@?$AAJ?$AAu?$AAn@ 0000000180040cc0 libucrt:nlsdata.obj + 0002:00002cc8 ??_C@_17IJPCKHK@?$AAJ?$AAu?$AAl@ 0000000180040cc8 libucrt:nlsdata.obj + 0002:00002cd0 ??_C@_17ICPELBCN@?$AAA?$AAu?$AAg@ 0000000180040cd0 libucrt:nlsdata.obj + 0002:00002cd8 ??_C@_17HCHCOKMG@?$AAS?$AAe?$AAp@ 0000000180040cd8 libucrt:nlsdata.obj + 0002:00002ce0 ??_C@_17FNLKOI@?$AAO?$AAc?$AAt@ 0000000180040ce0 libucrt:nlsdata.obj + 0002:00002ce8 ??_C@_17BBDMLCIG@?$AAN?$AAo?$AAv@ 0000000180040ce8 libucrt:nlsdata.obj + 0002:00002cf0 ??_C@_17EGKACKIF@?$AAD?$AAe?$AAc@ 0000000180040cf0 libucrt:nlsdata.obj + 0002:00002cf8 ??_C@_1BA@EFMEIEBA@?$AAJ?$AAa?$AAn?$AAu?$AAa?$AAr?$AAy@ 0000000180040cf8 libucrt:nlsdata.obj + 0002:00002d08 ??_C@_1BC@JGDDFFAM@?$AAF?$AAe?$AAb?$AAr?$AAu?$AAa?$AAr?$AAy@ 0000000180040d08 libucrt:nlsdata.obj + 0002:00002d20 ??_C@_1M@IKEENEDF@?$AAM?$AAa?$AAr?$AAc?$AAh@ 0000000180040d20 libucrt:nlsdata.obj + 0002:00002d30 ??_C@_1M@GJNLMHFD@?$AAA?$AAp?$AAr?$AAi?$AAl@ 0000000180040d30 libucrt:nlsdata.obj + 0002:00002d40 ??_C@_19EPFLPGAP@?$AAJ?$AAu?$AAn?$AAe@ 0000000180040d40 libucrt:nlsdata.obj + 0002:00002d50 ??_C@_19BIFMLPCD@?$AAJ?$AAu?$AAl?$AAy@ 0000000180040d50 libucrt:nlsdata.obj + 0002:00002d60 ??_C@_1O@PAHLKOAC@?$AAA?$AAu?$AAg?$AAu?$AAs?$AAt@ 0000000180040d60 libucrt:nlsdata.obj + 0002:00002d70 ??_C@_1BE@DKAAMBJL@?$AAS?$AAe?$AAp?$AAt?$AAe?$AAm?$AAb?$AAe?$AAr@ 0000000180040d70 libucrt:nlsdata.obj + 0002:00002d88 ??_C@_1BA@EPANDLNG@?$AAO?$AAc?$AAt?$AAo?$AAb?$AAe?$AAr@ 0000000180040d88 libucrt:nlsdata.obj + 0002:00002d98 ??_C@_1BC@BGLIFPF@?$AAN?$AAo?$AAv?$AAe?$AAm?$AAb?$AAe?$AAr@ 0000000180040d98 libucrt:nlsdata.obj + 0002:00002db0 ??_C@_1BC@FEMKIFH@?$AAD?$AAe?$AAc?$AAe?$AAm?$AAb?$AAe?$AAr@ 0000000180040db0 libucrt:nlsdata.obj + 0002:00002dc4 ??_C@_15ODEHAHHF@?$AAA?$AAM@ 0000000180040dc4 libucrt:nlsdata.obj + 0002:00002dcc ??_C@_15CLMNNGEL@?$AAP?$AAM@ 0000000180040dcc libucrt:nlsdata.obj + 0002:00002dd8 ??_C@_1BC@IEBCMHCM@?$AAM?$AAM?$AA?1?$AAd?$AAd?$AA?1?$AAy?$AAy@ 0000000180040dd8 libucrt:nlsdata.obj + 0002:00002df0 ??_C@_1CI@KNAKOEBC@?$AAd?$AAd?$AAd?$AAd?$AA?0?$AA?5?$AAM?$AAM?$AAM?$AAM?$AA?5?$AAd?$AAd?$AA?0?$AA?5@ 0000000180040df0 libucrt:nlsdata.obj + 0002:00002e18 ??_C@_1BC@GDGBMEMK@?$AAH?$AAH?$AA?3?$AAm?$AAm?$AA?3?$AAs?$AAs@ 0000000180040e18 libucrt:nlsdata.obj + 0002:00002e30 ??_C@_1M@BMHNFIME@?$AAe?$AAn?$AA?9?$AAU?$AAS@ 0000000180040e30 libucrt:nlsdata.obj + 0002:00002e60 ??_C@_1M@HPNHIDJI@?$AAj?$AAa?$AA?9?$AAJ?$AAP@ 0000000180040e60 libucrt:mbctype.obj + 0002:00002e70 ??_C@_1M@BIBDDEMK@?$AAz?$AAh?$AA?9?$AAC?$AAN@ 0000000180040e70 libucrt:mbctype.obj + 0002:00002e80 ??_C@_1M@JLOOOEGK@?$AAk?$AAo?$AA?9?$AAK?$AAR@ 0000000180040e80 libucrt:mbctype.obj + 0002:00002e90 ??_C@_1M@CLNBBOPM@?$AAz?$AAh?$AA?9?$AAT?$AAW@ 0000000180040e90 libucrt:mbctype.obj + 0002:00002ea0 __newctype 0000000180040ea0 libucrt:ctype.obj + 0002:000031a0 __newclmap 00000001800411a0 libucrt:ctype.obj + 0002:00003320 __newcumap 0000000180041320 libucrt:ctype.obj + 0002:000034a0 _wctype 00000001800414a0 libucrt:ctype.obj + 0002:000044f0 ??_C@_15EMKDOKLE@?$AAa?$AAr@ 00000001800424f0 libucrt:lcidtoname_downlevel.obj + 0002:000044f8 ??_C@_15KNPADPLH@?$AAb?$AAg@ 00000001800424f8 libucrt:lcidtoname_downlevel.obj + 0002:00004500 ??_C@_15EDMHLDMO@?$AAc?$AAa@ 0000000180042500 libucrt:lcidtoname_downlevel.obj + 0002:00004508 ??_C@_1O@BPEAJADD@?$AAz?$AAh?$AA?9?$AAC?$AAH?$AAS@ 0000000180042508 libucrt:lcidtoname_downlevel.obj + 0002:00004518 ??_C@_15LJNHCMNK@?$AAc?$AAs@ 0000000180042518 libucrt:lcidtoname_downlevel.obj + 0002:00004520 ??_C@_15FOMCIDHG@?$AAd?$AAa@ 0000000180042520 libucrt:lcidtoname_downlevel.obj + 0002:00004528 ??_C@_15NBKABECB@?$AAd?$AAe@ 0000000180042528 libucrt:lcidtoname_downlevel.obj + 0002:00004530 ??_C@_15GHPEIIAO@?$AAe?$AAl@ 0000000180042530 libucrt:lcidtoname_downlevel.obj + 0002:00004538 ??_C@_15MNPNEAIF@?$AAe?$AAn@ 0000000180042538 libucrt:lcidtoname_downlevel.obj + 0002:00004540 ??_C@_15GPIOMPMH@?$AAe?$AAs@ 0000000180042540 libucrt:lcidtoname_downlevel.obj + 0002:00004548 ??_C@_15NGLOAKJC@?$AAf?$AAi@ 0000000180042548 libucrt:lcidtoname_downlevel.obj + 0002:00004550 ??_C@_15FBKGNKAM@?$AAf?$AAr@ 0000000180042550 libucrt:lcidtoname_downlevel.obj + 0002:00004558 ??_C@_15KGGCNEFK@?$AAh?$AAe@ 0000000180042558 libucrt:lcidtoname_downlevel.obj + 0002:00004560 ??_C@_15PGHLIDMF@?$AAh?$AAu@ 0000000180042560 libucrt:lcidtoname_downlevel.obj + 0002:00004568 ??_C@_15BIEMAPLM@?$AAi?$AAs@ 0000000180042568 libucrt:lcidtoname_downlevel.obj + 0002:00004570 ??_C@_15IFJLDHAF@?$AAi?$AAt@ 0000000180042570 libucrt:lcidtoname_downlevel.obj + 0002:00004578 ??_C@_15GEMIOCAG@?$AAj?$AAa@ 0000000180042578 libucrt:lcidtoname_downlevel.obj + 0002:00004580 ??_C@_15EPELEGJA@?$AAk?$AAo@ 0000000180042580 libucrt:lcidtoname_downlevel.obj + 0002:00004588 ??_C@_15NDDHIMN@?$AAn?$AAl@ 0000000180042588 libucrt:lcidtoname_downlevel.obj + 0002:00004590 ??_C@_15BPIGNHCD@?$AAn?$AAo@ 0000000180042590 libucrt:lcidtoname_downlevel.obj + 0002:00004598 ??_C@_15DEOPBLCG@?$AAp?$AAl@ 0000000180042598 libucrt:lcidtoname_downlevel.obj + 0002:000045a0 ??_C@_15KBECGEFG@?$AAp?$AAt@ 00000001800425a0 libucrt:lcidtoname_downlevel.obj + 0002:000045a8 ??_C@_15GLJCBFMD@?$AAr?$AAo@ 00000001800425a8 libucrt:lcidtoname_downlevel.obj + 0002:000045b0 ??_C@_15FEDGKCDI@?$AAr?$AAu@ 00000001800425b0 libucrt:lcidtoname_downlevel.obj + 0002:000045b8 ??_C@_15GLKMLLHM@?$AAh?$AAr@ 00000001800425b8 libucrt:lcidtoname_downlevel.obj + 0002:000045c0 ??_C@_15CPKMFBDB@?$AAs?$AAk@ 00000001800425c0 libucrt:lcidtoname_downlevel.obj + 0002:000045c8 ??_C@_15BAAIOGMK@?$AAs?$AAq@ 00000001800425c8 libucrt:lcidtoname_downlevel.obj + 0002:000045d0 ??_C@_15INNPNOHD@?$AAs?$AAv@ 00000001800425d0 libucrt:lcidtoname_downlevel.obj + 0002:000045d8 ??_C@_15CABMMOGH@?$AAt?$AAh@ 00000001800425d8 libucrt:lcidtoname_downlevel.obj + 0002:000045e0 ??_C@_15BPLIHJJM@?$AAt?$AAr@ 00000001800425e0 libucrt:lcidtoname_downlevel.obj + 0002:000045e8 ??_C@_15NEOEKKDJ@?$AAu?$AAr@ 00000001800425e8 libucrt:lcidtoname_downlevel.obj + 0002:000045f0 ??_C@_15NFICGAJK@?$AAi?$AAd@ 00000001800425f0 libucrt:lcidtoname_downlevel.obj + 0002:000045f8 ??_C@_15PJPFLCCM@?$AAu?$AAk@ 00000001800425f8 libucrt:lcidtoname_downlevel.obj + 0002:00004600 ??_C@_15HPJPHDM@?$AAb?$AAe@ 0000000180042600 libucrt:lcidtoname_downlevel.obj + 0002:00004608 ??_C@_15LCHLGJII@?$AAs?$AAl@ 0000000180042608 libucrt:lcidtoname_downlevel.obj + 0002:00004610 ??_C@_15PCFJPHHO@?$AAe?$AAt@ 0000000180042610 libucrt:lcidtoname_downlevel.obj + 0002:00004618 ??_C@_15HPFPGODN@?$AAl?$AAv@ 0000000180042618 libucrt:lcidtoname_downlevel.obj + 0002:00004620 ??_C@_15NFFGKGLG@?$AAl?$AAt@ 0000000180042620 libucrt:lcidtoname_downlevel.obj + 0002:00004628 ??_C@_15BDAKCCHN@?$AAf?$AAa@ 0000000180042628 libucrt:lcidtoname_downlevel.obj + 0002:00004630 ??_C@_15NFGIAIAJ@?$AAv?$AAi@ 0000000180042630 libucrt:lcidtoname_downlevel.obj + 0002:00004638 ??_C@_15LMKNDMHN@?$AAh?$AAy@ 0000000180042638 libucrt:lcidtoname_downlevel.obj + 0002:00004640 ??_C@_15IJBHMCFL@?$AAa?$AAz@ 0000000180042640 libucrt:lcidtoname_downlevel.obj + 0002:00004648 ??_C@_15EKOFJABL@?$AAe?$AAu@ 0000000180042648 libucrt:lcidtoname_downlevel.obj + 0002:00004650 ??_C@_15BGHADCNK@?$AAm?$AAk@ 0000000180042650 libucrt:lcidtoname_downlevel.obj + 0002:00004658 ??_C@_15JDNICKHM@?$AAa?$AAf@ 0000000180042658 libucrt:lcidtoname_downlevel.obj + 0002:00004660 ??_C@_15KPJEDBKD@?$AAk?$AAa@ 0000000180042660 libucrt:lcidtoname_downlevel.obj + 0002:00004668 ??_C@_15PDNFFFEO@?$AAf?$AAo@ 0000000180042668 libucrt:lcidtoname_downlevel.obj + 0002:00004670 ??_C@_15OMLEGLOC@?$AAh?$AAi@ 0000000180042670 libucrt:lcidtoname_downlevel.obj + 0002:00004678 ??_C@_15IDNNENKK@?$AAm?$AAs@ 0000000180042678 libucrt:lcidtoname_downlevel.obj + 0002:00004680 ??_C@_15MACJNBMH@?$AAk?$AAk@ 0000000180042680 libucrt:lcidtoname_downlevel.obj + 0002:00004688 ??_C@_15DKDJEOND@?$AAk?$AAy@ 0000000180042688 libucrt:lcidtoname_downlevel.obj + 0002:00004690 ??_C@_15DFGDLJBG@?$AAs?$AAw@ 0000000180042690 libucrt:lcidtoname_downlevel.obj + 0002:00004698 ??_C@_15BBFAICNG@?$AAu?$AAz@ 0000000180042698 libucrt:lcidtoname_downlevel.obj + 0002:000046a0 ??_C@_15DKNDCGEA@?$AAt?$AAt@ 00000001800426a0 libucrt:lcidtoname_downlevel.obj + 0002:000046a8 ??_C@_15MGIFMDPL@?$AAp?$AAa@ 00000001800426a8 libucrt:lcidtoname_downlevel.obj + 0002:000046b0 ??_C@_15HCNDBBA@?$AAg?$AAu@ 00000001800426b0 libucrt:lcidtoname_downlevel.obj + 0002:000046b8 ??_C@_15FNBEIBON@?$AAt?$AAa@ 00000001800426b8 libucrt:lcidtoname_downlevel.obj + 0002:000046c0 ??_C@_15NCHGBGLK@?$AAt?$AAe@ 00000001800426c0 libucrt:lcidtoname_downlevel.obj + 0002:000046c8 ??_C@_15PHPHCBPF@?$AAk?$AAn@ 00000001800426c8 libucrt:lcidtoname_downlevel.obj + 0002:000046d0 ??_C@_15DLGBCKMP@?$AAm?$AAr@ 00000001800426d0 libucrt:lcidtoname_downlevel.obj + 0002:000046d8 ??_C@_15EABBLBFF@?$AAs?$AAa@ 00000001800426d8 libucrt:lcidtoname_downlevel.obj + 0002:000046e0 ??_C@_15CBKOMCOI@?$AAm?$AAn@ 00000001800426e0 libucrt:lcidtoname_downlevel.obj + 0002:000046e8 ??_C@_15CKDMCJAF@?$AAg?$AAl@ 00000001800426e8 libucrt:lcidtoname_downlevel.obj + 0002:000046f0 ??_C@_17CNJFBPG@?$AAk?$AAo?$AAk@ 00000001800426f0 libucrt:lcidtoname_downlevel.obj + 0002:000046f8 ??_C@_17FFBJICPL@?$AAs?$AAy?$AAr@ 00000001800426f8 libucrt:lcidtoname_downlevel.obj + 0002:00004700 ??_C@_17KPNDCPAF@?$AAd?$AAi?$AAv@ 0000000180042700 libucrt:lcidtoname_downlevel.obj + 0002:00004708 ??_C@_11LOCGONAA@@ 0000000180042708 libucrt:lcidtoname_downlevel.obj + 0002:00004710 ??_C@_1M@OKAHONE@?$AAa?$AAr?$AA?9?$AAS?$AAA@ 0000000180042710 libucrt:lcidtoname_downlevel.obj + 0002:00004720 ??_C@_1M@FFFIGIGK@?$AAb?$AAg?$AA?9?$AAB?$AAG@ 0000000180042720 libucrt:lcidtoname_downlevel.obj + 0002:00004730 ??_C@_1M@BJNKEDC@?$AAc?$AAa?$AA?9?$AAE?$AAS@ 0000000180042730 libucrt:lcidtoname_downlevel.obj + 0002:00004740 ??_C@_1M@IJJHFJHA@?$AAc?$AAs?$AA?9?$AAC?$AAZ@ 0000000180042740 libucrt:lcidtoname_downlevel.obj + 0002:00004750 ??_C@_1M@CLPEOBGI@?$AAd?$AAa?$AA?9?$AAD?$AAK@ 0000000180042750 libucrt:lcidtoname_downlevel.obj + 0002:00004760 ??_C@_1M@MCMADGCB@?$AAd?$AAe?$AA?9?$AAD?$AAE@ 0000000180042760 libucrt:lcidtoname_downlevel.obj + 0002:00004770 ??_C@_1M@OOCKEMAM@?$AAe?$AAl?$AA?9?$AAG?$AAR@ 0000000180042770 libucrt:lcidtoname_downlevel.obj + 0002:00004780 ??_C@_1M@DDNJFGID@?$AAf?$AAi?$AA?9?$AAF?$AAI@ 0000000180042780 libucrt:lcidtoname_downlevel.obj + 0002:00004790 ??_C@_1M@GLIPPMAC@?$AAf?$AAr?$AA?9?$AAF?$AAR@ 0000000180042790 libucrt:lcidtoname_downlevel.obj + 0002:000047a0 ??_C@_1M@GFMCHPE@?$AAh?$AAe?$AA?9?$AAI?$AAL@ 00000001800427a0 libucrt:lcidtoname_downlevel.obj + 0002:000047b0 ??_C@_1M@MHLPGNKM@?$AAh?$AAu?$AA?9?$AAH?$AAU@ 00000001800427b0 libucrt:lcidtoname_downlevel.obj + 0002:000047c0 ??_C@_1M@LPDDNNPN@?$AAi?$AAs?$AA?9?$AAI?$AAS@ 00000001800427c0 libucrt:lcidtoname_downlevel.obj + 0002:000047d0 ??_C@_1M@MADIPODN@?$AAi?$AAt?$AA?9?$AAI?$AAT@ 00000001800427d0 libucrt:lcidtoname_downlevel.obj + 0002:000047e0 ??_C@_1M@IHBJJGG@?$AAn?$AAl?$AA?9?$AAN?$AAL@ 00000001800427e0 libucrt:lcidtoname_downlevel.obj + 0002:000047f0 ??_C@_1M@EANAGDL@?$AAn?$AAb?$AA?9?$AAN?$AAO@ 00000001800427f0 libucrt:lcidtoname_downlevel.obj + 0002:00004800 ??_C@_1M@NEIEMEGP@?$AAp?$AAl?$AA?9?$AAP?$AAL@ 0000000180042800 libucrt:lcidtoname_downlevel.obj + 0002:00004810 ??_C@_1M@BOCFIGEP@?$AAp?$AAt?$AA?9?$AAB?$AAR@ 0000000180042810 libucrt:lcidtoname_downlevel.obj + 0002:00004820 ??_C@_1M@IMPFOPBG@?$AAr?$AAo?$AA?9?$AAR?$AAO@ 0000000180042820 libucrt:lcidtoname_downlevel.obj + 0002:00004830 ??_C@_1M@IDNNEJMM@?$AAr?$AAu?$AA?9?$AAR?$AAU@ 0000000180042830 libucrt:lcidtoname_downlevel.obj + 0002:00004840 ??_C@_1M@LILEEOGM@?$AAh?$AAr?$AA?9?$AAH?$AAR@ 0000000180042840 libucrt:lcidtoname_downlevel.obj + 0002:00004850 ??_C@_1M@FKIFEHPB@?$AAs?$AAk?$AA?9?$AAS?$AAK@ 0000000180042850 libucrt:lcidtoname_downlevel.obj + 0002:00004860 ??_C@_1M@LJMAMNPJ@?$AAs?$AAq?$AA?9?$AAA?$AAL@ 0000000180042860 libucrt:lcidtoname_downlevel.obj + 0002:00004870 ??_C@_1M@GIAKDKJK@?$AAs?$AAv?$AA?9?$AAS?$AAE@ 0000000180042870 libucrt:lcidtoname_downlevel.obj + 0002:00004880 ??_C@_1M@MKJKIKCL@?$AAt?$AAh?$AA?9?$AAT?$AAH@ 0000000180042880 libucrt:lcidtoname_downlevel.obj + 0002:00004890 ??_C@_1M@MFLCCMPB@?$AAt?$AAr?$AA?9?$AAT?$AAR@ 0000000180042890 libucrt:lcidtoname_downlevel.obj + 0002:000048a0 ??_C@_1M@OIJHDKJN@?$AAu?$AAr?$AA?9?$AAP?$AAK@ 00000001800428a0 libucrt:lcidtoname_downlevel.obj + 0002:000048b0 ??_C@_1M@LHIPCIEK@?$AAi?$AAd?$AA?9?$AAI?$AAD@ 00000001800428b0 libucrt:lcidtoname_downlevel.obj + 0002:000048c0 ??_C@_1M@MFMOBGI@?$AAu?$AAk?$AA?9?$AAU?$AAA@ 00000001800428c0 libucrt:lcidtoname_downlevel.obj + 0002:000048d0 ??_C@_1M@OBGLJIPL@?$AAb?$AAe?$AA?9?$AAB?$AAY@ 00000001800428d0 libucrt:lcidtoname_downlevel.obj + 0002:000048e0 ??_C@_1M@BCFAJEAD@?$AAs?$AAl?$AA?9?$AAS?$AAI@ 00000001800428e0 libucrt:lcidtoname_downlevel.obj + 0002:000048f0 ??_C@_1M@FKFFEDDN@?$AAe?$AAt?$AA?9?$AAE?$AAE@ 00000001800428f0 libucrt:lcidtoname_downlevel.obj + 0002:00004900 ??_C@_1M@KGKKAACI@?$AAl?$AAv?$AA?9?$AAL?$AAV@ 0000000180042900 libucrt:lcidtoname_downlevel.obj + 0002:00004910 ??_C@_1M@IFGBIJO@?$AAl?$AAt?$AA?9?$AAL?$AAT@ 0000000180042910 libucrt:lcidtoname_downlevel.obj + 0002:00004920 ??_C@_1M@FGEAHEDM@?$AAf?$AAa?$AA?9?$AAI?$AAR@ 0000000180042920 libucrt:lcidtoname_downlevel.obj + 0002:00004930 ??_C@_1M@KBMAIBFN@?$AAv?$AAi?$AA?9?$AAV?$AAN@ 0000000180042930 libucrt:lcidtoname_downlevel.obj + 0002:00004940 ??_C@_1M@GPCBKDJK@?$AAh?$AAy?$AA?9?$AAA?$AAM@ 0000000180042940 libucrt:lcidtoname_downlevel.obj + 0002:00004950 ??_C@_1BG@BECMDDJB@?$AAa?$AAz?$AA?9?$AAA?$AAZ?$AA?9?$AAL?$AAa?$AAt?$AAn@ 0000000180042950 libucrt:lcidtoname_downlevel.obj + 0002:00004968 ??_C@_1M@MAOFCAEA@?$AAe?$AAu?$AA?9?$AAE?$AAS@ 0000000180042968 libucrt:lcidtoname_downlevel.obj + 0002:00004978 ??_C@_1M@IGHABKPI@?$AAm?$AAk?$AA?9?$AAM?$AAK@ 0000000180042978 libucrt:lcidtoname_downlevel.obj + 0002:00004988 ??_C@_1M@IAIGNEJG@?$AAt?$AAn?$AA?9?$AAZ?$AAA@ 0000000180042988 libucrt:lcidtoname_downlevel.obj + 0002:00004998 ??_C@_1M@IIJCOJFA@?$AAx?$AAh?$AA?9?$AAZ?$AAA@ 0000000180042998 libucrt:lcidtoname_downlevel.obj + 0002:000049a8 ??_C@_1M@LGPJHNJH@?$AAz?$AAu?$AA?9?$AAZ?$AAA@ 00000001800429a8 libucrt:lcidtoname_downlevel.obj + 0002:000049b8 ??_C@_1M@HOKAOIO@?$AAa?$AAf?$AA?9?$AAZ?$AAA@ 00000001800429b8 libucrt:lcidtoname_downlevel.obj + 0002:000049c8 ??_C@_1M@DPCLHLIE@?$AAk?$AAa?$AA?9?$AAG?$AAE@ 00000001800429c8 libucrt:lcidtoname_downlevel.obj + 0002:000049d8 ??_C@_1M@BLKMHJBI@?$AAf?$AAo?$AA?9?$AAF?$AAO@ 00000001800429d8 libucrt:lcidtoname_downlevel.obj + 0002:000049e8 ??_C@_1M@LGGJAPPB@?$AAh?$AAi?$AA?9?$AAI?$AAN@ 00000001800429e8 libucrt:lcidtoname_downlevel.obj + 0002:000049f8 ??_C@_1M@FIKPIHFE@?$AAm?$AAt?$AA?9?$AAM?$AAT@ 00000001800429f8 libucrt:lcidtoname_downlevel.obj + 0002:00004a08 ??_C@_1M@HEGGPBFA@?$AAs?$AAe?$AA?9?$AAN?$AAO@ 0000000180042a08 libucrt:lcidtoname_downlevel.obj + 0002:00004a18 ??_C@_1M@EIBJEEPA@?$AAm?$AAs?$AA?9?$AAM?$AAY@ 0000000180042a18 libucrt:lcidtoname_downlevel.obj + 0002:00004a28 ??_C@_1M@FHLBGMPP@?$AAk?$AAk?$AA?9?$AAK?$AAZ@ 0000000180042a28 libucrt:lcidtoname_downlevel.obj + 0002:00004a38 ??_C@_1M@NGJJLCGI@?$AAk?$AAy?$AA?9?$AAK?$AAG@ 0000000180042a38 libucrt:lcidtoname_downlevel.obj + 0002:00004a48 ??_C@_1M@GIENNBFC@?$AAs?$AAw?$AA?9?$AAK?$AAE@ 0000000180042a48 libucrt:lcidtoname_downlevel.obj + 0002:00004a58 ??_C@_1BG@NDGMJIMJ@?$AAu?$AAz?$AA?9?$AAU?$AAZ?$AA?9?$AAL?$AAa?$AAt?$AAn@ 0000000180042a58 libucrt:lcidtoname_downlevel.obj + 0002:00004a70 ??_C@_1M@IDCCIHBC@?$AAt?$AAt?$AA?9?$AAR?$AAU@ 0000000180042a70 libucrt:lcidtoname_downlevel.obj + 0002:00004a80 ??_C@_1M@LOICPMOJ@?$AAb?$AAn?$AA?9?$AAI?$AAN@ 0000000180042a80 libucrt:lcidtoname_downlevel.obj + 0002:00004a90 ??_C@_1M@KPKKNEAH@?$AAp?$AAa?$AA?9?$AAI?$AAN@ 0000000180042a90 libucrt:lcidtoname_downlevel.obj + 0002:00004aa0 ??_C@_1M@PJGPPBOG@?$AAg?$AAu?$AA?9?$AAI?$AAN@ 0000000180042aa0 libucrt:lcidtoname_downlevel.obj + 0002:00004ab0 ??_C@_1M@KMKMOPHI@?$AAt?$AAa?$AA?9?$AAI?$AAN@ 0000000180042ab0 libucrt:lcidtoname_downlevel.obj + 0002:00004ac0 ??_C@_1M@KFEHEPAC@?$AAt?$AAe?$AA?9?$AAI?$AAN@ 0000000180042ac0 libucrt:lcidtoname_downlevel.obj + 0002:00004ad0 ??_C@_1M@CDCLMGHI@?$AAk?$AAn?$AA?9?$AAI?$AAN@ 0000000180042ad0 libucrt:lcidtoname_downlevel.obj + 0002:00004ae0 ??_C@_1M@MIODLDKF@?$AAm?$AAl?$AA?9?$AAI?$AAN@ 0000000180042ae0 libucrt:lcidtoname_downlevel.obj + 0002:00004af0 ??_C@_1M@PBIEACPO@?$AAm?$AAr?$AA?9?$AAI?$AAN@ 0000000180042af0 libucrt:lcidtoname_downlevel.obj + 0002:00004b00 ??_C@_1M@NIDEAGPH@?$AAs?$AAa?$AA?9?$AAI?$AAN@ 0000000180042b00 libucrt:lcidtoname_downlevel.obj + 0002:00004b10 ??_C@_1M@FHIHCBIO@?$AAm?$AAn?$AA?9?$AAM?$AAN@ 0000000180042b10 libucrt:lcidtoname_downlevel.obj + 0002:00004b20 ??_C@_1M@JAIJPENP@?$AAc?$AAy?$AA?9?$AAG?$AAB@ 0000000180042b20 libucrt:lcidtoname_downlevel.obj + 0002:00004b30 ??_C@_1M@PHGFBEPN@?$AAg?$AAl?$AA?9?$AAE?$AAS@ 0000000180042b30 libucrt:lcidtoname_downlevel.obj + 0002:00004b40 ??_C@_1O@KPIPDNCP@?$AAk?$AAo?$AAk?$AA?9?$AAI?$AAN@ 0000000180042b40 libucrt:lcidtoname_downlevel.obj + 0002:00004b50 ??_C@_1O@KNHJLDJA@?$AAs?$AAy?$AAr?$AA?9?$AAS?$AAY@ 0000000180042b50 libucrt:lcidtoname_downlevel.obj + 0002:00004b60 ??_C@_1O@MKEKBLAH@?$AAd?$AAi?$AAv?$AA?9?$AAM?$AAV@ 0000000180042b60 libucrt:lcidtoname_downlevel.obj + 0002:00004b70 ??_C@_1O@OHDCKDDF@?$AAq?$AAu?$AAz?$AA?9?$AAB?$AAO@ 0000000180042b70 libucrt:lcidtoname_downlevel.obj + 0002:00004b80 ??_C@_1M@LEPJNLFD@?$AAn?$AAs?$AA?9?$AAZ?$AAA@ 0000000180042b80 libucrt:lcidtoname_downlevel.obj + 0002:00004b90 ??_C@_1M@OMLEIIJB@?$AAm?$AAi?$AA?9?$AAN?$AAZ@ 0000000180042b90 libucrt:lcidtoname_downlevel.obj + 0002:00004ba0 ??_C@_1M@PMPEAILG@?$AAa?$AAr?$AA?9?$AAI?$AAQ@ 0000000180042ba0 libucrt:lcidtoname_downlevel.obj + 0002:00004bb0 ??_C@_1M@CNKPNOEE@?$AAd?$AAe?$AA?9?$AAC?$AAH@ 0000000180042bb0 libucrt:lcidtoname_downlevel.obj + 0002:00004bc0 ??_C@_1M@LKMGMLKO@?$AAe?$AAn?$AA?9?$AAG?$AAB@ 0000000180042bc0 libucrt:lcidtoname_downlevel.obj + 0002:00004bd0 ??_C@_1M@PGKJFFGL@?$AAe?$AAs?$AA?9?$AAM?$AAX@ 0000000180042bd0 libucrt:lcidtoname_downlevel.obj + 0002:00004be0 ??_C@_1M@DNNANBDC@?$AAf?$AAr?$AA?9?$AAB?$AAE@ 0000000180042be0 libucrt:lcidtoname_downlevel.obj + 0002:00004bf0 ??_C@_1M@HLGMDFHM@?$AAi?$AAt?$AA?9?$AAC?$AAH@ 0000000180042bf0 libucrt:lcidtoname_downlevel.obj + 0002:00004c00 ??_C@_1M@CLLBGJH@?$AAn?$AAl?$AA?9?$AAB?$AAE@ 0000000180042c00 libucrt:lcidtoname_downlevel.obj + 0002:00004c10 ??_C@_1M@BODBOGLF@?$AAn?$AAn?$AA?9?$AAN?$AAO@ 0000000180042c10 libucrt:lcidtoname_downlevel.obj + 0002:00004c20 ??_C@_1M@HFFAHKAD@?$AAp?$AAt?$AA?9?$AAP?$AAT@ 0000000180042c20 libucrt:lcidtoname_downlevel.obj + 0002:00004c30 ??_C@_1BG@LNOAKHIE@?$AAs?$AAr?$AA?9?$AAS?$AAP?$AA?9?$AAL?$AAa?$AAt?$AAn@ 0000000180042c30 libucrt:lcidtoname_downlevel.obj + 0002:00004c48 ??_C@_1M@HBMHBGAK@?$AAs?$AAv?$AA?9?$AAF?$AAI@ 0000000180042c48 libucrt:lcidtoname_downlevel.obj + 0002:00004c58 ??_C@_1BG@DGCJGJBE@?$AAa?$AAz?$AA?9?$AAA?$AAZ?$AA?9?$AAC?$AAy?$AAr?$AAl@ 0000000180042c58 libucrt:lcidtoname_downlevel.obj + 0002:00004c70 ??_C@_1M@KEJDAAHB@?$AAs?$AAe?$AA?9?$AAS?$AAE@ 0000000180042c70 libucrt:lcidtoname_downlevel.obj + 0002:00004c80 ??_C@_1M@HEIBJJAD@?$AAm?$AAs?$AA?9?$AAB?$AAN@ 0000000180042c80 libucrt:lcidtoname_downlevel.obj + 0002:00004c90 ??_C@_1BG@PBGJMCEM@?$AAu?$AAz?$AA?9?$AAU?$AAZ?$AA?9?$AAC?$AAy?$AAr?$AAl@ 0000000180042c90 libucrt:lcidtoname_downlevel.obj + 0002:00004ca8 ??_C@_1O@LAOBCMDF@?$AAq?$AAu?$AAz?$AA?9?$AAE?$AAC@ 0000000180042ca8 libucrt:lcidtoname_downlevel.obj + 0002:00004cb8 ??_C@_1M@POEEMAIO@?$AAa?$AAr?$AA?9?$AAE?$AAG@ 0000000180042cb8 libucrt:lcidtoname_downlevel.obj + 0002:00004cc8 ??_C@_1M@EFAKDEDL@?$AAz?$AAh?$AA?9?$AAH?$AAK@ 0000000180042cc8 libucrt:lcidtoname_downlevel.obj + 0002:00004cd8 ??_C@_1M@HKKIJHGI@?$AAd?$AAe?$AA?9?$AAA?$AAT@ 0000000180042cd8 libucrt:lcidtoname_downlevel.obj + 0002:00004ce8 ??_C@_1M@KBFBEHJF@?$AAe?$AAn?$AA?9?$AAA?$AAU@ 0000000180042ce8 libucrt:lcidtoname_downlevel.obj + 0002:00004cf8 ??_C@_1M@MNPLFAAH@?$AAe?$AAs?$AA?9?$AAE?$AAS@ 0000000180042cf8 libucrt:lcidtoname_downlevel.obj + 0002:00004d08 ??_C@_1M@HJOOJFMA@?$AAf?$AAr?$AA?9?$AAC?$AAA@ 0000000180042d08 libucrt:lcidtoname_downlevel.obj + 0002:00004d18 ??_C@_1BG@JPOFPNAB@?$AAs?$AAr?$AA?9?$AAS?$AAP?$AA?9?$AAC?$AAy?$AAr?$AAl@ 0000000180042d18 libucrt:lcidtoname_downlevel.obj + 0002:00004d30 ??_C@_1M@LNFOCMOB@?$AAs?$AAe?$AA?9?$AAF?$AAI@ 0000000180042d30 libucrt:lcidtoname_downlevel.obj + 0002:00004d40 ??_C@_1O@MGJBOAMB@?$AAq?$AAu?$AAz?$AA?9?$AAP?$AAE@ 0000000180042d40 libucrt:lcidtoname_downlevel.obj + 0002:00004d50 ??_C@_1M@GJINLBOK@?$AAa?$AAr?$AA?9?$AAL?$AAY@ 0000000180042d50 libucrt:lcidtoname_downlevel.obj + 0002:00004d60 ??_C@_1M@GGMNHJNL@?$AAz?$AAh?$AA?9?$AAS?$AAG@ 0000000180042d60 libucrt:lcidtoname_downlevel.obj + 0002:00004d70 ??_C@_1M@HOIKODND@?$AAd?$AAe?$AA?9?$AAL?$AAU@ 0000000180042d70 libucrt:lcidtoname_downlevel.obj + 0002:00004d80 ??_C@_1M@DDOCCGFG@?$AAe?$AAn?$AA?9?$AAC?$AAA@ 0000000180042d80 libucrt:lcidtoname_downlevel.obj + 0002:00004d90 ??_C@_1M@BNOEMJLF@?$AAe?$AAs?$AA?9?$AAG?$AAT@ 0000000180042d90 libucrt:lcidtoname_downlevel.obj + 0002:00004da0 ??_C@_1M@EOGNKEK@?$AAf?$AAr?$AA?9?$AAC?$AAH@ 0000000180042da0 libucrt:lcidtoname_downlevel.obj + 0002:00004db0 ??_C@_1M@FLIDJFHL@?$AAh?$AAr?$AA?9?$AAB?$AAA@ 0000000180042db0 libucrt:lcidtoname_downlevel.obj + 0002:00004dc0 ??_C@_1O@FMCELNAJ@?$AAs?$AAm?$AAj?$AA?9?$AAN?$AAO@ 0000000180042dc0 libucrt:lcidtoname_downlevel.obj + 0002:00004dd0 ??_C@_1M@JHGLJMGJ@?$AAa?$AAr?$AA?9?$AAD?$AAZ@ 0000000180042dd0 libucrt:lcidtoname_downlevel.obj + 0002:00004de0 ??_C@_1M@JKKFDCNP@?$AAz?$AAh?$AA?9?$AAM?$AAO@ 0000000180042de0 libucrt:lcidtoname_downlevel.obj + 0002:00004df0 ??_C@_1M@GEEFALPE@?$AAd?$AAe?$AA?9?$AAL?$AAI@ 0000000180042df0 libucrt:lcidtoname_downlevel.obj + 0002:00004e00 ??_C@_1M@IGEOFBG@?$AAe?$AAn?$AA?9?$AAN?$AAZ@ 0000000180042e00 libucrt:lcidtoname_downlevel.obj + 0002:00004e10 ??_C@_1M@KDBONEHP@?$AAe?$AAs?$AA?9?$AAC?$AAR@ 0000000180042e10 libucrt:lcidtoname_downlevel.obj + 0002:00004e20 ??_C@_1M@FHMDOHNN@?$AAf?$AAr?$AA?9?$AAL?$AAU@ 0000000180042e20 libucrt:lcidtoname_downlevel.obj + 0002:00004e30 ??_C@_1BG@NFKKMAFG@?$AAb?$AAs?$AA?9?$AAB?$AAA?$AA?9?$AAL?$AAa?$AAt?$AAn@ 0000000180042e30 libucrt:lcidtoname_downlevel.obj + 0002:00004e48 ??_C@_1O@IMNBEMCI@?$AAs?$AAm?$AAj?$AA?9?$AAS?$AAE@ 0000000180042e48 libucrt:lcidtoname_downlevel.obj + 0002:00004e58 ??_C@_1M@DHHMBNDP@?$AAa?$AAr?$AA?9?$AAM?$AAA@ 0000000180042e58 libucrt:lcidtoname_downlevel.obj + 0002:00004e68 ??_C@_1M@BNBLJCGH@?$AAe?$AAn?$AA?9?$AAI?$AAE@ 0000000180042e68 libucrt:lcidtoname_downlevel.obj + 0002:00004e78 ??_C@_1M@GEPAFMDL@?$AAe?$AAs?$AA?9?$AAP?$AAA@ 0000000180042e78 libucrt:lcidtoname_downlevel.obj + 0002:00004e88 ??_C@_1M@OJONDMDL@?$AAf?$AAr?$AA?9?$AAM?$AAC@ 0000000180042e88 libucrt:lcidtoname_downlevel.obj + 0002:00004e98 ??_C@_1BG@OBCNFJB@?$AAs?$AAr?$AA?9?$AAB?$AAA?$AA?9?$AAL?$AAa?$AAt?$AAn@ 0000000180042e98 libucrt:lcidtoname_downlevel.obj + 0002:00004eb0 ??_C@_1O@KEMEEGPO@?$AAs?$AAm?$AAa?$AA?9?$AAN?$AAO@ 0000000180042eb0 libucrt:lcidtoname_downlevel.obj + 0002:00004ec0 ??_C@_1M@ELMGFODK@?$AAa?$AAr?$AA?9?$AAT?$AAN@ 0000000180042ec0 libucrt:lcidtoname_downlevel.obj + 0002:00004ed0 ??_C@_1M@BHDLHFAF@?$AAe?$AAn?$AA?9?$AAZ?$AAA@ 0000000180042ed0 libucrt:lcidtoname_downlevel.obj + 0002:00004ee0 ??_C@_1M@BMGIGLIF@?$AAe?$AAs?$AA?9?$AAD?$AAO@ 0000000180042ee0 libucrt:lcidtoname_downlevel.obj + 0002:00004ef0 ??_C@_1BG@CMBHIPBE@?$AAs?$AAr?$AA?9?$AAB?$AAA?$AA?9?$AAC?$AAy?$AAr?$AAl@ 0000000180042ef0 libucrt:lcidtoname_downlevel.obj + 0002:00004f08 ??_C@_1O@HEDBLHNP@?$AAs?$AAm?$AAa?$AA?9?$AAS?$AAE@ 0000000180042f08 libucrt:lcidtoname_downlevel.obj + 0002:00004f18 ??_C@_1M@DAGCADIM@?$AAa?$AAr?$AA?9?$AAO?$AAM@ 0000000180042f18 libucrt:lcidtoname_downlevel.obj + 0002:00004f28 ??_C@_1M@FODLMICG@?$AAe?$AAn?$AA?9?$AAJ?$AAM@ 0000000180042f28 libucrt:lcidtoname_downlevel.obj + 0002:00004f38 ??_C@_1M@DNMLCIHB@?$AAe?$AAs?$AA?9?$AAV?$AAE@ 0000000180042f38 libucrt:lcidtoname_downlevel.obj + 0002:00004f48 ??_C@_1O@EOKHMKJK@?$AAs?$AAm?$AAs?$AA?9?$AAF?$AAI@ 0000000180042f48 libucrt:lcidtoname_downlevel.obj + 0002:00004f58 ??_C@_1M@CAFJMKOF@?$AAa?$AAr?$AA?9?$AAY?$AAE@ 0000000180042f58 libucrt:lcidtoname_downlevel.obj + 0002:00004f68 ??_C@_1M@CBFHIJLI@?$AAe?$AAn?$AA?9?$AAC?$AAB@ 0000000180042f68 libucrt:lcidtoname_downlevel.obj + 0002:00004f78 ??_C@_1M@BGNFLDN@?$AAe?$AAs?$AA?9?$AAC?$AAO@ 0000000180042f78 libucrt:lcidtoname_downlevel.obj + 0002:00004f88 ??_C@_1O@JMPHMAMC@?$AAs?$AAm?$AAn?$AA?9?$AAF?$AAI@ 0000000180042f88 libucrt:lcidtoname_downlevel.obj + 0002:00004f98 ??_C@_1M@JLANABKE@?$AAa?$AAr?$AA?9?$AAS?$AAY@ 0000000180042f98 libucrt:lcidtoname_downlevel.obj + 0002:00004fa8 ??_C@_1M@HPKGCFGN@?$AAe?$AAn?$AA?9?$AAB?$AAZ@ 0000000180042fa8 libucrt:lcidtoname_downlevel.obj + 0002:00004fb8 ??_C@_1M@OLJCMLGM@?$AAe?$AAs?$AA?9?$AAP?$AAE@ 0000000180042fb8 libucrt:lcidtoname_downlevel.obj + 0002:00004fc8 ??_C@_1M@MKKGFKLE@?$AAa?$AAr?$AA?9?$AAJ?$AAO@ 0000000180042fc8 libucrt:lcidtoname_downlevel.obj + 0002:00004fd8 ??_C@_1M@EKPGLDNI@?$AAe?$AAn?$AA?9?$AAT?$AAT@ 0000000180042fd8 libucrt:lcidtoname_downlevel.obj + 0002:00004fe8 ??_C@_1M@OONGHFHE@?$AAe?$AAs?$AA?9?$AAA?$AAR@ 0000000180042fe8 libucrt:lcidtoname_downlevel.obj + 0002:00004ff8 ??_C@_1M@OOJFGBHE@?$AAa?$AAr?$AA?9?$AAL?$AAB@ 0000000180042ff8 libucrt:lcidtoname_downlevel.obj + 0002:00005008 ??_C@_1M@GCEJHNEG@?$AAe?$AAn?$AA?9?$AAZ?$AAW@ 0000000180043008 libucrt:lcidtoname_downlevel.obj + 0002:00005018 ??_C@_1M@JNOCAHJI@?$AAe?$AAs?$AA?9?$AAE?$AAC@ 0000000180043018 libucrt:lcidtoname_downlevel.obj + 0002:00005028 ??_C@_1M@JEFHPGGB@?$AAa?$AAr?$AA?9?$AAK?$AAW@ 0000000180043028 libucrt:lcidtoname_downlevel.obj + 0002:00005038 ??_C@_1M@MLKIBJOJ@?$AAe?$AAn?$AA?9?$AAP?$AAH@ 0000000180043038 libucrt:lcidtoname_downlevel.obj + 0002:00005048 ??_C@_1M@BDNIPEND@?$AAe?$AAs?$AA?9?$AAC?$AAL@ 0000000180043048 libucrt:lcidtoname_downlevel.obj + 0002:00005058 ??_C@_1M@MPNMEKBD@?$AAa?$AAr?$AA?9?$AAA?$AAE@ 0000000180043058 libucrt:lcidtoname_downlevel.obj + 0002:00005068 ??_C@_1M@KBJALCPI@?$AAe?$AAs?$AA?9?$AAU?$AAY@ 0000000180043068 libucrt:lcidtoname_downlevel.obj + 0002:00005078 ??_C@_1M@LLCCOAGA@?$AAa?$AAr?$AA?9?$AAB?$AAH@ 0000000180043078 libucrt:lcidtoname_downlevel.obj + 0002:00005088 ??_C@_1M@PBFNCDEL@?$AAe?$AAs?$AA?9?$AAP?$AAY@ 0000000180043088 libucrt:lcidtoname_downlevel.obj + 0002:00005098 ??_C@_1M@EDGINPNP@?$AAa?$AAr?$AA?9?$AAQ?$AAA@ 0000000180043098 libucrt:lcidtoname_downlevel.obj + 0002:000050a8 ??_C@_1M@MKDBIIJI@?$AAe?$AAs?$AA?9?$AAB?$AAO@ 00000001800430a8 libucrt:lcidtoname_downlevel.obj + 0002:000050b8 ??_C@_1M@CPKKEBLD@?$AAe?$AAs?$AA?9?$AAS?$AAV@ 00000001800430b8 libucrt:lcidtoname_downlevel.obj + 0002:000050c8 ??_C@_1M@NDBGMMJL@?$AAe?$AAs?$AA?9?$AAH?$AAN@ 00000001800430c8 libucrt:lcidtoname_downlevel.obj + 0002:000050d8 ??_C@_1M@JIJIBHDP@?$AAe?$AAs?$AA?9?$AAN?$AAI@ 00000001800430d8 libucrt:lcidtoname_downlevel.obj + 0002:000050e8 ??_C@_1M@CGFMKEEK@?$AAe?$AAs?$AA?9?$AAP?$AAR@ 00000001800430e8 libucrt:lcidtoname_downlevel.obj + 0002:000050f8 ??_C@_1O@ICJHKIIK@?$AAz?$AAh?$AA?9?$AAC?$AAH?$AAT@ 00000001800430f8 libucrt:lcidtoname_downlevel.obj + 0002:00005108 ??_C@_15CLNEJCE@?$AAs?$AAr@ 0000000180043108 libucrt:lcidtoname_downlevel.obj + 0002:00005f50 ??_C@_1M@KAHEKEIG@?$AAa?$AAf?$AA?9?$AAz?$AAa@ 0000000180043f50 libucrt:lcidtoname_downlevel.obj + 0002:00005f60 ??_C@_1M@GIECOABL@?$AAa?$AAr?$AA?9?$AAa?$AAe@ 0000000180043f60 libucrt:lcidtoname_downlevel.obj + 0002:00005f70 ??_C@_1M@BMLMEKGI@?$AAa?$AAr?$AA?9?$AAb?$AAh@ 0000000180043f70 libucrt:lcidtoname_downlevel.obj + 0002:00005f80 ??_C@_1M@DAPFDGGB@?$AAa?$AAr?$AA?9?$AAd?$AAz@ 0000000180043f80 libucrt:lcidtoname_downlevel.obj + 0002:00005f90 ??_C@_1M@FJNKGKIG@?$AAa?$AAr?$AA?9?$AAe?$AAg@ 0000000180043f90 libucrt:lcidtoname_downlevel.obj + 0002:00005fa0 ??_C@_1M@FLGKKCLO@?$AAa?$AAr?$AA?9?$AAi?$AAq@ 0000000180043fa0 libucrt:lcidtoname_downlevel.obj + 0002:00005fb0 ??_C@_1M@GNDIPALM@?$AAa?$AAr?$AA?9?$AAj?$AAo@ 0000000180043fb0 libucrt:lcidtoname_downlevel.obj + 0002:00005fc0 ??_C@_1M@DDMJFMGJ@?$AAa?$AAr?$AA?9?$AAk?$AAw@ 0000000180043fc0 libucrt:lcidtoname_downlevel.obj + 0002:00005fd0 ??_C@_1M@EJALMLHM@?$AAa?$AAr?$AA?9?$AAl?$AAb@ 0000000180043fd0 libucrt:lcidtoname_downlevel.obj + 0002:00005fe0 ??_C@_1M@MOBDBLOC@?$AAa?$AAr?$AA?9?$AAl?$AAy@ 0000000180043fe0 libucrt:lcidtoname_downlevel.obj + 0002:00005ff0 ??_C@_1M@JAOCLHDH@?$AAa?$AAr?$AA?9?$AAm?$AAa@ 0000000180043ff0 libucrt:lcidtoname_downlevel.obj + 0002:00006000 ??_C@_1M@JHPMKJIE@?$AAa?$AAr?$AA?9?$AAo?$AAm@ 0000000180044000 libucrt:lcidtoname_downlevel.obj + 0002:00006010 ??_C@_1M@OEPGHFNH@?$AAa?$AAr?$AA?9?$AAq?$AAa@ 0000000180044010 libucrt:lcidtoname_downlevel.obj + 0002:00006020 ??_C@_1M@KJDONENM@?$AAa?$AAr?$AA?9?$AAs?$AAa@ 0000000180044020 libucrt:lcidtoname_downlevel.obj + 0002:00006030 ??_C@_1M@DMJDKLKM@?$AAa?$AAr?$AA?9?$AAs?$AAy@ 0000000180044030 libucrt:lcidtoname_downlevel.obj + 0002:00006040 ??_C@_1M@OMFIPEDC@?$AAa?$AAr?$AA?9?$AAt?$AAn@ 0000000180044040 libucrt:lcidtoname_downlevel.obj + 0002:00006050 ??_C@_1M@IHMHGAON@?$AAa?$AAr?$AA?9?$AAy?$AAe@ 0000000180044050 libucrt:lcidtoname_downlevel.obj + 0002:00006060 ??_C@_1BG@KDCPGJGB@?$AAa?$AAz?$AA?9?$AAa?$AAz?$AA?9?$AAc?$AAy?$AAr?$AAl@ 0000000180044060 libucrt:lcidtoname_downlevel.obj + 0002:00006078 ??_C@_1BG@IBCKDDOE@?$AAa?$AAz?$AA?9?$AAa?$AAz?$AA?9?$AAl?$AAa?$AAt?$AAn@ 0000000180044078 libucrt:lcidtoname_downlevel.obj + 0002:00006090 ??_C@_1M@EGPFDCPD@?$AAb?$AAe?$AA?9?$AAb?$AAy@ 0000000180044090 libucrt:lcidtoname_downlevel.obj + 0002:000060a0 ??_C@_1M@PCMGMCGC@?$AAb?$AAg?$AA?9?$AAb?$AAg@ 00000001800440a0 libucrt:lcidtoname_downlevel.obj + 0002:000060b0 ??_C@_1M@BJBMFGOB@?$AAb?$AAn?$AA?9?$AAi?$AAn@ 00000001800440b0 libucrt:lcidtoname_downlevel.obj + 0002:000060c0 ??_C@_1BG@EAKMMACD@?$AAb?$AAs?$AA?9?$AAb?$AAa?$AA?9?$AAl?$AAa?$AAt?$AAn@ 00000001800440c0 libucrt:lcidtoname_downlevel.obj + 0002:000060d8 ??_C@_1M@KGADAODK@?$AAc?$AAa?$AA?9?$AAe?$AAs@ 00000001800440d8 libucrt:lcidtoname_downlevel.obj + 0002:000060e8 ??_C@_1M@COAJPDHI@?$AAc?$AAs?$AA?9?$AAc?$AAz@ 00000001800440e8 libucrt:lcidtoname_downlevel.obj + 0002:000060f8 ??_C@_1M@DHBHFONH@?$AAc?$AAy?$AA?9?$AAg?$AAb@ 00000001800440f8 libucrt:lcidtoname_downlevel.obj + 0002:00006108 ??_C@_1M@IMGKELGA@?$AAd?$AAa?$AA?9?$AAd?$AAk@ 0000000180044108 libucrt:lcidtoname_downlevel.obj + 0002:00006118 ??_C@_1M@NNDGDNGA@?$AAd?$AAe?$AA?9?$AAa?$AAt@ 0000000180044118 libucrt:lcidtoname_downlevel.obj + 0002:00006128 ??_C@_1M@IKDBHEEM@?$AAd?$AAe?$AA?9?$AAc?$AAh@ 0000000180044128 libucrt:lcidtoname_downlevel.obj + 0002:00006138 ??_C@_1M@GFFOJMCJ@?$AAd?$AAe?$AA?9?$AAd?$AAe@ 0000000180044138 libucrt:lcidtoname_downlevel.obj + 0002:00006148 ??_C@_1M@MDNLKBPM@?$AAd?$AAe?$AA?9?$AAl?$AAi@ 0000000180044148 libucrt:lcidtoname_downlevel.obj + 0002:00006158 ??_C@_1M@NJBEEJNL@?$AAd?$AAe?$AA?9?$AAl?$AAu@ 0000000180044158 libucrt:lcidtoname_downlevel.obj + 0002:00006168 ??_C@_1O@GNNELBAP@?$AAd?$AAi?$AAv?$AA?9?$AAm?$AAv@ 0000000180044168 libucrt:lcidtoname_downlevel.obj + 0002:00006178 ??_C@_1M@EJLEOGAE@?$AAe?$AAl?$AA?9?$AAg?$AAr@ 0000000180044178 libucrt:lcidtoname_downlevel.obj + 0002:00006188 ??_C@_1M@GMPONJN@?$AAe?$AAn?$AA?9?$AAa?$AAu@ 0000000180044188 libucrt:lcidtoname_downlevel.obj + 0002:00006198 ??_C@_1M@NIDIIPGF@?$AAe?$AAn?$AA?9?$AAb?$AAz@ 0000000180044198 libucrt:lcidtoname_downlevel.obj + 0002:000061a8 ??_C@_1M@JEHMIMFO@?$AAe?$AAn?$AA?9?$AAc?$AAa@ 00000001800441a8 libucrt:lcidtoname_downlevel.obj + 0002:000061b8 ??_C@_1M@IGMJCDLA@?$AAe?$AAn?$AA?9?$AAc?$AAb@ 00000001800441b8 libucrt:lcidtoname_downlevel.obj + 0002:000061c8 ??_C@_1M@BNFIGBKG@?$AAe?$AAn?$AA?9?$AAg?$AAb@ 00000001800441c8 libucrt:lcidtoname_downlevel.obj + 0002:000061d8 ??_C@_1M@LKIFDIGP@?$AAe?$AAn?$AA?9?$AAi?$AAe@ 00000001800441d8 libucrt:lcidtoname_downlevel.obj + 0002:000061e8 ??_C@_1M@PJKFGCCO@?$AAe?$AAn?$AA?9?$AAj?$AAm@ 00000001800441e8 libucrt:lcidtoname_downlevel.obj + 0002:000061f8 ??_C@_1M@KPPKEPBO@?$AAe?$AAn?$AA?9?$AAn?$AAz@ 00000001800441f8 libucrt:lcidtoname_downlevel.obj + 0002:00006208 ??_C@_1M@GMDGLDOB@?$AAe?$AAn?$AA?9?$AAp?$AAh@ 0000000180044208 libucrt:lcidtoname_downlevel.obj + 0002:00006218 ??_C@_1M@ONGIBJNA@?$AAe?$AAn?$AA?9?$AAt?$AAt@ 0000000180044218 libucrt:lcidtoname_downlevel.obj + 0002:00006228 ??_C@_1M@LLODPCMM@?$AAe?$AAn?$AA?9?$AAu?$AAs@ 0000000180044228 libucrt:lcidtoname_downlevel.obj + 0002:00006238 ??_C@_1M@LAKFNPAN@?$AAe?$AAn?$AA?9?$AAz?$AAa@ 0000000180044238 libucrt:lcidtoname_downlevel.obj + 0002:00006248 ??_C@_1M@MFNHNHEO@?$AAe?$AAn?$AA?9?$AAz?$AAw@ 0000000180044248 libucrt:lcidtoname_downlevel.obj + 0002:00006258 ??_C@_1M@EJEINPHM@?$AAe?$AAs?$AA?9?$AAa?$AAr@ 0000000180044258 libucrt:lcidtoname_downlevel.obj + 0002:00006268 ??_C@_1M@GNKPCCJA@?$AAe?$AAs?$AA?9?$AAb?$AAo@ 0000000180044268 libucrt:lcidtoname_downlevel.obj + 0002:00006278 ??_C@_1M@LEEGFONL@?$AAe?$AAs?$AA?9?$AAc?$AAl@ 0000000180044278 libucrt:lcidtoname_downlevel.obj + 0002:00006288 ??_C@_1M@KGPDPBDF@?$AAe?$AAs?$AA?9?$AAc?$AAo@ 0000000180044288 libucrt:lcidtoname_downlevel.obj + 0002:00006298 ??_C@_1M@EIAHOHH@?$AAe?$AAs?$AA?9?$AAc?$AAr@ 0000000180044298 libucrt:lcidtoname_downlevel.obj + 0002:000062a8 ??_C@_1M@LLPGMBIN@?$AAe?$AAs?$AA?9?$AAd?$AAo@ 00000001800442a8 libucrt:lcidtoname_downlevel.obj + 0002:000062b8 ??_C@_1M@DKHMKNJA@?$AAe?$AAs?$AA?9?$AAe?$AAc@ 00000001800442b8 libucrt:lcidtoname_downlevel.obj + 0002:000062c8 ??_C@_1M@GKGFPKAP@?$AAe?$AAs?$AA?9?$AAe?$AAs@ 00000001800442c8 libucrt:lcidtoname_downlevel.obj + 0002:000062d8 ??_C@_1M@LKHKGDLN@?$AAe?$AAs?$AA?9?$AAg?$AAt@ 00000001800442d8 libucrt:lcidtoname_downlevel.obj + 0002:000062e8 ??_C@_1M@HEIIGGJD@?$AAe?$AAs?$AA?9?$AAh?$AAn@ 00000001800442e8 libucrt:lcidtoname_downlevel.obj + 0002:000062f8 ??_C@_1M@FBDHPPGD@?$AAe?$AAs?$AA?9?$AAm?$AAx@ 00000001800442f8 libucrt:lcidtoname_downlevel.obj + 0002:00006308 ??_C@_1M@DPAGLNDH@?$AAe?$AAs?$AA?9?$AAn?$AAi@ 0000000180044308 libucrt:lcidtoname_downlevel.obj + 0002:00006318 ??_C@_1M@MDGOPGDD@?$AAe?$AAs?$AA?9?$AAp?$AAa@ 0000000180044318 libucrt:lcidtoname_downlevel.obj + 0002:00006328 ??_C@_1M@EMAMGBGE@?$AAe?$AAs?$AA?9?$AAp?$AAe@ 0000000180044328 libucrt:lcidtoname_downlevel.obj + 0002:00006338 ??_C@_1M@IBMCAOEC@?$AAe?$AAs?$AA?9?$AAp?$AAr@ 0000000180044338 libucrt:lcidtoname_downlevel.obj + 0002:00006348 ??_C@_1M@FGMDIJED@?$AAe?$AAs?$AA?9?$AAp?$AAy@ 0000000180044348 libucrt:lcidtoname_downlevel.obj + 0002:00006358 ??_C@_1M@IIDEOLLL@?$AAe?$AAs?$AA?9?$AAs?$AAv@ 0000000180044358 libucrt:lcidtoname_downlevel.obj + 0002:00006368 ??_C@_1M@GAOBIPA@?$AAe?$AAs?$AA?9?$AAu?$AAy@ 0000000180044368 libucrt:lcidtoname_downlevel.obj + 0002:00006378 ??_C@_1M@JKFFICHJ@?$AAe?$AAs?$AA?9?$AAv?$AAe@ 0000000180044378 libucrt:lcidtoname_downlevel.obj + 0002:00006388 ??_C@_1M@PNMLOJDF@?$AAe?$AAt?$AA?9?$AAe?$AAe@ 0000000180044388 libucrt:lcidtoname_downlevel.obj + 0002:00006398 ??_C@_1M@GHHLIKEI@?$AAe?$AAu?$AA?9?$AAe?$AAs@ 0000000180044398 libucrt:lcidtoname_downlevel.obj + 0002:000063a8 ??_C@_1M@PBNONODE@?$AAf?$AAa?$AA?9?$AAi?$AAr@ 00000001800443a8 libucrt:lcidtoname_downlevel.obj + 0002:000063b8 ??_C@_1M@JEEHPMIL@?$AAf?$AAi?$AA?9?$AAf?$AAi@ 00000001800443b8 libucrt:lcidtoname_downlevel.obj + 0002:000063c8 ??_C@_1M@LMDCNDBA@?$AAf?$AAo?$AA?9?$AAf?$AAo@ 00000001800443c8 libucrt:lcidtoname_downlevel.obj + 0002:000063d8 ??_C@_1M@JKEOHLDK@?$AAf?$AAr?$AA?9?$AAb?$AAe@ 00000001800443d8 libucrt:lcidtoname_downlevel.obj + 0002:000063e8 ??_C@_1M@NOHADPMI@?$AAf?$AAr?$AA?9?$AAc?$AAa@ 00000001800443e8 libucrt:lcidtoname_downlevel.obj + 0002:000063f8 ??_C@_1M@KDHIHAEC@?$AAf?$AAr?$AA?9?$AAc?$AAh@ 00000001800443f8 libucrt:lcidtoname_downlevel.obj + 0002:00006408 ??_C@_1M@MMBBFGAK@?$AAf?$AAr?$AA?9?$AAf?$AAr@ 0000000180044408 libucrt:lcidtoname_downlevel.obj + 0002:00006418 ??_C@_1M@PAFNENNF@?$AAf?$AAr?$AA?9?$AAl?$AAu@ 0000000180044418 libucrt:lcidtoname_downlevel.obj + 0002:00006428 ??_C@_1M@EOHDJGDD@?$AAf?$AAr?$AA?9?$AAm?$AAc@ 0000000180044428 libucrt:lcidtoname_downlevel.obj + 0002:00006438 ??_C@_1M@FAPLLOPF@?$AAg?$AAl?$AA?9?$AAe?$AAs@ 0000000180044438 libucrt:lcidtoname_downlevel.obj + 0002:00006448 ??_C@_1M@FOPBFLOO@?$AAg?$AAu?$AA?9?$AAi?$AAn@ 0000000180044448 libucrt:lcidtoname_downlevel.obj + 0002:00006458 ??_C@_1M@KBMCINPM@?$AAh?$AAe?$AA?9?$AAi?$AAl@ 0000000180044458 libucrt:lcidtoname_downlevel.obj + 0002:00006468 ??_C@_1M@BBPHKFPJ@?$AAh?$AAi?$AA?9?$AAi?$AAn@ 0000000180044468 libucrt:lcidtoname_downlevel.obj + 0002:00006478 ??_C@_1M@PMBNDPHD@?$AAh?$AAr?$AA?9?$AAb?$AAa@ 0000000180044478 libucrt:lcidtoname_downlevel.obj + 0002:00006488 ??_C@_1M@BPCKOEGE@?$AAh?$AAr?$AA?9?$AAh?$AAr@ 0000000180044488 libucrt:lcidtoname_downlevel.obj + 0002:00006498 ??_C@_1M@GACBMHKE@?$AAh?$AAu?$AA?9?$AAh?$AAu@ 0000000180044498 libucrt:lcidtoname_downlevel.obj + 0002:000064a8 ??_C@_1M@MILPAJJC@?$AAh?$AAy?$AA?9?$AAa?$AAm@ 00000001800444a8 libucrt:lcidtoname_downlevel.obj + 0002:000064b8 ??_C@_1M@BABBICEC@?$AAi?$AAd?$AA?9?$AAi?$AAd@ 00000001800444b8 libucrt:lcidtoname_downlevel.obj + 0002:000064c8 ??_C@_1M@BIKNHHPF@?$AAi?$AAs?$AA?9?$AAi?$AAs@ 00000001800444c8 libucrt:lcidtoname_downlevel.obj + 0002:000064d8 ??_C@_1M@NMPCJPHE@?$AAi?$AAt?$AA?9?$AAc?$AAh@ 00000001800444d8 libucrt:lcidtoname_downlevel.obj + 0002:000064e8 ??_C@_1M@GHKGFEDF@?$AAi?$AAt?$AA?9?$AAi?$AAt@ 00000001800444e8 libucrt:lcidtoname_downlevel.obj + 0002:000064f8 ??_C@_1M@NIEJCJJA@?$AAj?$AAa?$AA?9?$AAj?$AAp@ 00000001800444f8 libucrt:lcidtoname_downlevel.obj + 0002:00006508 ??_C@_1M@JILFNBIM@?$AAk?$AAa?$AA?9?$AAg?$AAe@ 0000000180044508 libucrt:lcidtoname_downlevel.obj + 0002:00006518 ??_C@_1M@PACPMGPH@?$AAk?$AAk?$AA?9?$AAk?$AAz@ 0000000180044518 libucrt:lcidtoname_downlevel.obj + 0002:00006528 ??_C@_1M@IELFGMHA@?$AAk?$AAn?$AA?9?$AAi?$AAn@ 0000000180044528 libucrt:lcidtoname_downlevel.obj + 0002:00006538 ??_C@_1O@IBBJHCH@?$AAk?$AAo?$AAk?$AA?9?$AAi?$AAn@ 0000000180044538 libucrt:lcidtoname_downlevel.obj + 0002:00006548 ??_C@_1M@DMHAEOGC@?$AAk?$AAo?$AA?9?$AAk?$AAr@ 0000000180044548 libucrt:lcidtoname_downlevel.obj + 0002:00006558 ??_C@_1M@HBAHBIGA@?$AAk?$AAy?$AA?9?$AAk?$AAg@ 0000000180044558 libucrt:lcidtoname_downlevel.obj + 0002:00006568 ??_C@_1M@KPMILCJG@?$AAl?$AAt?$AA?9?$AAl?$AAt@ 0000000180044568 libucrt:lcidtoname_downlevel.obj + 0002:00006578 ??_C@_1M@BDEKKCA@?$AAl?$AAv?$AA?9?$AAl?$AAv@ 0000000180044578 libucrt:lcidtoname_downlevel.obj + 0002:00006588 ??_C@_1M@ELCKCCJJ@?$AAm?$AAi?$AA?9?$AAn?$AAz@ 0000000180044588 libucrt:lcidtoname_downlevel.obj + 0002:00006598 ??_C@_1M@CBOOLAPA@?$AAm?$AAk?$AA?9?$AAm?$AAk@ 0000000180044598 libucrt:lcidtoname_downlevel.obj + 0002:000065a8 ??_C@_1M@GPHNBJKN@?$AAm?$AAl?$AA?9?$AAi?$AAn@ 00000001800445a8 libucrt:lcidtoname_downlevel.obj + 0002:000065b8 ??_C@_1M@PABJILIG@?$AAm?$AAn?$AA?9?$AAm?$AAn@ 00000001800445b8 libucrt:lcidtoname_downlevel.obj + 0002:000065c8 ??_C@_1M@FGBKKIPG@?$AAm?$AAr?$AA?9?$AAi?$AAn@ 00000001800445c8 libucrt:lcidtoname_downlevel.obj + 0002:000065d8 ??_C@_1M@NDBPDDAL@?$AAm?$AAs?$AA?9?$AAb?$AAn@ 00000001800445d8 libucrt:lcidtoname_downlevel.obj + 0002:000065e8 ??_C@_1M@OPIHOOPI@?$AAm?$AAs?$AA?9?$AAm?$AAy@ 00000001800445e8 libucrt:lcidtoname_downlevel.obj + 0002:000065f8 ??_C@_1M@PPDBCNFM@?$AAm?$AAt?$AA?9?$AAm?$AAt@ 00000001800445f8 libucrt:lcidtoname_downlevel.obj + 0002:00006608 ??_C@_1M@KDJDKMDD@?$AAn?$AAb?$AA?9?$AAn?$AAo@ 0000000180044608 libucrt:lcidtoname_downlevel.obj + 0002:00006618 ??_C@_1M@KFCFLMJP@?$AAn?$AAl?$AA?9?$AAb?$AAe@ 0000000180044618 libucrt:lcidtoname_downlevel.obj + 0002:00006628 ??_C@_1M@KPOPDDGO@?$AAn?$AAl?$AA?9?$AAn?$AAl@ 0000000180044628 libucrt:lcidtoname_downlevel.obj + 0002:00006638 ??_C@_1M@LJKPEMLN@?$AAn?$AAn?$AA?9?$AAn?$AAo@ 0000000180044638 libucrt:lcidtoname_downlevel.obj + 0002:00006648 ??_C@_1M@BDGHHBFL@?$AAn?$AAs?$AA?9?$AAz?$AAa@ 0000000180044648 libucrt:lcidtoname_downlevel.obj + 0002:00006658 ??_C@_1M@IDEHOAP@?$AAp?$AAa?$AA?9?$AAi?$AAn@ 0000000180044658 libucrt:lcidtoname_downlevel.obj + 0002:00006668 ??_C@_1M@HDBKGOGH@?$AAp?$AAl?$AA?9?$AAp?$AAl@ 0000000180044668 libucrt:lcidtoname_downlevel.obj + 0002:00006678 ??_C@_1M@LJLLCMEH@?$AAp?$AAt?$AA?9?$AAb?$AAr@ 0000000180044678 libucrt:lcidtoname_downlevel.obj + 0002:00006688 ??_C@_1M@NCMONAAL@?$AAp?$AAt?$AA?9?$AAp?$AAt@ 0000000180044688 libucrt:lcidtoname_downlevel.obj + 0002:00006698 ??_C@_1O@EAKMAJDN@?$AAq?$AAu?$AAz?$AA?9?$AAb?$AAo@ 0000000180044698 libucrt:lcidtoname_downlevel.obj + 0002:000066a8 ??_C@_1O@BHHPIGDN@?$AAq?$AAu?$AAz?$AA?9?$AAe?$AAc@ 00000001800446a8 libucrt:lcidtoname_downlevel.obj + 0002:000066b8 ??_C@_1O@GBAPEKMJ@?$AAq?$AAu?$AAz?$AA?9?$AAp?$AAe@ 00000001800446b8 libucrt:lcidtoname_downlevel.obj + 0002:000066c8 ??_C@_1M@CLGLEFBO@?$AAr?$AAo?$AA?9?$AAr?$AAo@ 00000001800446c8 libucrt:lcidtoname_downlevel.obj + 0002:000066d8 ??_C@_1M@CEEDODME@?$AAr?$AAu?$AA?9?$AAr?$AAu@ 00000001800446d8 libucrt:lcidtoname_downlevel.obj + 0002:000066e8 ??_C@_1M@HPKKKMPP@?$AAs?$AAa?$AA?9?$AAi?$AAn@ 00000001800446e8 libucrt:lcidtoname_downlevel.obj + 0002:000066f8 ??_C@_1M@BKMAIGOJ@?$AAs?$AAe?$AA?9?$AAf?$AAi@ 00000001800446f8 libucrt:lcidtoname_downlevel.obj + 0002:00006708 ??_C@_1M@NDPIFLFI@?$AAs?$AAe?$AA?9?$AAn?$AAo@ 0000000180044708 libucrt:lcidtoname_downlevel.obj + 0002:00006718 ??_C@_1M@DANKKHJ@?$AAs?$AAe?$AA?9?$AAs?$AAe@ 0000000180044718 libucrt:lcidtoname_downlevel.obj + 0002:00006728 ??_C@_1M@PNBLONPJ@?$AAs?$AAk?$AA?9?$AAs?$AAk@ 0000000180044728 libucrt:lcidtoname_downlevel.obj + 0002:00006738 ??_C@_1M@LFMODOAL@?$AAs?$AAl?$AA?9?$AAs?$AAi@ 0000000180044738 libucrt:lcidtoname_downlevel.obj + 0002:00006748 ??_C@_1O@DFKOMPG@?$AAs?$AAm?$AAa?$AA?9?$AAn?$AAo@ 0000000180044748 libucrt:lcidtoname_downlevel.obj + 0002:00006758 ??_C@_1O@NDKPBNNH@?$AAs?$AAm?$AAa?$AA?9?$AAs?$AAe@ 0000000180044758 libucrt:lcidtoname_downlevel.obj + 0002:00006768 ??_C@_1O@PLLKBHAB@?$AAs?$AAm?$AAj?$AA?9?$AAn?$AAo@ 0000000180044768 libucrt:lcidtoname_downlevel.obj + 0002:00006778 ??_C@_1O@CLEPOGCA@?$AAs?$AAm?$AAj?$AA?9?$AAs?$AAe@ 0000000180044778 libucrt:lcidtoname_downlevel.obj + 0002:00006788 ??_C@_1O@DLGJGKMK@?$AAs?$AAm?$AAn?$AA?9?$AAf?$AAi@ 0000000180044788 libucrt:lcidtoname_downlevel.obj + 0002:00006798 ??_C@_1O@OJDJGAJC@?$AAs?$AAm?$AAs?$AA?9?$AAf?$AAi@ 0000000180044798 libucrt:lcidtoname_downlevel.obj + 0002:000067a8 ??_C@_1M@BOFOGHPB@?$AAs?$AAq?$AA?9?$AAa?$AAl@ 00000001800447a8 libucrt:lcidtoname_downlevel.obj + 0002:000067b8 ??_C@_1BG@LJBBIPGB@?$AAs?$AAr?$AA?9?$AAb?$AAa?$AA?9?$AAc?$AAy?$AAr?$AAl@ 00000001800447b8 libucrt:lcidtoname_downlevel.obj + 0002:000067d0 ??_C@_1BG@JLBENFOE@?$AAs?$AAr?$AA?9?$AAb?$AAa?$AA?9?$AAl?$AAa?$AAt?$AAn@ 00000001800447d0 libucrt:lcidtoname_downlevel.obj + 0002:000067e8 ??_C@_1BG@KODPNHE@?$AAs?$AAr?$AA?9?$AAs?$AAp?$AA?9?$AAc?$AAy?$AAr?$AAl@ 00000001800447e8 libucrt:lcidtoname_downlevel.obj + 0002:00006800 ??_C@_1BG@CIOGKHPB@?$AAs?$AAr?$AA?9?$AAs?$AAp?$AA?9?$AAl?$AAa?$AAt?$AAn@ 0000000180044800 libucrt:lcidtoname_downlevel.obj + 0002:00006818 ??_C@_1M@NGFJLMAC@?$AAs?$AAv?$AA?9?$AAf?$AAi@ 0000000180044818 libucrt:lcidtoname_downlevel.obj + 0002:00006828 ??_C@_1M@MPJEJAJC@?$AAs?$AAv?$AA?9?$AAs?$AAe@ 0000000180044828 libucrt:lcidtoname_downlevel.obj + 0002:00006838 ??_C@_1M@MPNDHLFK@?$AAs?$AAw?$AA?9?$AAk?$AAe@ 0000000180044838 libucrt:lcidtoname_downlevel.obj + 0002:00006848 ??_C@_1O@KOHBJJI@?$AAs?$AAy?$AAr?$AA?9?$AAs?$AAy@ 0000000180044848 libucrt:lcidtoname_downlevel.obj + 0002:00006858 ??_C@_1M@LDCEFHA@?$AAt?$AAa?$AA?9?$AAi?$AAn@ 0000000180044858 libucrt:lcidtoname_downlevel.obj + 0002:00006868 ??_C@_1M@CNJOFAK@?$AAt?$AAe?$AA?9?$AAi?$AAn@ 0000000180044868 libucrt:lcidtoname_downlevel.obj + 0002:00006878 ??_C@_1M@GNAECACD@?$AAt?$AAh?$AA?9?$AAt?$AAh@ 0000000180044878 libucrt:lcidtoname_downlevel.obj + 0002:00006888 ??_C@_1M@CHBIHOJO@?$AAt?$AAn?$AA?9?$AAz?$AAa@ 0000000180044888 libucrt:lcidtoname_downlevel.obj + 0002:00006898 ??_C@_1M@GCCMIGPJ@?$AAt?$AAr?$AA?9?$AAt?$AAr@ 0000000180044898 libucrt:lcidtoname_downlevel.obj + 0002:000068a8 ??_C@_1M@CELMCNBK@?$AAt?$AAt?$AA?9?$AAr?$AAu@ 00000001800448a8 libucrt:lcidtoname_downlevel.obj + 0002:000068b8 ??_C@_1M@KLMCELGA@?$AAu?$AAk?$AA?9?$AAu?$AAa@ 00000001800448b8 libucrt:lcidtoname_downlevel.obj + 0002:000068c8 ??_C@_1M@EPAJJAJF@?$AAu?$AAr?$AA?9?$AAp?$AAk@ 00000001800448c8 libucrt:lcidtoname_downlevel.obj + 0002:000068d8 ??_C@_1BG@GEGPMCDJ@?$AAu?$AAz?$AA?9?$AAu?$AAz?$AA?9?$AAc?$AAy?$AAr?$AAl@ 00000001800448d8 libucrt:lcidtoname_downlevel.obj + 0002:000068f0 ??_C@_1BG@EGGKJILM@?$AAu?$AAz?$AA?9?$AAu?$AAz?$AA?9?$AAl?$AAa?$AAt?$AAn@ 00000001800448f0 libucrt:lcidtoname_downlevel.obj + 0002:00006908 ??_C@_1M@GFOCLFF@?$AAv?$AAi?$AA?9?$AAv?$AAn@ 0000000180044908 libucrt:lcidtoname_downlevel.obj + 0002:00006918 ??_C@_1M@CPAMEDFI@?$AAx?$AAh?$AA?9?$AAz?$AAa@ 0000000180044918 libucrt:lcidtoname_downlevel.obj + 0002:00006928 ??_C@_1O@EBKIFIGN@?$AAz?$AAh?$AA?9?$AAc?$AAh?$AAs@ 0000000180044928 libucrt:lcidtoname_downlevel.obj + 0002:00006938 ??_C@_1O@NMHPGANE@?$AAz?$AAh?$AA?9?$AAc?$AAh?$AAt@ 0000000180044938 libucrt:lcidtoname_downlevel.obj + 0002:00006948 ??_C@_1M@LPINJOMC@?$AAz?$AAh?$AA?9?$AAc?$AAn@ 0000000180044948 libucrt:lcidtoname_downlevel.obj + 0002:00006958 ??_C@_1M@OCJEJODD@?$AAz?$AAh?$AA?9?$AAh?$AAk@ 0000000180044958 libucrt:lcidtoname_downlevel.obj + 0002:00006968 ??_C@_1M@DNDLJINH@?$AAz?$AAh?$AA?9?$AAm?$AAo@ 0000000180044968 libucrt:lcidtoname_downlevel.obj + 0002:00006978 ??_C@_1M@MBFDNDND@?$AAz?$AAh?$AA?9?$AAs?$AAg@ 0000000180044978 libucrt:lcidtoname_downlevel.obj + 0002:00006988 ??_C@_1M@IMEPLEPE@?$AAz?$AAh?$AA?9?$AAt?$AAw@ 0000000180044988 libucrt:lcidtoname_downlevel.obj + 0002:00006998 ??_C@_1M@BBGHNHJP@?$AAz?$AAu?$AA?9?$AAz?$AAa@ 0000000180044998 libucrt:lcidtoname_downlevel.obj + 0002:000069b0 ?large_power_data@?1??multiply_by_power_of_ten@__crt_strtox@@YA_NAEAUbig_integer@2@I@Z@4QBIB 00000001800449b0 libucrt:cfout.obj + 0002:00007358 ?small_powers_of_ten@?1??multiply_by_power_of_ten@__crt_strtox@@YA_NAEAUbig_integer@2@I@Z@4QBIB 0000000180045358 libucrt:cfout.obj + 0002:0000737c ??_C@_01GBGANLPD@0@ 000000018004537c libucrt:cfout.obj + 0002:00007380 ??_C@_05DNEBIAHO@1?$CDINF@ 0000000180045380 libucrt:cfout.obj + 0002:00007388 ??_C@_06IMKFLFPG@1?$CDQNAN@ 0000000180045388 libucrt:cfout.obj + 0002:00007390 ??_C@_06PGGFOGJG@1?$CDSNAN@ 0000000180045390 libucrt:cfout.obj + 0002:00007398 ??_C@_05PHHOCPM@1?$CDIND@ 0000000180045398 libucrt:cfout.obj + 0002:000073a0 ??_C@_05HGHHAHAP@log10@ 00000001800453a0 libucrt:fpexcept.obj + 0002:00007610 ??_C@_1BA@BALFACEM@?$AAC?$AAO?$AAN?$AAO?$AAU?$AAT?$AA$@ 0000000180045610 libucrt:initcon.obj + 0002:00007620 __log10_256_lead 0000000180045620 libucrt:log10_256_lead_tail_table.obj + 0002:00007e30 __log10_256_tail 0000000180045e30 libucrt:log10_256_lead_tail_table.obj + 0002:00008640 __log_F_inv_qword 0000000180046640 libucrt:log_f_inv_qword_table.obj + 0002:00008e50 ??_C@_1BK@DBDEIDLH@?$AAK?$AAE?$AAR?$AAN?$AAE?$AAL?$AA3?$AA2?$AA?4?$AAD?$AAL?$AAL@ 0000000180046e50 DelayImp:delayhlp.obj + 0002:00008e70 ??_C@_0BI@OMNLIJDB@AcquireSRWLockExclusive@ 0000000180046e70 DelayImp:delayhlp.obj + 0002:00008e88 ??_C@_0BI@HMIEPCNJ@ReleaseSRWLockExclusive@ 0000000180046e88 DelayImp:delayhlp.obj + 0002:00008ea0 __pfnDliFailureHook2 0000000180046ea0 DelayImp:delayhk1.obj + 0002:00008eb0 _load_config_used 0000000180046eb0 LIBCMT:loadcfg.obj + 0002:00008ff0 ??_C@_1LE@BLLCLMNC@?$AAD?$AA?3?$AA?2?$AAw?$AAo?$AAr?$AAk?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?2?$AAp?$AAl@ 0000000180046ff0 addon.obj + 0002:000090b0 ??_C@_1FM@LOELJOFK@?$AAs?$AAi?$AAz?$AAe?$AA?5?$AA?$DM?$AA?$DN?$AA?5?$AAi?$AAm?$AAp?$AA?3?$AA?3?$AAk?$AAM@ 00000001800470b0 addon.obj + 0002:00009110 ??_C@_0BN@EPMABAF@First?5arg?5should?5be?5a?5Buffer@ 0000000180047110 addon.obj + 0002:00009130 ??_C@_0CC@NHECKMAN@Could?5not?5convert?5the?5given?5fon@ 0000000180047130 addon.obj + 0002:00009158 ??_C@_07ONPFMHHK@convert@ 0000000180047158 addon.obj + 0002:00009160 ??_C@_0GI@JAELBODH@D?3?2workspace?2plugin?2mini_font?2p@ 0000000180047160 addon.obj + 0002:000091c8 ??_C@_05ONJGPJEO@addon@ 00000001800471c8 addon.obj + 0002:000091d0 ??_C@_0BC@BDKFLDHL@unknown?5exception@ 00000001800471d0 glyph.obj + 0002:000091e8 ??_C@_0BF@KINCDENJ@bad?5array?5new?5length@ 00000001800471e8 glyph.obj + 0002:00009200 ??_C@_0BA@FOIKENOD@vector?5too?5long@ 0000000180047200 glyph.obj + 0002:00009210 ??_7exception@stdext@@6B@ 0000000180047210 glyph.obj + 0002:00009228 ??_7bad_array_new_length@stdext@@6B@ 0000000180047228 glyph.obj + 0002:00009240 ??_C@_0BB@GCADKGJO@map?1set?5too?5long@ 0000000180047240 font.obj + 0002:00009260 ??_C@_1NI@JFKOIKCH@?$AAD?$AA?3?$AA?2?$AAw?$AAo?$AAr?$AAk?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?2?$AAp?$AAl@ 0000000180047260 font.obj + 0002:00009338 ??_C@_1BG@GNOBELO@?$AAv?$AAa?$AAl?$AAu?$AAe?$AA?5?$AA?$DN?$AA?$DN?$AA?5?$AA1@ 0000000180047338 font.obj + 0002:00009360 ?kKnownTags@woff2@@3QBIB 0000000180047360 table_tags.obj + 0002:00046038 __pfnDliNotifyHook2 0000000180084038 win_delay_load_hook.obj + 0002:000964e0 ??_C@_0BM@NIJEAGPP@Font?5normalization?5failed?4?6@ 00000001800d44e0 normalize.obj + 0002:00096500 ??_C@_0BJ@MEPOFKNI@Failed?5to?5fix?5checksums?6@ 00000001800d4500 normalize.obj + 0002:00096520 ??_C@_0BA@JFNIOLAK@string?5too?5long@ 00000001800d4520 woff2_enc.obj + 0002:00096530 ??_C@_00CNPNBAHC@@ 00000001800d4530 woff2_enc.obj + 0002:00096534 ??_C@_01CLKCMJKC@?5@ 00000001800d4534 woff2_enc.obj + 0002:00096538 ??_C@_05GAMJOPOA@?5the?5@ 00000001800d4538 woff2_enc.obj + 0002:00096540 ??_C@_02MDINNEEG@s?5@ 00000001800d4540 woff2_enc.obj + 0002:00096544 ??_C@_04ECIHFDID@?5of?5@ 00000001800d4544 woff2_enc.obj + 0002:0009654c ??_C@_05OMGAMCPJ@?5and?5@ 00000001800d454c woff2_enc.obj + 0002:00096554 ??_C@_02KEGNLNML@?0?5@ 00000001800d4554 woff2_enc.obj + 0002:00096558 ??_C@_04GJPPFNOH@?5in?5@ 00000001800d4558 woff2_enc.obj + 0002:00096560 ??_C@_04MKEOLIJC@?5to?5@ 00000001800d4560 woff2_enc.obj + 0002:00096568 ??_C@_02NLCGALIE@e?5@ 00000001800d4568 woff2_enc.obj + 0002:0009656c ??_C@_01BJJEKLCA@?$CC@ 00000001800d456c woff2_enc.obj + 0002:00096570 ??_C@_01LFCBOECM@?4@ 00000001800d4570 woff2_enc.obj + 0002:00096574 ??_C@_02HKLCKPBO@?$CC?$DO@ 00000001800d4574 woff2_enc.obj + 0002:00096578 ??_C@_01EEMJAFIK@?6@ 00000001800d4578 woff2_enc.obj + 0002:0009657c ??_C@_01LBDDMOBJ@?$FN@ 00000001800d457c woff2_enc.obj + 0002:00096580 ??_C@_05POFHKGEO@?5for?5@ 00000001800d4580 woff2_enc.obj + 0002:00096588 ??_C@_03KCBIAKGI@?5a?5@ 00000001800d4588 woff2_enc.obj + 0002:0009658c ??_C@_06NBDJBOAO@?5that?5@ 00000001800d458c woff2_enc.obj + 0002:00096594 ??_C@_02KHOJGJKF@?4?5@ 00000001800d4594 woff2_enc.obj + 0002:00096598 ??_C@_06BIDGLIKJ@?5with?5@ 00000001800d4598 woff2_enc.obj + 0002:000965a0 ??_C@_01GEODFPGF@?8@ 00000001800d45a0 woff2_enc.obj + 0002:000965a4 ??_C@_06EGFPNNHB@?5from?5@ 00000001800d45a4 woff2_enc.obj + 0002:000965ac ??_C@_04KHJHGPBD@?5by?5@ 00000001800d45ac woff2_enc.obj + 0002:000965b4 ??_C@_06BCCEPMPI@?4?5The?5@ 00000001800d45b4 woff2_enc.obj + 0002:000965bc ??_C@_04EMJEACDL@?5on?5@ 00000001800d45bc woff2_enc.obj + 0002:000965c4 ??_C@_04LILFEFCL@?5as?5@ 00000001800d45c4 woff2_enc.obj + 0002:000965cc ??_C@_04HNABGNME@?5is?5@ 00000001800d45cc woff2_enc.obj + 0002:000965d4 ??_C@_04KOBKGEOJ@ing?5@ 00000001800d45d4 woff2_enc.obj + 0002:000965dc ??_C@_02NMOLBIHC@?6?7@ 00000001800d45dc woff2_enc.obj + 0002:000965e0 ??_C@_01JLIPDDHJ@?3@ 00000001800d45e0 woff2_enc.obj + 0002:000965e4 ??_C@_03IBJGAIM@ed?5@ 00000001800d45e4 woff2_enc.obj + 0002:000965e8 ??_C@_01ODHLEDKK@?$CI@ 00000001800d45e8 woff2_enc.obj + 0002:000965ec ??_C@_04LNPKFDKO@?5at?5@ 00000001800d45ec woff2_enc.obj + 0002:000965f4 ??_C@_03GBOPBPCF@ly?5@ 00000001800d45f4 woff2_enc.obj + 0002:000965f8 ??_C@_02ILLPBGAO@?$DN?$CC@ 00000001800d45f8 woff2_enc.obj + 0002:000965fc ??_C@_05JMFPLAMM@?4com?1@ 00000001800d45fc woff2_enc.obj + 0002:00096608 ??_C@_08FEFOBDIG@?5of?5the?5@ 00000001800d4608 woff2_enc.obj + 0002:00096618 ??_C@_07CNMFFCB@?4?5This?5@ 00000001800d4618 woff2_enc.obj + 0002:00096620 ??_C@_01IHBHIGKO@?0@ 00000001800d4620 woff2_enc.obj + 0002:00096624 ??_C@_05MKKKJBDN@?5not?5@ 00000001800d4624 woff2_enc.obj + 0002:0009662c ??_C@_03BALCLPEO@er?5@ 00000001800d462c woff2_enc.obj + 0002:00096630 ??_C@_03IJGIKGGD@al?5@ 00000001800d4630 woff2_enc.obj + 0002:00096634 ??_C@_02PGMIOCEL@?$DN?8@ 00000001800d4634 woff2_enc.obj + 0002:00096638 ??_C@_04KHAHMMEH@ful?5@ 00000001800d4638 woff2_enc.obj + 0002:00096640 ??_C@_04DIDDMPPH@ive?5@ 00000001800d4640 woff2_enc.obj + 0002:00096648 ??_C@_05NKGAJEJJ@less?5@ 00000001800d4648 woff2_enc.obj + 0002:00096650 ??_C@_04NHPJBLID@est?5@ 00000001800d4650 woff2_enc.obj + 0002:00096658 ??_C@_04HCOFHAEP@ize?5@ 00000001800d4658 woff2_enc.obj + 0002:00096660 ??_C@_02DMJCNICK@?B?$KA@ 00000001800d4660 woff2_enc.obj + 0002:00096664 ??_C@_04LNGNEKHL@ous?5@ 00000001800d4664 woff2_enc.obj + 0002:00096670 ??_C@_0BN@HEAHNNMF@Font?5transformation?5failed?4?6@ 00000001800d4670 woff2_enc.obj + 0002:00096690 ??_C@_0CD@OCNFMKNP@Parsing?5of?5the?5input?5font?5faile@ 00000001800d4690 woff2_enc.obj + 0002:000966b8 ??_C@_0CH@EOJHPIKI@Compression?5of?5combined?5table?5f@ 00000001800d46b8 woff2_enc.obj + 0002:000966e0 ??_C@_0CK@GMDJIFKF@Compression?5of?5extended?5metadat@ 00000001800d46e0 woff2_enc.obj + 0002:00096710 ??_C@_0DF@MEPEAJOB@Result?5allocation?5was?5too?5small@ 00000001800d4710 woff2_enc.obj + 0002:00096748 ??_C@_0CH@JJNHMEMJ@Missing?5table?5index?5for?5offset?5@ 00000001800d4748 woff2_enc.obj + 0002:00096770 ??_C@_0DK@GDAEJMMO@Mismatch?5between?5computed?5and?5a@ 00000001800d4770 woff2_enc.obj + 0002:000967b0 ??_C@_0BG@BBKNOMOH@invalid?5map?$DMK?0?5T?$DO?5key@ 00000001800d47b0 woff2_enc.obj + 0002:000967d0 ??_C@_1NM@BBNDCAJA@?$AAD?$AA?3?$AA?2?$AAw?$AAo?$AAr?$AAk?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?2?$AAp?$AAl@ 00000001800d47d0 backward_references.obj + 0002:000968b0 ?kDistanceShortCodeBitCost@?1??BackwardReferenceScoreUsingLastDistance@brotli@@YANNHH@Z@4QBNB 00000001800d48b0 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$00$00@brotli@@$00$00@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$00$00@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BB@$03@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BB@$03@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@$00$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BA@$00@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BA@$00@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:00096930 ?kLimits@?EG@???$CreateBackwardReferences@V?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@1@PEAH5PEAUCommand@1@5@Z@4QBHB 00000001800d4930 backward_references.obj + 0002:000969a0 ??_C@_1OA@LKNOGMPE@?$AAD?$AA?3?$AA?2?$AAw?$AAo?$AAr?$AAk?$AAs?$AAp?$AAa?$AAc?$AAe?$AA?2?$AAp?$AAl@ 00000001800d49a0 brotli_bit_stream.obj + 0002:00096a80 ??_C@_1CM@FMBMFIGD@?$AAb?$AAi?$AAt?$AAs?$AA?5?$AA?$DM?$AA?5?$AA1?$AAU?$AAL?$AAL?$AA?5?$AA?$DM?$AA?$DM?$AA?5@ 00000001800d4a80 brotli_bit_stream.obj + 0002:00096ad8 ??_C@_0BL@GOIGLPKN@unordered_map?1set?5too?5long@ 00000001800d4ad8 encode.obj + 0002:00096af8 ??_C@_0BK@OGNNAFAB@invalid?5hash?5bucket?5count@ 00000001800d4af8 encode.obj + 0002:00096b18 ??_7BrotliIn@brotli@@6B@ 00000001800d4b18 encode.obj + 0002:00096b18 ??_7BrotliOut@brotli@@6B@ 00000001800d4b18 encode.obj + 0002:00096bb0 ??_7BrotliMemOut@brotli@@6B@ 00000001800d4bb0 streams.obj + 0002:00096bc0 ??_7BrotliMemIn@brotli@@6B@ 00000001800d4bc0 streams.obj + 0002:00096bd0 ??_C@_08JDDNMFDB@node?4exe@ 00000001800d4bd0 win_delay_load_hook.obj + 0002:00096bdc __real@3f800000 00000001800d4bdc literal_cost.obj + 0002:00096be0 __real@3f9db22d0e560419 00000001800d4be0 literal_cost.obj + 0002:00096be8 __real@3f9dbf487fcb923a 00000001800d4be8 literal_cost.obj + 0002:00096bf0 __real@3fa47ae147ae147b 00000001800d4bf0 backward_references.obj + 0002:00096bf8 __real@3fb1eb851eb851ec 00000001800d4bf8 block_splitter.obj + 0002:00096c00 __real@3fc999999999999a 00000001800d4c00 backward_references.obj + 0002:00096c08 __real@3fd3333333333333 00000001800d4c08 backward_references.obj + 0002:00096c10 __real@3fd6666666666666 00000001800d4c10 literal_cost.obj + 0002:00096c18 __real@3fe0000000000000 00000001800d4c18 literal_cost.obj + 0002:00096c20 __real@3fe6666666666666 00000001800d4c20 literal_cost.obj + 0002:00096c28 __real@3fe8000000000000 00000001800d4c28 encode.obj + 0002:00096c30 __real@3fe8a3d70a3d70a4 00000001800d4c30 block_splitter.obj + 0002:00096c38 __real@3fee666666666666 00000001800d4c38 backward_references.obj + 0002:00096c40 __real@3fef0a3d70a3d70a 00000001800d4c40 backward_references.obj + 0002:00096c48 __real@3fefae147ae147ae 00000001800d4c48 encode.obj + 0002:00096c50 __real@3ff199999999999a 00000001800d4c50 normalize.obj + 0002:00096c58 __real@3ff2b851eb851eb8 00000001800d4c58 backward_references.obj + 0002:00096c60 __real@3ff3333333333333 00000001800d4c60 woff2_enc.obj + 0002:00096c68 __real@3ff451eb851eb852 00000001800d4c68 backward_references.obj + 0002:00096c70 __real@4000000000000000 00000001800d4c70 block_splitter.obj + 0002:00096c78 __real@4002666666666666 00000001800d4c78 backward_references.obj + 0002:00096c80 __real@4008000000000000 00000001800d4c80 backward_references.obj + 0002:00096c88 __real@400e000000000000 00000001800d4c88 backward_references.obj + 0002:00096c90 __real@4010000000000000 00000001800d4c90 backward_references.obj + 0002:00096c98 __real@401599999999999a 00000001800d4c98 backward_references.obj + 0002:00096ca0 __real@401c000000000000 00000001800d4ca0 backward_references.obj + 0002:00096ca8 __real@401fae147ae147ae 00000001800d4ca8 encode.obj + 0002:00096cb0 __real@40203ae147ae147b 00000001800d4cb0 encode.obj + 0002:00096cb8 __real@4028000000000000 00000001800d4cb8 brotli_bit_stream.obj + 0002:00096cc0 __real@402a000000000000 00000001800d4cc0 encode.obj + 0002:00096cc8 __real@402b000000000000 00000001800d4cc8 block_splitter.obj + 0002:00096cd0 __real@402d333333333333 00000001800d4cd0 block_splitter.obj + 0002:00096cd8 __real@4034000000000000 00000001800d4cd8 metablock.obj + 0002:00096ce0 __real@403c19999999999a 00000001800d4ce0 block_splitter.obj + 0002:00096ce8 __real@4059000000000000 00000001800d4ce8 metablock.obj + 0002:00096cf0 __real@4079000000000000 00000001800d4cf0 metablock.obj + 0002:00096cf8 __real@407f400000000000 00000001800d4cf8 metablock.obj + 0002:00096d00 __real@409f400000000000 00000001800d4d00 block_splitter.obj + 0002:00096d08 __real@40c4000000000000 00000001800d4d08 woff2_enc.obj + 0002:00096d10 __real@43e0000000000000 00000001800d4d10 normalize.obj + 0002:00096d18 __real@547d42aea2879f2e 00000001800d4d18 block_splitter.obj + 0002:00096d20 __real@5f000000 00000001800d4d20 encode.obj + 0002:00096d28 __real@bfe3333333333333 00000001800d4d28 backward_references.obj + 0002:00096d30 __real@bff0000000000000 00000001800d4d30 backward_references.obj + 0002:00096d40 __xmm@00000001000000010000000100000001 00000001800d4d40 entropy_encode.obj + 0002:00096d50 __xmm@00000003000000020000000100000000 00000001800d4d50 brotli_bit_stream.obj + 0002:00096d60 __xmm@3f50624dd2f1a9fc3f50624dd2f1a9fc 00000001800d4d60 backward_references.obj + 0002:00096d70 __xmm@3f8a9fbe76c8b4393f9374bc6a7ef9db 00000001800d4d70 backward_references.obj + 0002:00096d80 __xmm@3fa374bc6a7ef9db3fb999999999999a 00000001800d4d80 backward_references.obj + 0002:00096d90 __xmm@40000000400000004000000040000000 00000001800d4d90 entropy_encode.obj + 0002:00096da0 __xmm@ffffffffffffffffffffffffffffffff 00000001800d4da0 entropy_encode.obj + 0002:00096e80 _tls_used 00000001800d4e80 LIBCMT:tlssup.obj + 0002:00096ea8 ??_R4exception@std@@6B@ 00000001800d4ea8 libcpmt:xthrow.obj + 0002:00096ed0 ??_R3exception@std@@8 00000001800d4ed0 libcpmt:xthrow.obj + 0002:00096ee8 ??_R2exception@std@@8 00000001800d4ee8 libcpmt:xthrow.obj + 0002:00096ef8 ??_R1A@?0A@EA@exception@std@@8 00000001800d4ef8 libcpmt:xthrow.obj + 0002:00096f20 ??_R4bad_alloc@std@@6B@ 00000001800d4f20 libcpmt:xthrow.obj + 0002:00096f48 ??_R3bad_alloc@std@@8 00000001800d4f48 libcpmt:xthrow.obj + 0002:00096f60 ??_R2bad_alloc@std@@8 00000001800d4f60 libcpmt:xthrow.obj + 0002:00096f78 ??_R1A@?0A@EA@bad_alloc@std@@8 00000001800d4f78 libcpmt:xthrow.obj + 0002:00096fa0 ??_R4logic_error@std@@6B@ 00000001800d4fa0 libcpmt:xthrow.obj + 0002:00096fc8 ??_R3logic_error@std@@8 00000001800d4fc8 libcpmt:xthrow.obj + 0002:00096fe0 ??_R2logic_error@std@@8 00000001800d4fe0 libcpmt:xthrow.obj + 0002:00096ff8 ??_R1A@?0A@EA@logic_error@std@@8 00000001800d4ff8 libcpmt:xthrow.obj + 0002:00097020 ??_R4length_error@std@@6B@ 00000001800d5020 libcpmt:xthrow.obj + 0002:00097048 ??_R3length_error@std@@8 00000001800d5048 libcpmt:xthrow.obj + 0002:00097060 ??_R2length_error@std@@8 00000001800d5060 libcpmt:xthrow.obj + 0002:00097080 ??_R1A@?0A@EA@length_error@std@@8 00000001800d5080 libcpmt:xthrow.obj + 0002:000970a8 ??_R4out_of_range@std@@6B@ 00000001800d50a8 libcpmt:xthrow.obj + 0002:000970d0 ??_R3out_of_range@std@@8 00000001800d50d0 libcpmt:xthrow.obj + 0002:000970e8 ??_R2out_of_range@std@@8 00000001800d50e8 libcpmt:xthrow.obj + 0002:00097108 ??_R1A@?0A@EA@out_of_range@std@@8 00000001800d5108 libcpmt:xthrow.obj + 0002:00097130 ??_R4type_info@@6B@ 00000001800d5130 LIBCMT:std_type_info_static.obj + 0002:00097158 ??_R3type_info@@8 00000001800d5158 LIBCMT:std_type_info_static.obj + 0002:00097170 ??_R2type_info@@8 00000001800d5170 LIBCMT:std_type_info_static.obj + 0002:00097180 ??_R1A@?0A@EA@type_info@@8 00000001800d5180 LIBCMT:std_type_info_static.obj + 0002:000971a8 ??_R4bad_array_new_length@std@@6B@ 00000001800d51a8 LIBCMT:throw_bad_alloc.obj + 0002:000971d0 ??_R3bad_array_new_length@std@@8 00000001800d51d0 LIBCMT:throw_bad_alloc.obj + 0002:000971e8 ??_R2bad_array_new_length@std@@8 00000001800d51e8 LIBCMT:throw_bad_alloc.obj + 0002:00097208 ??_R1A@?0A@EA@bad_array_new_length@std@@8 00000001800d5208 LIBCMT:throw_bad_alloc.obj + 0002:00097230 ??_R4bad_exception@std@@6B@ 00000001800d5230 libvcruntime:frame.obj + 0002:00097258 ??_R3bad_exception@std@@8 00000001800d5258 libvcruntime:frame.obj + 0002:00097270 ??_R2bad_exception@std@@8 00000001800d5270 libvcruntime:frame.obj + 0002:00097288 ??_R1A@?0A@EA@bad_exception@std@@8 00000001800d5288 libvcruntime:frame.obj + 0002:00097710 __rtc_iaa 00000001800d5710 LIBCMT:initsect.obj + 0002:00097718 __rtc_izz 00000001800d5718 LIBCMT:initsect.obj + 0002:00097720 __rtc_taa 00000001800d5720 LIBCMT:initsect.obj + 0002:00097728 __rtc_tzz 00000001800d5728 LIBCMT:initsect.obj + 0002:00097730 _tls_start 00000001800d5730 LIBCMT:tlssup.obj + 0002:00097734 _Init_thread_epoch 00000001800d5734 LIBCMT:thread_safe_statics.obj + 0002:00097738 _tls_end 00000001800d5738 LIBCMT:tlssup.obj + 0002:0009b5e0 _CT??_R0?AVbad_alloc@std@@@8??0bad_alloc@std@@QEAA@AEBV01@@Z24 00000001800d95e0 libcpmt:xthrow.obj + 0002:0009b608 _CT??_R0?AVexception@std@@@8??0exception@std@@QEAA@AEBV01@@Z24 00000001800d9608 libcpmt:xthrow.obj + 0002:0009b630 _TI2?AVbad_alloc@std@@ 00000001800d9630 libcpmt:xthrow.obj + 0002:0009b650 _CTA2?AVbad_alloc@std@@ 00000001800d9650 libcpmt:xthrow.obj + 0002:0009b668 _CT??_R0?AVlogic_error@std@@@8??0logic_error@std@@QEAA@AEBV01@@Z24 00000001800d9668 libcpmt:xthrow.obj + 0002:0009b690 _TI3?AVlength_error@std@@ 00000001800d9690 libcpmt:xthrow.obj + 0002:0009b6b0 _CTA3?AVlength_error@std@@ 00000001800d96b0 libcpmt:xthrow.obj + 0002:0009b6d0 _CT??_R0?AVlength_error@std@@@8??0length_error@std@@QEAA@AEBV01@@Z24 00000001800d96d0 libcpmt:xthrow.obj + 0002:0009b6f8 _TI3?AVout_of_range@std@@ 00000001800d96f8 libcpmt:xthrow.obj + 0002:0009b718 _CTA3?AVout_of_range@std@@ 00000001800d9718 libcpmt:xthrow.obj + 0002:0009b738 _CT??_R0?AVout_of_range@std@@@8??0out_of_range@std@@QEAA@AEBV01@@Z24 00000001800d9738 libcpmt:xthrow.obj + 0002:0009b760 _TI3?AVbad_array_new_length@std@@ 00000001800d9760 LIBCMT:throw_bad_alloc.obj + 0002:0009b780 _CTA3?AVbad_array_new_length@std@@ 00000001800d9780 LIBCMT:throw_bad_alloc.obj + 0002:0009b7a0 _CT??_R0?AVbad_array_new_length@std@@@8??0bad_array_new_length@std@@QEAA@AEBV01@@Z24 00000001800d97a0 LIBCMT:throw_bad_alloc.obj + 0002:0009b7c8 _TI2?AVbad_exception@std@@ 00000001800d97c8 libvcruntime:frame.obj + 0002:0009b7e8 _CTA2?AVbad_exception@std@@ 00000001800d97e8 libvcruntime:frame.obj + 0002:0009b800 _CT??_R0?AVbad_exception@std@@@8??0bad_exception@std@@QEAA@AEBV01@@Z24 00000001800d9800 libvcruntime:frame.obj + 0002:0009b824 __DELAY_IMPORT_DESCRIPTOR_node_exe 00000001800d9824 node:node.exe + 0002:0009b844 __NULL_DELAY_IMPORT_DESCRIPTOR 00000001800d9844 node:node.exe + 0002:0009b948 \177node_NULL_THUNK_DATA_DLN 00000001800d9948 node:node.exe + 0002:0009c150 \177node_NULL_THUNK_DATA_DLB 00000001800da150 node:node.exe + 0002:0009c280 __IMPORT_DESCRIPTOR_KERNEL32 00000001800da280 kernel32:KERNEL32.dll + 0002:0009c294 __NULL_IMPORT_DESCRIPTOR 00000001800da294 kernel32:KERNEL32.dll + 0003:00000000 _Init_global_epoch 00000001800db000 LIBCMT:thread_safe_statics.obj + 0003:00000008 __isa_available 00000001800db008 LIBCMT:cpu_disp.obj + 0003:0000000c __isa_enabled 00000001800db00c LIBCMT:cpu_disp.obj + 0003:00000010 __memcpy_nt_iters 00000001800db010 LIBCMT:cpu_disp.obj + 0003:00000018 __memset_nt_iters 00000001800db018 LIBCMT:cpu_disp.obj + 0003:00000020 __security_cookie_complement 00000001800db020 LIBCMT:gs_cookie.obj + 0003:00000028 __security_cookie 00000001800db028 LIBCMT:gs_cookie.obj + 0003:00000030 __scrt_native_dllmain_reason 00000001800db030 LIBCMT:utility.obj + 0003:00000050 _iob 00000001800db050 libucrt:_file.obj + 0003:00000158 __abort_behavior 00000001800db158 libucrt:abort.obj + 0003:00000170 __badioinfo 00000001800db170 libucrt:ioinit.obj + 0003:000001c0 __acrt_initial_locale_data 00000001800db1c0 libucrt:nlsdata.obj + 0003:00000318 __acrt_initial_locale_pointers 00000001800db318 libucrt:nlsdata.obj + 0003:00000328 __acrt_wide_c_locale_string 00000001800db328 libucrt:nlsdata.obj + 0003:00000330 _lookuptrailbytes 00000001800db330 libucrt:read.obj + 0003:00000430 __acrt_initial_multibyte_data 00000001800db430 libucrt:mbctype.obj + 0003:00000970 _pwctype 00000001800db970 libucrt:ctype.obj + 0003:00000978 __globallocalestatus 00000001800db978 libucrt:glstatus.obj + 0003:00000980 __acrt_lconv_c 00000001800db980 libucrt:localeconv.obj + 0003:00000a18 __acrt_lconv_static_decimal 00000001800dba18 libucrt:localeconv.obj + 0003:00000a1c __acrt_lconv_static_W_decimal 00000001800dba1c libucrt:localeconv.obj + 0003:00000a40 _fltused 00000001800dba40 LIBCMT:fltused.obj + 0003:00000a90 ??_R0?AVbad_alloc@std@@@8 00000001800dba90 libcpmt:xthrow.obj + 0003:00000ab8 ??_R0?AVexception@std@@@8 00000001800dbab8 libcpmt:xthrow.obj + 0003:00000ae0 ??_R0?AVlogic_error@std@@@8 00000001800dbae0 libcpmt:xthrow.obj + 0003:00000b08 ??_R0?AVlength_error@std@@@8 00000001800dbb08 libcpmt:xthrow.obj + 0003:00000b30 ??_R0?AVout_of_range@std@@@8 00000001800dbb30 libcpmt:xthrow.obj + 0003:00000b58 ??_R0?AVtype_info@@@8 00000001800dbb58 LIBCMT:std_type_info_static.obj + 0003:00000b78 ??_R0?AVbad_array_new_length@std@@@8 00000001800dbb78 LIBCMT:throw_bad_alloc.obj + 0003:00000ba8 ??_R0?AVbad_exception@std@@@8 00000001800dbba8 libvcruntime:frame.obj + 0003:00000bd0 __imp_?Value@External@v8@@QEBAPEAXXZ 00000001800dbbd0 node:node.exe + 0003:00000bd8 __imp_?New@External@v8@@SA?AV?$Local@VExternal@v8@@@2@PEAVIsolate@2@PEAX@Z 00000001800dbbd8 node:node.exe + 0003:00000be0 __imp_?ThrowException@Isolate@v8@@QEAA?AV?$Local@VValue@v8@@@2@V32@@Z 00000001800dbbe0 node:node.exe + 0003:00000be8 __imp_?GetCurrentContext@Isolate@v8@@QEAA?AV?$Local@VContext@v8@@@2@XZ 00000001800dbbe8 node:node.exe + 0003:00000bf0 __imp_?GetCurrent@Isolate@v8@@SAPEAV12@XZ 00000001800dbbf0 node:node.exe + 0003:00000bf8 __imp_?CreateHandle@HandleScope@v8@@CAPEAPEAVObject@internal@2@PEAVHeapObject@42@PEAV342@@Z 00000001800dbbf8 node:node.exe + 0003:00000c00 __imp_??1HandleScope@v8@@QEAA@XZ 00000001800dbc00 node:node.exe + 0003:00000c08 __imp_??0HandleScope@v8@@QEAA@PEAVIsolate@1@@Z 00000001800dbc08 node:node.exe + 0003:00000c10 __imp_?Error@Exception@v8@@SA?AV?$Local@VValue@v8@@@2@V?$Local@VString@v8@@@2@@Z 00000001800dbc10 node:node.exe + 0003:00000c18 __imp_?TypeError@Exception@v8@@SA?AV?$Local@VValue@v8@@@2@V?$Local@VString@v8@@@2@@Z 00000001800dbc18 node:node.exe + 0003:00000c20 __imp_?GetFunction@FunctionTemplate@v8@@QEAA?AV?$MaybeLocal@VFunction@v8@@@2@V?$Local@VContext@v8@@@2@@Z 00000001800dbc20 node:node.exe + 0003:00000c28 __imp_?New@FunctionTemplate@v8@@SA?AV?$Local@VFunctionTemplate@v8@@@2@PEAVIsolate@2@P6AXAEBV?$FunctionCallbackInfo@VValue@v8@@@2@@ZV?$Local@VValue@v8@@@2@V?$Local@VSignature@v8@@@2@HW4ConstructorBehavior@2@W4SideEffectType@2@@Z 00000001800dbc28 node:node.exe + 0003:00000c30 __imp_?ToLocalEmpty@V8@v8@@CAXXZ 00000001800dbc30 node:node.exe + 0003:00000c38 __imp_?ToObject@Value@v8@@QEBA?AV?$MaybeLocal@VObject@v8@@@2@V?$Local@VContext@v8@@@2@@Z 00000001800dbc38 node:node.exe + 0003:00000c40 __imp_?Escape@EscapableHandleScope@v8@@AEAAPEAPEAVObject@internal@2@PEAPEAV342@@Z 00000001800dbc40 node:node.exe + 0003:00000c48 __imp_??0EscapableHandleScope@v8@@QEAA@PEAVIsolate@1@@Z 00000001800dbc48 node:node.exe + 0003:00000c50 __imp_?NewFromUtf8@String@v8@@SA?AV?$MaybeLocal@VString@v8@@@2@PEAVIsolate@2@PEBDW4NewStringType@2@H@Z 00000001800dbc50 node:node.exe + 0003:00000c58 __imp_?SlowGetInternalField@Object@v8@@AEAA?AV?$Local@VValue@v8@@@2@H@Z 00000001800dbc58 node:node.exe + 0003:00000c60 __imp_?SetInternalField@Object@v8@@QEAAXHV?$Local@VValue@v8@@@2@@Z 00000001800dbc60 node:node.exe + 0003:00000c68 __imp_?Set@Object@v8@@QEAA?AV?$Maybe@_N@2@V?$Local@VContext@v8@@@2@V?$Local@VValue@v8@@@2@1@Z 00000001800dbc68 node:node.exe + 0003:00000c70 __imp_?SetInternalFieldCount@ObjectTemplate@v8@@QEAAXH@Z 00000001800dbc70 node:node.exe + 0003:00000c78 __imp_?NewInstance@ObjectTemplate@v8@@QEAA?AV?$MaybeLocal@VObject@v8@@@2@V?$Local@VContext@v8@@@2@@Z 00000001800dbc78 node:node.exe + 0003:00000c80 __imp_?New@ObjectTemplate@v8@@SA?AV?$Local@VObjectTemplate@v8@@@2@PEAVIsolate@2@V?$Local@VFunctionTemplate@v8@@@2@@Z 00000001800dbc80 node:node.exe + 0003:00000c88 __imp_node_module_register 00000001800dbc88 node:node.exe + 0003:00000c90 __imp_?HasInstance@Buffer@node@@YA_NV?$Local@VObject@v8@@@v8@@@Z 00000001800dbc90 node:node.exe + 0003:00000c98 __imp_?New@Buffer@node@@YA?AV?$MaybeLocal@VObject@v8@@@v8@@PEAVIsolate@4@PEAD_K@Z 00000001800dbc98 node:node.exe + 0003:00000ca0 __imp_?Data@Buffer@node@@YAPEADV?$Local@VObject@v8@@@v8@@@Z 00000001800dbca0 node:node.exe + 0003:00000ca8 __imp_?Length@Buffer@node@@YA_KV?$Local@VObject@v8@@@v8@@@Z 00000001800dbca8 node:node.exe + 0003:00000cb0 \177node_NULL_THUNK_DATA_DLA 00000001800dbcb0 node:node.exe + 0003:00000cc0 __hmod__node_exe 00000001800dbcc0 node:node.exe + 0003:00000cc8 ?_Raise_handler@std@@3P6AXAEBVexception@stdext@@@ZEA 00000001800dbcc8 libcpmt:raisehan.obj + 0003:0000128c __favor 00000001800dc28c LIBCMT:cpu_disp.obj + 0003:00001290 __scrt_current_native_startup_state 00000001800dc290 LIBCMT:utility.obj + 0003:00001298 __scrt_native_startup_lock 00000001800dc298 LIBCMT:utility.obj + 0003:000012d8 __scrt_debugger_hook_flag 00000001800dc2d8 LIBCMT:utility_desktop.obj + 0003:000012e0 __castguard_check_failure_os_handled_fptr 00000001800dc2e0 LIBCMT:guard_support.obj + 0003:000012e8 _tls_index 00000001800dc2e8 LIBCMT:tlssup.obj + 0003:000012f0 ?__type_info_root_node@@3U__type_info_node@@A 00000001800dc2f0 LIBCMT:tncleanup.obj + 0003:00001300 ?_OptionsStorage@?1??__local_stdio_scanf_options@@9@4_KA 00000001800dc300 LIBCMT:default_local_stdio_options.obj + 0003:00001308 ?__WinRTOutOfMemoryExceptionCallback@@3P6APEAXXZEA 00000001800dc308 libvcruntime:ehhelpers.obj + 0003:00001310 __pPurecall 00000001800dc310 libvcruntime:purevirt_data.obj + 0003:000013d0 ?pArgList@UnDecorator@@0PEAVReplicator@@EA 00000001800dc3d0 libvcruntime:undname.obj + 0003:000013d8 ?pZNameList@UnDecorator@@0PEAVReplicator@@EA 00000001800dc3d8 libvcruntime:undname.obj + 0003:000013e0 ?pTemplateArgList@UnDecorator@@0PEAVReplicator@@EA 00000001800dc3e0 libvcruntime:undname.obj + 0003:000013e8 ?gName@UnDecorator@@0PEBDEB 00000001800dc3e8 libvcruntime:undname.obj + 0003:000013f0 ?name@UnDecorator@@0PEBDEB 00000001800dc3f0 libvcruntime:undname.obj + 0003:000013f8 ?disableFlags@UnDecorator@@0KA 00000001800dc3f8 libvcruntime:undname.obj + 0003:000013fc ?fExplicitTemplateParams@UnDecorator@@0_NA 00000001800dc3fc libvcruntime:undname.obj + 0003:000013fd ?fGetTemplateArgumentList@UnDecorator@@0_NA 00000001800dc3fd libvcruntime:undname.obj + 0003:00001400 ?m_pGetParameter@UnDecorator@@0P6APEADJ@ZEA 00000001800dc400 libvcruntime:undname.obj + 0003:00001408 ?m_CHPENameOffset@UnDecorator@@0KA 00000001800dc408 libvcruntime:undname.obj + 0003:0000140c ?m_recursionLevel@UnDecorator@@0KA 00000001800dc40c libvcruntime:undname.obj + 0003:00001480 _nstream 00000001800dc480 libucrt:_file.obj + 0003:00001488 __piob 00000001800dc488 libucrt:_file.obj + 0003:00001490 _cflush 00000001800dc490 libucrt:_file.obj + 0003:000014b0 ?c_exit_complete@?1???R@@QEBA@XZ@4_NA 00000001800dc4b0 libucrt:exit.obj + 0003:000015c8 _environ_table 00000001800dc5c8 libucrt:environment_initialization.obj + 0003:000015d0 _wenviron_table 00000001800dc5d0 libucrt:environment_initialization.obj + 0003:000015d8 __dcrt_initial_wide_environment 00000001800dc5d8 libucrt:environment_initialization.obj + 0003:000015e0 __dcrt_initial_narrow_environment 00000001800dc5e0 libucrt:environment_initialization.obj + 0003:000015e8 __acrt_atexit_table 00000001800dc5e8 libucrt:onexit.obj + 0003:00001600 __acrt_at_quick_exit_table 00000001800dc600 libucrt:onexit.obj + 0003:000017f0 __pioinfo 00000001800dc7f0 libucrt:ioinit.obj + 0003:00001bf0 _nhandle 00000001800dcbf0 libucrt:ioinit.obj + 0003:00001c08 __acrt_stdout_buffer 00000001800dcc08 libucrt:_sftbuf.obj + 0003:00001c10 __acrt_stderr_buffer 00000001800dcc10 libucrt:_sftbuf.obj + 0003:00001c18 __acrt_locale_changed_data 00000001800dcc18 libucrt:wsetlocale.obj + 0003:00001c20 __acrt_current_locale_data 00000001800dcc20 libucrt:nlsdata.obj + 0003:00001e70 _mbctype 00000001800dce70 libucrt:mbctype.obj + 0003:00001e78 _mbcasemap 00000001800dce78 libucrt:mbctype.obj + 0003:00001e80 __acrt_current_multibyte_data 00000001800dce80 libucrt:mbctype.obj + 0003:00001e90 _pgmptr 00000001800dce90 libucrt:argv_data.obj + 0003:00001e98 __argc 00000001800dce98 libucrt:argv_data.obj + 0003:00001ea0 __argv 00000001800dcea0 libucrt:argv_data.obj + 0003:00001ea8 __wargv 00000001800dcea8 libucrt:argv_data.obj + 0003:00001eb0 _acmdln 00000001800dceb0 libucrt:argv_data.obj + 0003:00001eb8 _wcmdln 00000001800dceb8 libucrt:argv_data.obj + 0003:00001ec0 __acrt_heap 00000001800dcec0 libucrt:heap_handle.obj + 0003:00001ed4 __acrt_lconv_static_null 00000001800dced4 libucrt:localeconv.obj + 0003:00001ed8 __acrt_lconv_static_W_null 00000001800dced8 libucrt:localeconv.obj + 0003:00001ee8 __fma3_is_available 00000001800dcee8 libucrt:fma3_available.obj + 0003:00001eec __use_fma3_lib 00000001800dceec libucrt:fma3_available.obj + 0003:00001ef0 ?DloadKernel32@@3PEAUHINSTANCE__@@EA 00000001800dcef0 DelayImp:delayhlp.obj + 0003:00001ef8 ?DloadAcquireSRWLockExclusive@@3P6AXPEA_K@ZEA 00000001800dcef8 DelayImp:delayhlp.obj + 0003:00001f00 ?DloadReleaseSRWLockExclusive@@3P6AXPEA_K@ZEA 00000001800dcf00 DelayImp:delayhlp.obj + 0003:00001f08 ?DloadSrwLock@@3_KA 00000001800dcf08 DelayImp:delayhlp.obj + 0003:00001f10 ?DloadSectionLockCount@@3KA 00000001800dcf10 DelayImp:delayhlp.obj + 0003:00001f14 ?DloadSectionOldProtection@@3KA 00000001800dcf14 DelayImp:delayhlp.obj + 0003:00001f18 ?DloadSectionCommitPermanent@@3KA 00000001800dcf18 DelayImp:delayhlp.obj + 0003:00001f20 ?_OptionsStorage@?1??__local_stdio_printf_options@@9@4_KA 00000001800dcf20 normalize.obj + 0003:00001f28 ?static_dictionary_@BrotliCompressor@brotli@@0PEAVStaticDictionary@2@EA 00000001800dcf28 encode.obj + 0003:00001f40 __scrt_ucrt_dll_is_in_use 00000001800dcf40 + 0003:00001f48 __dyn_tls_init_callback 00000001800dcf48 + + entry point at 0001:00026340 + + Static symbols + + 0000:fff1b000 .debug$S 0000000180000000 addon.exp + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 kernel32:KERNEL32.dll + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0000:fff1b000 .debug$S 0000000180000000 node:node.exe + 0001:00000000 ?FunctionCallbackWrapper@imp@Nan@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180001000 f addon.obj + 0001:00000670 _register_addon 0000000180001670 f addon.obj + 0001:00001170 ?StorePoints@?A0x004d6e0c@woff2@@YA_NAEBVGlyph@2@PEA_KPEAE_K@Z 0000000180002170 f glyph.obj + 0001:00004530 ?WriteNormalizedLoca@?A0x1efe2f25@woff2@@YA_NHHPEAUFont@2@@Z 0000000180005530 f normalize.obj + 0001:000053b0 ?GetTransformedGlyfBytes@GlyfEncoder@?A0x723790ab@woff2@@QEAAXPEAV?$vector@EV?$allocator@E@std@@@std@@@Z 00000001800063b0 f transform.obj + 0001:000058b0 ?WriteSimpleGlyph@GlyfEncoder@?A0x723790ab@woff2@@AEAAXHAEBVGlyph@3@@Z 00000001800068b0 f transform.obj + 0001:00005c00 ?WriteCompositeGlyph@GlyfEncoder@?A0x723790ab@woff2@@AEAAXHAEBVGlyph@3@@Z 0000000180006c00 f transform.obj + 0001:00005dc0 ?WriteTriplet@GlyfEncoder@?A0x723790ab@woff2@@AEAAX_NHH@Z 0000000180006dc0 f transform.obj + 0001:00006500 ??1GlyfEncoder@?A0x723790ab@woff2@@QEAA@XZ 0000000180007500 f transform.obj + 0001:00006ac0 ?Compress@?A0x5b9939dd@woff2@@YA_NPEBE_KPEAEPEAIW4Mode@BrotliParams@brotli@@@Z 0000000180007ac0 f woff2_enc.obj + 0001:00006ca0 ?StoreTableEntry@?A0x5b9939dd@woff2@@YAXAEBUTable@2@PEA_KPEAE@Z 0000000180007ca0 f woff2_enc.obj + 0001:00006e50 ?ComputeWoff2Length@?A0x5b9939dd@woff2@@YA_KAEBUFontCollection@2@AEBV?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@V?$map@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@@5@_K@Z 0000000180007e50 f woff2_enc.obj + 0001:000070f0 ?ComputeUncompressedLength@?A0x5b9939dd@woff2@@YA_KAEBUFont@2@@Z 00000001800080f0 f woff2_enc.obj + 0001:00008b30 ?GetLengthCode@brotli@@YAXHHHPEAGPEA_K@Z 0000000180009b30 f backward_references.obj + 0001:0000923c $LN15 000000018000a23c backward_references.obj + 0001:00011650 ?HuffmanBitCost@brotli@@YAHPEBEH@Z 0000000180012650 f block_splitter.obj + 0001:00011970 ?BitCost@brotli@@YAMHH@Z 0000000180012970 f block_splitter.obj + 0001:0001a170 ?HuffmanBitCost@brotli@@YAHPEBEH@Z 000000018001b170 f brotli_bit_stream.obj + 0001:0001e5d4 $LN213 000000018001f5d4 encode.obj + 0001:0001eaf0 $LN156 000000018001faf0 encode.obj + 0001:00020be0 ?SortHuffmanTree@?A0xbf9879d9@brotli@@YA_NAEBUHuffmanTree@12@0@Z 0000000180021be0 f entropy_encode.obj + 0001:00020bf0 ?SetDepth@?A0xbf9879d9@brotli@@YAXAEBUHuffmanTree@12@PEAU312@PEAEH@Z 0000000180021bf0 f entropy_encode.obj + 0001:00021d10 ?_Xlength@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@CAXXZ 0000000180022d10 f entropy_encode.obj + 0001:00021d30 ??$_Emplace_reallocate@AEBUHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@AEBU234@@Z 0000000180022d30 f entropy_encode.obj + 0001:00021d30 ??$_Emplace_reallocate@UHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@$$QEAU234@@Z 0000000180022d30 f entropy_encode.obj + 0001:00021f10 ??$_Insertion_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0P6A_NAEBU123@1@Z@Z 0000000180022f10 f entropy_encode.obj + 0001:00022020 ??$_Stable_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXQEAUHuffmanTree@?A0xbf9879d9@brotli@@0_J01P6A_NAEBU123@2@Z@Z 0000000180023020 f entropy_encode.obj + 0001:00022130 ??$_Buffered_merge_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXQEAUHuffmanTree@?A0xbf9879d9@brotli@@0_J0P6A_NAEBU123@2@Z@Z 0000000180023130 f entropy_encode.obj + 0001:00022340 ??$_Buffered_inplace_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z@Z 0000000180023340 f entropy_encode.obj + 0001:00022470 ??$_Chunked_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@PEAU123@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0_J_JP6A_NAEBU123@4@Z@Z 0000000180023470 f entropy_encode.obj + 0001:00022580 ??$_Buffered_inplace_merge_unchecked_impl@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z@Z 0000000180023580 f entropy_encode.obj + 0001:00022910 ??$_Buffered_inplace_merge_divide_and_conquer2@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z0011@Z 0000000180023910 f entropy_encode.obj + 0001:00023620 ?BitsEntropy@brotli@@YANPEBHH@Z 0000000180024620 f metablock.obj + 0001:00025530 ?load_exe_hook@@YAP6A_JXZIPEAUDelayLoadInfo@@@Z 0000000180026530 f win_delay_load_hook.obj + 0001:00025a80 $$000000 0000000180026a80 LIBCMT:amdsecgs.obj + 0001:00025cb8 capture_current_context 0000000180026cb8 f LIBCMT:gs_report.obj + 0001:00025d28 capture_previous_context 0000000180026d28 f LIBCMT:gs_report.obj + 0001:00025d9c ?__scrt_initialize_thread_safe_statics@@YAHXZ 0000000180026d9c f LIBCMT:thread_safe_statics.obj + 0001:00025e6c ?__scrt_uninitialize_thread_safe_statics@@YAXXZ 0000000180026e6c f LIBCMT:thread_safe_statics.obj + 0001:00026020 ?dllmain_crt_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180027020 f LIBCMT:dll_dllmain.obj + 0001:00026070 ?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 0000000180027070 f LIBCMT:dll_dllmain.obj + 0001:00026188 ?dllmain_crt_process_detach@@YAH_N@Z 0000000180027188 f LIBCMT:dll_dllmain.obj + 0001:0002620c ?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 000000018002720c f LIBCMT:dll_dllmain.obj + 0001:00027940 $$000000 0000000180028940 libvcruntime:memset.obj + 0001:00027dfc ??$BuildCatchObjectHelperInternal@V__FrameHandler4@@@@YAHPEAUEHExceptionRecord@@PEAXPEAUHandlerType4@FH4@@PEBU_s_CatchableType@@@Z 0000000180028dfc f libvcruntime:frame.obj + 0001:00028000 ??$BuildCatchObjectInternal@V__FrameHandler4@@@@YAXPEAUEHExceptionRecord@@PEAXPEAUHandlerType4@FH4@@PEBU_s_CatchableType@@@Z 0000000180029000 f libvcruntime:frame.obj + 0001:000280c4 ??$CatchIt@V__FrameHandler4@@@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@PEAUHandlerType4@4@PEBU_s_CatchableType@@PEAUTryBlockMapEntry4@4@H1EE@Z 00000001800290c4 f libvcruntime:frame.obj + 0001:00028198 ??$FindHandler@V__FrameHandler4@@@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@EH1@Z 0000000180029198 f libvcruntime:frame.obj + 0001:000286a8 ??$FindHandlerForForeignException@V__FrameHandler4@@@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@HH1@Z 00000001800296a8 f libvcruntime:frame.obj + 0001:00029438 ?ExFilterRethrow@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@PEAH@Z 000000018002a438 f libvcruntime:frame.obj + 0001:000294c0 ?ExFilterRethrowFH4@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@HPEAH@Z 000000018002a4c0 f libvcruntime:frame.obj + 0001:000297d8 ?IsInExceptionSpec@@YAEPEAUEHExceptionRecord@@PEBU_s_ESTypeList@@@Z 000000018002a7d8 f libvcruntime:frame.obj + 0001:000298c8 ?Is_bad_exception_allowed@@YAEPEBU_s_ESTypeList@@@Z 000000018002a8c8 f libvcruntime:frame.obj + 0001:00029bb0 $$000000 000000018002abb0 libvcruntime:notify.obj + 0001:00029c98 ?try_get_function@@YAPEAXW4function_id@?A0x84e3c32f@@QEBDQEBW4module_id@2@2@Z 000000018002ac98 f libvcruntime:winapi_downlevel.obj + 0001:00029f80 $$000000 000000018002af80 libvcruntime:handlers.obj + 0001:0002a090 $$000000 000000018002b090 libvcruntime:memcpy.obj + 0001:0002a4a8 ??$common_assert_to_message_box@_W@@YAXQEB_W0IQEAX@Z 000000018002b4a8 f libucrt:assert.obj + 0001:0002a56c ??$common_assert_to_message_box_build_string@_W@@YAXQEA_W_KQEB_W2IQEAX@Z 000000018002b56c f libucrt:assert.obj + 0001:0002aa70 ??$common_assert_to_stderr@_W@@YAXQEB_W0I@Z 000000018002ba70 f libucrt:assert.obj + 0001:0002abe0 ?get_assert_format@@YAPEB_W_W@Z 000000018002bbe0 f libucrt:assert.obj + 0001:0002b148 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 000000018002c148 f libucrt:output.obj + 0001:0002b188 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 000000018002c188 f libucrt:output.obj + 0001:0002b1c8 ??$common_vsprintf@Vstandard_base@__crt_stdio_output@@_W@@YAH_KQEA_W0QEB_WQEAU__crt_locale_pointers@@QEAD@Z 000000018002c1c8 f libucrt:output.obj + 0001:0002b9c8 ??R@@QEBAHXZ 000000018002c9c8 f libucrt:output.obj + 0001:0002baf8 ??R@@QEBAHXZ 000000018002caf8 f libucrt:output.obj + 0001:0002edb0 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 000000018002fdb0 f libucrt:exit.obj + 0001:0002ede8 ??R@@QEBA@XZ 000000018002fde8 f libucrt:exit.obj + 0001:0002eeac ?atexit_exception_filter@@YAHK@Z 000000018002feac f libucrt:exit.obj + 0001:0002eeb8 ?common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z 000000018002feb8 f libucrt:exit.obj + 0001:0002ef74 ?exit_or_terminate_process@@YAXI@Z 000000018002ff74 f libucrt:exit.obj + 0001:0002efc0 ?try_cor_exit_process@@YAXI@Z 000000018002ffc0 f libucrt:exit.obj + 0001:0002f048 ??$parse_command_line@D@@YAXPEADPEAPEAD0PEA_K2@Z 0000000180030048 f libucrt:argv_parsing.obj + 0001:0002f3f4 ??$common_initialize_environment_nolock@D@@YAHXZ 00000001800303f4 f libucrt:environment_initialization.obj + 0001:0002f460 ??$create_environment@D@@YAQEAPEADQEAD@Z 0000000180030460 f libucrt:environment_initialization.obj + 0001:0002f568 ??$free_environment@D@@YAXQEAPEAD@Z 0000000180030568 f libucrt:environment_initialization.obj + 0001:0002f568 ??$free_environment@_W@@YAXQEAPEA_W@Z 0000000180030568 f libucrt:environment_initialization.obj + 0001:0002f5ac ??$uninitialize_environment_internal@D@@YAXAEAPEAPEAD@Z 00000001800305ac f libucrt:environment_initialization.obj + 0001:0002f5c8 ??$uninitialize_environment_internal@_W@@YAXAEAPEAPEA_W@Z 00000001800305c8 f libucrt:environment_initialization.obj + 0001:0002f624 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 0000000180030624 f libucrt:onexit.obj + 0001:0002f660 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 0000000180030660 f libucrt:onexit.obj + 0001:0002f69c ??R@@QEBAHXZ 000000018003069c f libucrt:onexit.obj + 0001:0002f84c ??R@@QEBAHXZ 000000018003084c f libucrt:onexit.obj + 0001:0002fa20 initialize_global_variables 0000000180030a20 f libucrt:initialization.obj + 0001:0002fa34 initialize_c 0000000180030a34 f libucrt:initialization.obj + 0001:0002fa58 initialize_environment 0000000180030a58 f libucrt:initialization.obj + 0001:0002fa58 initialize_global_state_isolation 0000000180030a58 f libucrt:initialization.obj + 0001:0002fa58 report_memory_leaks 0000000180030a58 f libucrt:initialization.obj + 0001:0002fa58 uninitialize_c 0000000180030a58 f libucrt:initialization.obj + 0001:0002fa58 uninitialize_global_state_isolation 0000000180030a58 f libucrt:initialization.obj + 0001:0002fa5c uninitialize_environment 0000000180030a5c f libucrt:initialization.obj + 0001:0002fa6c initialize_pointers 0000000180030a6c f libucrt:initialization.obj + 0001:0002faac uninitialize_vcruntime 0000000180030aac f libucrt:initialization.obj + 0001:0002fab4 uninitialize_allocated_memory 0000000180030ab4 f libucrt:initialization.obj + 0001:0002faf4 uninitialize_allocated_io_buffers 0000000180030af4 f libucrt:initialization.obj + 0001:000306d0 $$000000 00000001800316d0 libucrt:strncmp.obj + 0001:00030960 ??$common_xtox@K_W@@YAHKQEA_W_KI_N@Z 0000000180031960 f libucrt:xtoa.obj + 0001:00030a34 ??$common_xtox_s@K_W@@YAHKQEA_W_KI_N@Z 0000000180031a34 f libucrt:xtoa.obj + 0001:00030fc0 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 0000000180031fc0 f libucrt:fflush.obj + 0001:0003105c ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 000000018003205c f libucrt:fflush.obj + 0001:0003113c ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 000000018003213c f libucrt:fflush.obj + 0001:0003117c ?common_flush_all@@YAH_N@Z 000000018003217c f libucrt:fflush.obj + 0001:00031314 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 0000000180032314 f libucrt:setvbuf.obj + 0001:00031354 ??R@@QEBAHXZ 0000000180032354 f libucrt:setvbuf.obj + 0001:000314d0 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800324d0 f libucrt:signal.obj + 0001:000317d4 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800327d4 f libucrt:per_thread_data.obj + 0001:00031814 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 0000000180032814 f libucrt:per_thread_data.obj + 0001:00031854 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 0000000180032854 f libucrt:per_thread_data.obj + 0001:0003189c ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 000000018003289c f libucrt:per_thread_data.obj + 0001:000318fc ?construct_ptd_array@@YAXQEAU__acrt_ptd@@@Z 00000001800328fc f libucrt:per_thread_data.obj + 0001:000319cc ?destroy_fls@@YAXPEAX@Z 00000001800329cc f libucrt:per_thread_data.obj + 0001:000319ec ?destroy_ptd_array@@YAXQEAU__acrt_ptd@@@Z 00000001800329ec f libucrt:per_thread_data.obj + 0001:00031ae4 ?replace_current_thread_locale_nolock@@YAXQEAU__acrt_ptd@@QEAU__crt_locale_data@@@Z 0000000180032ae4 f libucrt:per_thread_data.obj + 0001:00031e78 ?try_get_function@@YAPEAXW4function_id@?A0x391cf84c@@QEBDQEBW4module_id@2@2@Z 0000000180032e78 f libucrt:winapi_thunks.obj + 0001:000327c8 ?initialize_inherited_file_handles_nolock@@YAXXZ 00000001800337c8 f libucrt:ioinit.obj + 0001:000328b8 ?initialize_stdio_handles_nolock@@YAXXZ 00000001800338b8 f libucrt:ioinit.obj + 0001:000331c0 ?fp_format_a@@YAHQEBNPEAD_KQEAD2H_NIQEAU__crt_locale_pointers@@@Z 00000001800341c0 f libucrt:cvt.obj + 0001:00033530 ?fp_format_e@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 0000000180034530 f libucrt:cvt.obj + 0001:0003360c ?fp_format_e_internal@@YAHQEAD_KH_NIQEAU_strflt@@2QEAU__crt_locale_pointers@@@Z 000000018003460c f libucrt:cvt.obj + 0001:000337e0 ?fp_format_f_internal@@YAHQEAD_KHQEAU_strflt@@_NQEAU__crt_locale_pointers@@@Z 00000001800347e0 f libucrt:cvt.obj + 0001:00033924 ?fp_format_g@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 0000000180034924 f libucrt:cvt.obj + 0001:0003403c ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 000000018003503c f libucrt:wsetlocale.obj + 0001:000340e8 _call_matherr 00000001800350e8 f libucrt:libm_error.obj + 0001:00034150 _exception_enabled 0000000180035150 f libucrt:libm_error.obj + 0001:00034360 ?write_double_translated_ansi_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z 0000000180035360 f libucrt:write.obj + 0001:00034830 ?write_text_ansi_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z 0000000180035830 f libucrt:write.obj + 0001:00034934 ?write_text_utf16le_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z 0000000180035934 f libucrt:write.obj + 0001:00034a50 ?write_text_utf8_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z 0000000180035a50 f libucrt:write.obj + 0001:00034f88 ??$write_buffer_nolock@D@@YA_NDV__crt_stdio_stream@@@Z 0000000180035f88 f libucrt:_flsbuf.obj + 0001:0003506c ??$write_buffer_nolock@_W@@YA_N_WV__crt_stdio_stream@@@Z 000000018003606c f libucrt:_flsbuf.obj + 0001:00035154 ?stream_is_at_end_of_file_nolock@@YA_NV__crt_stdio_stream@@@Z 0000000180036154 f libucrt:_flsbuf.obj + 0001:0003555c ?@@@CAHPEBX0@Z 000000018003655c f libucrt:argv_wildcards.obj + 0001:00035874 ??$common_expand_argv_wildcards@D@@YAHQEAPEADQEAPEAPEAD@Z 0000000180036874 f libucrt:argv_wildcards.obj + 0001:00035a80 ??$copy_and_add_argument_to_buffer@D@@YAHQEBD0_KAEAV?$argument_list@D@?A0x5f5c8891@@@Z 0000000180036a80 f libucrt:argv_wildcards.obj + 0001:00035c08 ??$expand_argument_wildcards@D@@YAHQEAD0AEAV?$argument_list@D@?A0x5f5c8891@@@Z 0000000180036c08 f libucrt:argv_wildcards.obj + 0001:00035f20 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 0000000180036f20 f libucrt:mbctype.obj + 0001:000360dc ?getSystemCP@@YAHH@Z 00000001800370dc f libucrt:mbctype.obj + 0001:0003615c ?setSBCS@@YAXPEAU__crt_multibyte_data@@@Z 000000018003715c f libucrt:mbctype.obj + 0001:000361ec ?setSBUpLow@@YAXPEAU__crt_multibyte_data@@@Z 00000001800371ec f libucrt:mbctype.obj + 0001:000363d0 ?setmbcp_internal@@YAHH_NQEAU__acrt_ptd@@QEAPEAU__crt_multibyte_data@@@Z 00000001800373d0 f libucrt:mbctype.obj + 0001:00036594 ?update_thread_multibyte_data_internal@@YAPEAU__crt_multibyte_data@@QEAU__acrt_ptd@@QEAPEAU1@@Z 0000000180037594 f libucrt:mbctype.obj + 0001:00036984 ?x_ismbbtype_l@@YAHPEAU__crt_locale_pointers@@IHH@Z 0000000180037984 f libucrt:ismbbyte.obj + 0001:00036fb4 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 0000000180037fb4 f libucrt:commit.obj + 0001:00039390 memcpy_s 000000018003a390 f libucrt:cfout.obj + 0001:000395f0 ?free_crt_array_internal@@YAXQEAPEBX_K@Z 000000018003a5f0 f libucrt:inittime.obj + 0001:00039d18 ??$common_lseek@_J@@YA_JH_JH@Z 000000018003ad18 f libucrt:lseek.obj + 0001:00039e08 ??$common_lseek_nolock@_J@@YA_JH_JH@Z 000000018003ae08 f libucrt:lseek.obj + 0001:0003a3e4 fallbackMethod 000000018003b3e4 f libucrt:strpbrk.obj + 0001:0003a7b4 $LN78 000000018003b7b4 libucrt:strpbrk.obj + 0001:0003a7f0 $LN77 000000018003b7f0 libucrt:strpbrk.obj + 0001:0003a830 $LN76 000000018003b830 libucrt:strpbrk.obj + 0001:0003a90c ?__acrt_LCMapStringA_stat@@YAHPEAU__crt_locale_pointers@@PEB_WKPEBDHPEADHHH@Z 000000018003b90c f libucrt:lcmapstringa.obj + 0001:0003acbc ?initialize_multibyte@@YAHXZ 000000018003bcbc f libucrt:multibyte_initializer.obj + 0001:0003ad64 ??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 000000018003bd64 f libucrt:close.obj + 0001:0003b2c0 $$000000 000000018003c2c0 libucrt:log10.obj + 0001:0003b870 $$000000 000000018003c870 libucrt:fpsr.obj + 0001:0003be30 _log_special_common 000000018003ce30 f libucrt:log_special.obj + 0001:0003c720 $$000000 000000018003d720 LIBCMT:chkstk.obj + 0001:0003c8c0 $$000000 000000018003d8c0 libvcruntime:memcmp.obj + 0001:0003ca20 $$000000 000000018003da20 LIBCMT:guard_dispatch.obj + 0001:0003ca40 $$000000 000000018003da40 LIBCMT:guard_xfg_dispatch.obj + 0001:0003ca60 ?catch$0@?0???2@YAPEAX_KAEBUnothrow_t@std@@@Z@4HA 000000018003da60 f LIBCMT:new_scalar_nothrow.obj + 0001:0003ca6d __catch$??2@YAPEAX_KAEBUnothrow_t@std@@@Z$0 000000018003da6d f LIBCMT:new_scalar_nothrow.obj + 0001:0003ca7e ?fin$0@?0??dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z@4HA 000000018003da7e f LIBCMT:dll_dllmain.obj + 0001:0003ca95 ?fin$0@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 000000018003da95 f LIBCMT:dll_dllmain.obj + 0001:0003caae ?fin$1@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 000000018003daae f LIBCMT:dll_dllmain.obj + 0001:0003cac2 ?filt$0@?0??dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z@4HA 000000018003dac2 f LIBCMT:dll_dllmain.obj + 0001:0003caf8 __scrt_is_nonwritable_in_current_image$filt$0 000000018003daf8 f LIBCMT:utility.obj + 0001:0003cb10 ?filt$0@?0???$_CallSETranslator@V__FrameHandler4@@@@YAHPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@K1H@Z@4HA 000000018003db10 f libvcruntime:risctrnsctrl.obj + 0001:0003cbaf __DestructExceptionObject$filt$0 000000018003dbaf f libvcruntime:ehhelpers.obj + 0001:0003cc45 ?filt$0@?0??CxxCallCatchBlock@__FrameHandler4@@SAPEAXPEAU_EXCEPTION_RECORD@@@Z@4HA 000000018003dc45 f libvcruntime:frame.obj + 0001:0003cc74 ?fin$1@?0??CxxCallCatchBlock@__FrameHandler4@@SAPEAXPEAU_EXCEPTION_RECORD@@@Z@4HA 000000018003dc74 f libvcruntime:frame.obj + 0001:0003ccf7 ?filt$0@?0??FrameUnwindToState@__FrameHandler4@@SAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@H@Z@4HA 000000018003dcf7 f libvcruntime:frame.obj + 0001:0003cd0d ?fin$1@?0??FrameUnwindToState@__FrameHandler4@@SAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@H@Z@4HA 000000018003dd0d f libvcruntime:frame.obj + 0001:0003cd30 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd30 f libucrt:fflush.obj + 0001:0003cd30 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd30 f libucrt:fflush.obj + 0001:0003cd30 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd30 f libucrt:output.obj + 0001:0003cd30 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd30 f libucrt:output.obj + 0001:0003cd30 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd30 f libucrt:setvbuf.obj + 0001:0003cd4b _query_new_handler$fin$0 000000018003dd4b f libucrt:new_handler.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:per_thread_data.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:per_thread_data.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:per_thread_data.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:per_thread_data.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:mbctype.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:signal.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:exit.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:onexit.obj + 0001:0003cd61 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd61 f libucrt:onexit.obj + 0001:0003cd7b ?filt$0@?0???R@@QEBA@XZ@4HA 000000018003dd7b f libucrt:exit.obj + 0001:0003cd96 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003dd96 f libucrt:fflush.obj + 0001:0003cdb3 raise$fin$0 000000018003ddb3 f libucrt:signal.obj + 0001:0003cdd4 _fcloseall$fin$0 000000018003ddd4 f libucrt:closeall.obj + 0001:0003cded __acrt_initialize_lowio$fin$0 000000018003dded f libucrt:ioinit.obj + 0001:0003cded __acrt_lowio_ensure_fh_exists$fin$0 000000018003dded f libucrt:osfinfo.obj + 0001:0003ce06 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003de06 f libucrt:wsetlocale.obj + 0001:0003ce20 ?fin$0@?0???$common_lseek@_J@@YA_JH_JH@Z@4HA 000000018003de20 f libucrt:lseek.obj + 0001:0003ce20 _write$fin$0 000000018003de20 f libucrt:write.obj + 0001:0003ce37 ?fin$0@?0??update_thread_multibyte_data_internal@@YAPEAU__crt_multibyte_data@@QEAU__acrt_ptd@@QEAPEAU1@@Z@4HA 000000018003de37 f libucrt:mbctype.obj + 0001:0003ce50 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003de50 f libucrt:close.obj + 0001:0003ce50 ?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 000000018003de50 f libucrt:commit.obj + 0001:0003ce6a __acrt_update_thread_locale_data$fin$0 000000018003de6a f libucrt:locale_refcounting.obj + 0001:0003ce83 fclose$fin$0 000000018003de83 f libucrt:fclose.obj + 0001:0003ce9b _ctrlfp$filt$0 000000018003de9b f libucrt:fpctrl.obj + 0001:0003ced0 _IsNonwritableInCurrentImage$filt$0 000000018003ded0 f LIBCMT:pesect.obj + 0002:000002c8 ?__scrt_initialize_tss_var@@3P6AHXZEA 000000018003e2c8 LIBCMT:thread_safe_statics.obj + 0002:000003f8 GS_ExceptionPointers 000000018003e3f8 LIBCMT:gs_report.obj + 0002:00000510 ?ExceptionTemplate@?1??UnwindNestedFrames@__FrameHandler4@@SAXPEA_KPEAUEHExceptionRecord@@PEAU_CONTEXT@@0PEAXPEAUFuncInfo4@FH4@@HHPEAUHandlerType4@6@PEAU_xDISPATCHER_CONTEXT@@E@Z@4U_EXCEPTION_RECORD@@B 000000018003e510 libvcruntime:risctrnsctrl.obj + 0002:000005e0 ?tokenTable@@3QBUStringLiteral@@B 000000018003e5e0 libvcruntime:undname.obj + 0002:000006e0 ?nameTable@@3QBUStringLiteral@@B 000000018003e6e0 libvcruntime:undname.obj + 0002:00000c10 ?rttiTable@@3QBUStringLiteral@@B 000000018003ec10 libvcruntime:undname.obj + 0002:00000c60 ?IndirectionName@@3QBUStringLiteral@@B 000000018003ec60 libvcruntime:undname.obj + 0002:00000cc0 ?PrefixName@@3QBUStringLiteral@@B 000000018003ecc0 libvcruntime:undname.obj + 0002:00001398 ?module_names@?A0x84e3c32f@@3QBQEB_WB 000000018003f398 libvcruntime:winapi_downlevel.obj + 0002:00001458 ?candidate_modules@?1??try_get_FlsAlloc@@YAP6AKP6AXPEAX@Z@ZXZ@4QBW4module_id@?A0x84e3c32f@@B 000000018003f458 libvcruntime:winapi_downlevel.obj + 0002:00001470 ?candidate_modules@?1??try_get_FlsFree@@YAP6AHK@ZXZ@4QBW4module_id@?A0x84e3c32f@@B 000000018003f470 libvcruntime:winapi_downlevel.obj + 0002:00001480 ?candidate_modules@?1??try_get_FlsGetValue@@YAP6APEAXK@ZXZ@4QBW4module_id@?A0x84e3c32f@@B 000000018003f480 libvcruntime:winapi_downlevel.obj + 0002:00001498 ?candidate_modules@?1??try_get_FlsSetValue@@YAP6AHKPEAX@ZXZ@4QBW4module_id@?A0x84e3c32f@@B 000000018003f498 libvcruntime:winapi_downlevel.obj + 0002:000014b0 ?candidate_modules@?1??try_get_InitializeCriticalSectionEx@@YAP6AHPEAU_RTL_CRITICAL_SECTION@@KK@ZXZ@4QBW4module_id@?A0x84e3c32f@@B 000000018003f4b0 libvcruntime:winapi_downlevel.obj + 0002:00001840 ?ln_lead_table@?1??log2@@9@9 000000018003f840 libucrt:log2.obj + 0002:00001a50 ?ln_tail_table@?1??log2@@9@9 000000018003fa50 libucrt:log2.obj + 0002:00001dc0 __acrt_initializers 000000018003fdc0 libucrt:initialization.obj + 0002:00001ec0 ?errtable@@3QBUerrentry@?A0x31fdb9ec@@B 000000018003fec0 libucrt:errno.obj + 0002:00002030 ?module_names@?A0x391cf84c@@3QBQEB_WB 0000000180040030 libucrt:winapi_thunks.obj + 0002:00002538 ?candidate_modules@?1??try_get_AreFileApisANSI@@YAP6AHXZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040538 libucrt:winapi_thunks.obj + 0002:00002550 ?candidate_modules@?1??try_get_FlsAlloc@@YAP6AKP6AXPEAX@Z@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040550 libucrt:winapi_thunks.obj + 0002:00002558 ?candidate_modules@?1??try_get_FlsFree@@YAP6AHK@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040558 libucrt:winapi_thunks.obj + 0002:00002560 ?candidate_modules@?1??try_get_FlsGetValue@@YAP6APEAXK@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040560 libucrt:winapi_thunks.obj + 0002:00002568 ?candidate_modules@?1??try_get_FlsSetValue@@YAP6AHKPEAX@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040568 libucrt:winapi_thunks.obj + 0002:00002570 ?candidate_modules@?1??try_get_GetActiveWindow@@YAP6APEAUHWND__@@XZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040570 libucrt:winapi_thunks.obj + 0002:00002588 ?candidate_modules@?1??try_get_GetLastActivePopup@@YAP6APEAUHWND__@@PEAU2@@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040588 libucrt:winapi_thunks.obj + 0002:000025a8 ?candidate_modules@?1??try_get_GetProcessWindowStation@@YAP6APEAUHWINSTA__@@XZXZ@4QBW4module_id@?A0x391cf84c@@B 00000001800405a8 libucrt:winapi_thunks.obj + 0002:000025c8 ?candidate_modules@?1??try_get_GetUserObjectInformationW@@YAP6AHPEAXH0KPEAK@ZXZ@4QBW4module_id@?A0x391cf84c@@B 00000001800405c8 libucrt:winapi_thunks.obj + 0002:000025f0 ?candidate_modules@?1??try_get_InitializeCriticalSectionEx@@YAP6AHPEAU_RTL_CRITICAL_SECTION@@KK@ZXZ@4QBW4module_id@?A0x391cf84c@@B 00000001800405f0 libucrt:winapi_thunks.obj + 0002:000025f8 ?candidate_modules@?1??try_get_LCMapStringEx@@YAP6AHPEB_WK0HPEA_WHPEAU_nlsversioninfo@@PEAX_J@ZXZ@4QBW4module_id@?A0x391cf84c@@B 00000001800405f8 libucrt:winapi_thunks.obj + 0002:00002610 ?candidate_modules@?1??try_get_LocaleNameToLCID@@YAP6AKPEB_WK@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040610 libucrt:winapi_thunks.obj + 0002:00002630 ?candidate_modules@?1??try_get_MessageBoxA@@YAP6AHPEAUHWND__@@PEBD1I@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040630 libucrt:winapi_thunks.obj + 0002:00002648 ?candidate_modules@?1??try_get_MessageBoxW@@YAP6AHPEAUHWND__@@PEB_W1I@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040648 libucrt:winapi_thunks.obj + 0002:0000265c ?candidate_modules@?1??try_get_AppPolicyGetProcessTerminationMethod@@YAP6AJPEAXPEAW4AppPolicyProcessTerminationMethod@@@ZXZ@4QBW4module_id@?A0x391cf84c@@B 000000018004065c libucrt:winapi_thunks.obj + 0002:00002688 ?candidate_modules@?1??try_get_AppPolicyGetShowDeveloperDiagnostic@@YAP6AJPEAXPEAW4AppPolicyShowDeveloperDiagnostic@@@ZXZ@4QBW4module_id@?A0x391cf84c@@B 0000000180040688 libucrt:winapi_thunks.obj + 0002:000026b4 ?candidate_modules@?1??try_get_AppPolicyGetWindowingModel@@YAP6AJPEAXPEAW4AppPolicyWindowingModel@@@ZXZ@4QBW4module_id@?A0x391cf84c@@B 00000001800406b4 libucrt:winapi_thunks.obj + 0002:000026e0 ?strings@?1??fp_format_nan_or_infinity@@YAHW4__acrt_fp_class@@_NPEAD_K1@Z@4QAY03QEBDA 00000001800406e0 libucrt:cvt.obj + 0002:00002e40 ?_mb_locale_names@@3QBQEB_WB 0000000180040e40 libucrt:mbctype.obj + 0002:000036b0 ?LcidToLocaleNameTable@?A0x881e4c05@@3QBULcidToLocaleName@1@B 00000001800416b0 libucrt:lcidtoname_downlevel.obj + 0002:00005110 ?LocaleNameToIndexTable@?A0x881e4c05@@3QBULocaleNameIndex@1@B 0000000180043110 libucrt:lcidtoname_downlevel.obj + 0002:000072c0 ?large_power_indices@?1??multiply_by_power_of_ten@__crt_strtox@@YA_NAEAUbig_integer@2@I@Z@4QBUunpack_index@?1??12@YA_N0I@Z@B 00000001800452c0 libucrt:cfout.obj + 0002:000073b0 __real_ninf 00000001800453b0 libucrt:log10.obj + 0002:000073c0 __real_inf 00000001800453c0 libucrt:log10.obj + 0002:000073d0 __real_neg_qnan 00000001800453d0 libucrt:log10.obj + 0002:000073e0 __real_qnanbit 00000001800453e0 libucrt:log10.obj + 0002:000073f0 __int_1023 00000001800453f0 libucrt:log10.obj + 0002:00007400 __mask_001 0000000180045400 libucrt:log10.obj + 0002:00007410 __mask_mant 0000000180045410 libucrt:log10.obj + 0002:00007420 __mask_mant_top8 0000000180045420 libucrt:log10.obj + 0002:00007430 __mask_mant9 0000000180045430 libucrt:log10.obj + 0002:00007440 __real_log10_e 0000000180045440 libucrt:log10.obj + 0002:00007450 __real_log10_e_lead 0000000180045450 libucrt:log10.obj + 0002:00007460 __real_log10_e_tail 0000000180045460 libucrt:log10.obj + 0002:00007470 __real_log10_2_lead 0000000180045470 libucrt:log10.obj + 0002:00007480 __real_log10_2_tail 0000000180045480 libucrt:log10.obj + 0002:00007490 __real_two 0000000180045490 libucrt:log10.obj + 0002:000074a0 __real_one 00000001800454a0 libucrt:log10.obj + 0002:000074b0 __real_half 00000001800454b0 libucrt:log10.obj + 0002:000074c0 __mask_100 00000001800454c0 libucrt:log10.obj + 0002:000074d0 __real_1_over_512 00000001800454d0 libucrt:log10.obj + 0002:000074e0 __real_1_over_2 00000001800454e0 libucrt:log10.obj + 0002:000074f0 __real_1_over_3 00000001800454f0 libucrt:log10.obj + 0002:00007500 __real_1_over_4 0000000180045500 libucrt:log10.obj + 0002:00007510 __real_1_over_5 0000000180045510 libucrt:log10.obj + 0002:00007520 __real_1_over_6 0000000180045520 libucrt:log10.obj + 0002:00007530 __real_neg_1023 0000000180045530 libucrt:log10.obj + 0002:00007540 __mask_2045 0000000180045540 libucrt:log10.obj + 0002:00007550 __real_threshold 0000000180045550 libucrt:log10.obj + 0002:00007560 __real_near_one_lt 0000000180045560 libucrt:log10.obj + 0002:00007570 __real_near_one_gt 0000000180045570 libucrt:log10.obj + 0002:00007580 __real_min_norm 0000000180045580 libucrt:log10.obj + 0002:00007590 __real_notsign 0000000180045590 libucrt:log10.obj + 0002:000075a0 __real_ca1 00000001800455a0 libucrt:log10.obj + 0002:000075b0 __real_ca2 00000001800455b0 libucrt:log10.obj + 0002:000075c0 __real_ca3 00000001800455c0 libucrt:log10.obj + 0002:000075d0 __real_ca4 00000001800455d0 libucrt:log10.obj + 0002:000075e0 __mask_lower 00000001800455e0 libucrt:log10.obj + 0002:000075f0 __flag_x_zero 00000001800455f0 libucrt:log10.obj + 0002:000075f4 __flag_x_neg 00000001800455f4 libucrt:log10.obj + 0002:000075f8 __flag_x_nan 00000001800455f8 libucrt:log10.obj + 0002:00007600 __real@433fffffffffffff 0000000180045600 libucrt:fpsr.obj + 0002:00007608 __real@c33fffffffffffff 0000000180045608 libucrt:fpsr.obj + 0002:00009350 ?kDsigTableTag@woff2@@3IB 0000000180047350 font.obj + 0002:00009354 ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 0000000180047354 font.obj + 0002:00009355 ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 0000000180047355 normalize.obj + 0002:00009356 ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 0000000180047356 transform.obj + 0002:00009357 ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 0000000180047357 woff2_enc.obj + 0002:00009358 ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 0000000180047358 backward_references.obj + 0002:00009359 ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 0000000180047359 block_splitter.obj + 0002:0000935a ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 000000018004735a encode.obj + 0002:0000935b ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 000000018004735b encode_parallel.obj + 0002:0000935c ?kMinInputBlockBits@brotli@@3HB 000000018004735c encode.obj + 0002:0000945c ?kMaxInputBlockBits@brotli@@3HB 000000018004745c encode.obj + 0002:00009460 ?kBrotliDictionary@@3QBEB 0000000180047460 woff2_enc.obj + 0002:00027400 ?kTransforms@brotli@@3QBUTransform@1@B 0000000180065400 woff2_enc.obj + 0002:00027f58 ?piecewise_construct@std@@3Upiecewise_construct_t@1@B 0000000180065f58 metablock.obj + 0002:00027f60 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 0000000180065f60 woff2_enc.obj + 0002:00028030 ?kBrotliDictionary@@3QBEB 0000000180066030 backward_references.obj + 0002:00045fd0 ?kBrotliDictionaryOffsetsByLength@@3QBHB 0000000180083fd0 backward_references.obj + 0002:00046040 ?copybase@brotli@@3PAHA 0000000180084040 backward_references.obj + 0002:000460a0 ?kTransforms@brotli@@3QBUTransform@1@B 00000001800840a0 backward_references.obj + 0002:00046c00 ?kStaticDictionaryHash@brotli@@3QBGB 0000000180084c00 backward_references.obj + 0002:00056c00 ?kDistanceCacheOffset@brotli@@3QBHB 0000000180094c00 backward_references.obj + 0002:00056c40 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 0000000180094c40 backward_references.obj + 0002:00056d10 ?insextra@brotli@@3PAHA 0000000180094d10 backward_references.obj + 0002:00056d70 ?insbase@brotli@@3PAHA 0000000180094d70 backward_references.obj + 0002:00056dd0 ?copyextra@brotli@@3PAHA 0000000180094dd0 backward_references.obj + 0002:00056e30 ?kDistanceCacheIndex@brotli@@3QBHB 0000000180094e30 backward_references.obj + 0002:00056e70 ?kLog2Table@brotli@@3QBMB 0000000180094e70 block_splitter.obj + 0002:00057270 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 0000000180095270 block_splitter.obj + 0002:00057340 ?kSigned3BitContextLookup@brotli@@3QBEB 0000000180095340 brotli_bit_stream.obj + 0002:00057440 ?kUTF8ContextLookup@brotli@@3QBEB 0000000180095440 brotli_bit_stream.obj + 0002:00057640 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 0000000180095640 brotli_bit_stream.obj + 0002:00057710 ?kBrotliDictionary@@3QBEB 0000000180095710 encode.obj + 0002:000756b0 ?kBrotliDictionaryOffsetsByLength@@3QBHB 00000001800b36b0 encode.obj + 0002:00075720 ?kBrotliDictionarySizeBitsByLength@@3QBHB 00000001800b3720 encode.obj + 0002:00075790 ?copybase@brotli@@3PAHA 00000001800b3790 encode.obj + 0002:000757f0 ?kLog2Table@brotli@@3QBMB 00000001800b37f0 encode.obj + 0002:00075bf0 ?kTransforms@brotli@@3QBUTransform@1@B 00000001800b3bf0 encode.obj + 0002:00076750 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 00000001800b4750 encode.obj + 0002:00076820 ?insextra@brotli@@3PAHA 00000001800b4820 encode.obj + 0002:00076880 ?insbase@brotli@@3PAHA 00000001800b4880 encode.obj + 0002:000768e0 ?copyextra@brotli@@3PAHA 00000001800b48e0 encode.obj + 0002:00076940 ?kBrotliDictionary@@3QBEB 00000001800b4940 encode_parallel.obj + 0002:000948e0 ?kBrotliDictionaryOffsetsByLength@@3QBHB 00000001800d28e0 encode_parallel.obj + 0002:00094950 ?kBrotliDictionarySizeBitsByLength@@3QBHB 00000001800d2950 encode_parallel.obj + 0002:000949c0 ?copybase@brotli@@3PAHA 00000001800d29c0 encode_parallel.obj + 0002:00094a20 ?kTransforms@brotli@@3QBUTransform@1@B 00000001800d2a20 encode_parallel.obj + 0002:00095580 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 00000001800d3580 encode_parallel.obj + 0002:00095650 ?insextra@brotli@@3PAHA 00000001800d3650 encode_parallel.obj + 0002:000956b0 ?insbase@brotli@@3PAHA 00000001800d36b0 encode_parallel.obj + 0002:00095710 ?copyextra@brotli@@3PAHA 00000001800d3710 encode_parallel.obj + 0002:00095770 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 00000001800d3770 entropy_encode.obj + 0002:00095840 ?kSigned3BitContextLookup@brotli@@3QBEB 00000001800d3840 histogram.obj + 0002:00095940 ?kUTF8ContextLookup@brotli@@3QBEB 00000001800d3940 histogram.obj + 0002:00095b40 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 00000001800d3b40 histogram.obj + 0002:00095c10 ?kLog2Table@brotli@@3QBMB 00000001800d3c10 literal_cost.obj + 0002:00096010 ?kLog2Table@brotli@@3QBMB 00000001800d4010 metablock.obj + 0002:00096410 ?kBlockLengthPrefixCode@brotli@@3QBUPrefixCodeRange@1@B 00000001800d4410 metablock.obj + 0002:00096970 ?cells@?6??CombineLengthCodes@brotli@@YAHHHH@Z@4QBHB 00000001800d4970 backward_references.obj + 0002:00096970 ?cells@?6??CombineLengthCodes@brotli@@YAHHHH@Z@4QBHB 00000001800d4970 encode.obj + 0002:00096aac ?kHuffmanBitLengthHuffmanCodeSymbols@?1??StoreHuffmanTreeOfHuffmanTreeToBitMask@brotli@@YAXHPEBEPEAHPEAE@Z@4QBEB 00000001800d4aac brotli_bit_stream.obj + 0002:00096ab8 ?kStorageOrder@?1??StoreHuffmanTreeOfHuffmanTreeToBitMask@brotli@@YAXHPEBEPEAHPEAE@Z@4QBEB 00000001800d4ab8 brotli_bit_stream.obj + 0002:00096acc ?kHuffmanBitLengthHuffmanCodeBitLengths@?1??StoreHuffmanTreeOfHuffmanTreeToBitMask@brotli@@YAXHPEBEPEAHPEAE@Z@4QBEB 00000001800d4acc brotli_bit_stream.obj + 0002:00096b30 ?kLut@?1??ReverseBits@?A0xbf9879d9@brotli@@YAGHG@Z@4QB_KB 00000001800d4b30 entropy_encode.obj + 0002:00097740 $unwind$?FunctionCallbackWrapper@imp@Nan@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800d5740 addon.obj + 0002:00097754 $unwind$?convert@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@Nan@@@Z 00000001800d5754 addon.obj + 0002:00097770 $chain$1$?convert@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@Nan@@@Z 00000001800d5770 addon.obj + 0002:00097788 $chain$2$?convert@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@Nan@@@Z 00000001800d5788 addon.obj + 0002:00097798 $chain$3$?convert@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@Nan@@@Z 00000001800d5798 addon.obj + 0002:000977b0 $unwind$?Init@@YAXV?$Local@VObject@v8@@@v8@@@Z 00000001800d57b0 addon.obj + 0002:000977c4 $unwind$?_Raise@exception@stdext@@QEBAXXZ 00000001800d57c4 glyph.obj + 0002:000977c4 $unwind$??0length_error@std@@QEAA@PEBD@Z 00000001800d57c4 libcpmt:xthrow.obj + 0002:000977c4 $unwind$??0out_of_range@std@@QEAA@PEBD@Z 00000001800d57c4 libcpmt:xthrow.obj + 0002:000977c4 $unwind$?__mbrtowc_utf8@__crt_mbstring@@YA_KPEA_WPEBD_KPEAU_Mbstatet@@@Z 00000001800d57c4 libucrt:mbrtowc.obj + 0002:000977c4 $unwind$??$common_xtox_s@K_W@@YAHKQEA_W_KI_N@Z 00000001800d57c4 libucrt:xtoa.obj + 0002:000977cc $unwind$?_Tidy@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@AEAAXXZ 00000001800d57cc block_splitter.obj + 0002:000977cc $unwind$?_Tidy@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAXXZ 00000001800d57cc block_splitter.obj + 0002:000977cc $unwind$?_Tidy@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAXXZ 00000001800d57cc block_splitter.obj + 0002:000977cc $unwind$??1?$unique_ptr@UHashers@brotli@@U?$default_delete@UHashers@brotli@@@std@@@std@@QEAA@XZ 00000001800d57cc encode.obj + 0002:000977cc $unwind$??_GBrotliIn@brotli@@UEAAPEAXI@Z 00000001800d57cc encode.obj + 0002:000977cc $unwind$??_GBrotliOut@brotli@@UEAAPEAXI@Z 00000001800d57cc encode.obj + 0002:000977cc $unwind$??_Gbad_array_new_length@stdext@@UEAAPEAXI@Z 00000001800d57cc glyph.obj + 0002:000977cc $unwind$??_Gexception@stdext@@UEAAPEAXI@Z 00000001800d57cc glyph.obj + 0002:000977cc $unwind$??_GBrotliMemIn@brotli@@UEAAPEAXI@Z 00000001800d57cc streams.obj + 0002:000977cc $unwind$??_GBrotliMemOut@brotli@@UEAAPEAXI@Z 00000001800d57cc streams.obj + 0002:000977cc $unwind$?DloadAcquireSectionWriteAccess@@YAXXZ 00000001800d57cc DelayImp:delayhlp.obj + 0002:000977cc $unwind$__raise_securityfailure 00000001800d57cc LIBCMT:gs_report.obj + 0002:000977cc $unwind$??2@YAPEAX_K@Z 00000001800d57cc LIBCMT:new_scalar.obj + 0002:000977cc $unwind$??_Gtype_info@@UEAAPEAXI@Z 00000001800d57cc LIBCMT:std_type_info_static.obj + 0002:000977cc $unwind$_Init_thread_footer 00000001800d57cc LIBCMT:thread_safe_statics.obj + 0002:000977cc $unwind$_Init_thread_header 00000001800d57cc LIBCMT:thread_safe_statics.obj + 0002:000977cc $unwind$_Init_thread_wait 00000001800d57cc LIBCMT:thread_safe_statics.obj + 0002:000977cc $unwind$??0bad_array_new_length@std@@QEAA@AEBV01@@Z 00000001800d57cc LIBCMT:throw_bad_alloc.obj + 0002:000977cc $unwind$__scrt_initialize_crt 00000001800d57cc LIBCMT:utility.obj + 0002:000977cc $unwind$__scrt_initialize_onexit_tables 00000001800d57cc LIBCMT:utility.obj + 0002:000977cc $unwind$__scrt_release_startup_lock 00000001800d57cc LIBCMT:utility.obj + 0002:000977cc $unwind$__scrt_uninitialize_crt 00000001800d57cc LIBCMT:utility.obj + 0002:000977cc $unwind$_onexit 00000001800d57cc LIBCMT:utility.obj + 0002:000977cc $unwind$??0bad_alloc@std@@QEAA@AEBV01@@Z 00000001800d57cc libcpmt:xthrow.obj + 0002:000977cc $unwind$??0exception@std@@QEAA@AEBV01@@Z 00000001800d57cc libcpmt:xthrow.obj + 0002:000977cc $unwind$??0length_error@std@@QEAA@AEBV01@@Z 00000001800d57cc libcpmt:xthrow.obj + 0002:000977cc $unwind$??0logic_error@std@@QEAA@AEBV01@@Z 00000001800d57cc libcpmt:xthrow.obj + 0002:000977cc $unwind$??0out_of_range@std@@QEAA@AEBV01@@Z 00000001800d57cc libcpmt:xthrow.obj + 0002:000977cc $unwind$_IsExceptionObjectToBeDestroyed 00000001800d57cc libvcruntime:ehhelpers.obj + 0002:000977cc $unwind$??0HandlerMap4@FH4@@QEAA@PEBUTryBlockMapEntry4@1@_KH@Z 00000001800d57cc libvcruntime:frame.obj + 0002:000977cc $unwind$??0bad_exception@std@@QEAA@AEBV01@@Z 00000001800d57cc libvcruntime:frame.obj + 0002:000977cc $unwind$?ExFilterRethrow@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@PEAH@Z 00000001800d57cc libvcruntime:frame.obj + 0002:000977cc $unwind$__vcrt_uninitialize_locks 00000001800d57cc libvcruntime:locks.obj + 0002:000977cc $unwind$__vcrt_freeptd 00000001800d57cc libvcruntime:per_thread_data.obj + 0002:000977cc $unwind$_CreateFrameInfo 00000001800d57cc libvcruntime:risctrnsctrl.obj + 0002:000977cc $unwind$_SetImageBase 00000001800d57cc libvcruntime:risctrnsctrl.obj + 0002:000977cc $unwind$_SetThrowImageBase 00000001800d57cc libvcruntime:risctrnsctrl.obj + 0002:000977cc $unwind$__std_exception_destroy 00000001800d57cc libvcruntime:std_exception.obj + 0002:000977cc $unwind$__std_type_info_destroy_list 00000001800d57cc libvcruntime:std_type_info.obj + 0002:000977cc $unwind$__vcrt_FlsAlloc 00000001800d57cc libvcruntime:winapi_downlevel.obj + 0002:000977cc $unwind$__vcrt_FlsFree 00000001800d57cc libvcruntime:winapi_downlevel.obj + 0002:000977cc $unwind$__vcrt_FlsGetValue 00000001800d57cc libvcruntime:winapi_downlevel.obj + 0002:000977cc $unwind$_calloc_base 00000001800d57cc libucrt:calloc_base.obj + 0002:000977cc $unwind$_malloc_base 00000001800d57cc libucrt:malloc_base.obj + 0002:000977cc $unwind$_callnewh 00000001800d57cc libucrt:new_handler.obj + 0002:000977cc $unwind$initialize_pointers 00000001800d57cc libucrt:initialization.obj + 0002:000977cc $unwind$uninitialize_allocated_memory 00000001800d57cc libucrt:initialization.obj + 0002:000977cc $unwind$__acrt_initialize_locks 00000001800d57cc libucrt:locks.obj + 0002:000977cc $unwind$__acrt_uninitialize_locks 00000001800d57cc libucrt:locks.obj + 0002:000977cc $unwind$__acrt_freeptd 00000001800d57cc libucrt:per_thread_data.obj + 0002:000977cc $unwind$__acrt_getptd_head 00000001800d57cc libucrt:per_thread_data.obj + 0002:000977cc $unwind$__acrt_get_developer_information_policy 00000001800d57cc libucrt:win_policies.obj + 0002:000977cc $unwind$__acrt_get_process_end_policy 00000001800d57cc libucrt:win_policies.obj + 0002:000977cc $unwind$__acrt_get_windowing_model_policy 00000001800d57cc libucrt:win_policies.obj + 0002:000977cc $unwind$__acrt_AppPolicyGetProcessTerminationMethodInternal 00000001800d57cc libucrt:winapi_thunks.obj + 0002:000977cc $unwind$__acrt_AppPolicyGetShowDeveloperDiagnosticInternal 00000001800d57cc libucrt:winapi_thunks.obj + 0002:000977cc $unwind$__acrt_AppPolicyGetWindowingModelInternal 00000001800d57cc libucrt:winapi_thunks.obj + 0002:000977cc $unwind$__acrt_FlsAlloc 00000001800d57cc libucrt:winapi_thunks.obj + 0002:000977cc $unwind$__acrt_FlsFree 00000001800d57cc libucrt:winapi_thunks.obj + 0002:000977cc $unwind$__acrt_FlsGetValue 00000001800d57cc libucrt:winapi_thunks.obj + 0002:000977cc $unwind$__acrt_get_parent_window 00000001800d57cc libucrt:winapi_thunks.obj + 0002:000977cc $unwind$__acrt_uninitialize_winapi_thunks 00000001800d57cc libucrt:winapi_thunks.obj + 0002:000977cc $unwind$__acrt_update_locale_info 00000001800d57cc libucrt:locale_update.obj + 0002:000977cc $unwind$__acrt_update_multibyte_info 00000001800d57cc libucrt:locale_update.obj + 0002:000977cc $unwind$__acrt_allocate_buffer_for_argv 00000001800d57cc libucrt:argv_parsing.obj + 0002:000977cc $unwind$?exit_or_terminate_process@@YAXI@Z 00000001800d57cc libucrt:exit.obj + 0002:000977cc $unwind$?try_cor_exit_process@@YAXI@Z 00000001800d57cc libucrt:exit.obj + 0002:000977cc $unwind$__acrt_uninitialize_stdio 00000001800d57cc libucrt:_file.obj + 0002:000977cc $unwind$?stream_is_at_end_of_file_nolock@@YA_NV__crt_stdio_stream@@@Z 00000001800d57cc libucrt:_flsbuf.obj + 0002:000977cc $unwind$__acrt_stdio_free_buffer_nolock 00000001800d57cc libucrt:_freebuf.obj + 0002:000977cc $unwind$_fflush_nolock 00000001800d57cc libucrt:fflush.obj + 0002:000977cc $unwind$?state_case_normal@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d57cc libucrt:output.obj + 0002:000977cc $unwind$?state_case_normal_tchar@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 00000001800d57cc libucrt:output.obj + 0002:000977cc $unwind$?type_case_c_tchar@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 00000001800d57cc libucrt:output.obj + 0002:000977cc $unwind$?type_case_s@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d57cc libucrt:output.obj + 0002:000977cc $unwind$strcpy_s 00000001800d57cc libucrt:strcpy_s.obj + 0002:000977cc $unwind$wcscat_s 00000001800d57cc libucrt:wcscat_s.obj + 0002:000977cc $unwind$wcscpy_s 00000001800d57cc libucrt:wcscpy_s.obj + 0002:000977cc $unwind$_clrfp 00000001800d57cc libucrt:fpctrl.obj + 0002:000977cc $unwind$_set_statfp 00000001800d57cc libucrt:fpctrl.obj + 0002:000977cc $unwind$_clearfp 00000001800d57cc libucrt:ieee.obj + 0002:000977cc $unwind$fegetenv 00000001800d57cc libucrt:fegetenv.obj + 0002:000977cc $unwind$feholdexcept 00000001800d57cc libucrt:feholdexcept.obj + 0002:000977cc $unwind$fesetenv 00000001800d57cc libucrt:fesetenv.obj + 0002:000977d4 $unwind$?_Doraise@bad_alloc@stdext@@MEBAXXZ 00000001800d57d4 glyph.obj + 0002:000977d4 $unwind$?_Throw_bad_array_new_length@std@@YAXXZ 00000001800d57d4 glyph.obj + 0002:000977d4 $unwind$strtol 00000001800d57d4 libucrt:strtox.obj + 0002:000977d4 $unwind$wcstol 00000001800d57d4 libucrt:strtox.obj + 0002:000977d4 $unwind$wctomb_s 00000001800d57d4 libucrt:wctomb.obj + 0002:000977d4 $unwind$_itow_s 00000001800d57d4 libucrt:xtoa.obj + 0002:000977d4 $unwind$_invalid_parameter_noinfo 00000001800d57d4 libucrt:invalid_parameter.obj + 0002:000977d4 $unwind$_invalid_parameter_noinfo_noreturn 00000001800d57d4 libucrt:invalid_parameter.obj + 0002:000977d4 $unwind$fflush 00000001800d57d4 libucrt:fflush.obj + 0002:000977d4 $unwind$_log10_special 00000001800d57d4 libucrt:log_special.obj + 0002:000977dc $unwind$?ReadGlyph@woff2@@YA_NPEBE_KPEAVGlyph@1@@Z 00000001800d57dc glyph.obj + 0002:000977f4 $unwind$?StorePoints@?A0x004d6e0c@woff2@@YA_NAEBVGlyph@2@PEA_KPEAE_K@Z 00000001800d57f4 glyph.obj + 0002:00097810 $unwind$?StoreGlyph@woff2@@YA_NAEBVGlyph@1@PEAEPEA_K@Z 00000001800d5810 glyph.obj + 0002:00097828 $unwind$??$_Resize@U_Value_init_tag@std@@@?$vector@GV?$allocator@G@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5828 brotli_bit_stream.obj + 0002:00097828 $unwind$?resize@?$vector@EV?$allocator@E@std@@@std@@QEAAX_K@Z 00000001800d5828 glyph.obj + 0002:00097828 $unwind$?NormalizeGlyphs@woff2@@YA_NPEAUFont@1@@Z 00000001800d5828 normalize.obj + 0002:0009783c $chain$0$?resize@?$vector@EV?$allocator@E@std@@@std@@QEAAX_K@Z 00000001800d583c glyph.obj + 0002:00097850 $chain$1$?resize@?$vector@EV?$allocator@E@std@@@std@@QEAAX_K@Z 00000001800d5850 glyph.obj + 0002:00097860 $chain$2$?resize@?$vector@EV?$allocator@E@std@@@std@@QEAAX_K@Z 00000001800d5860 glyph.obj + 0002:00097874 $unwind$??$_Destroy_range@V?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@std@@@std@@YAXPEAV?$vector@EV?$allocator@E@std@@@0@QEAV10@AEAV?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@0@@Z 00000001800d5874 glyph.obj + 0002:00097880 $chain$0$??$_Destroy_range@V?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@std@@@std@@YAXPEAV?$vector@EV?$allocator@E@std@@@0@QEAV10@AEAV?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@0@@Z 00000001800d5880 glyph.obj + 0002:00097894 $chain$1$??$_Destroy_range@V?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@std@@@std@@YAXPEAV?$vector@EV?$allocator@E@std@@@0@QEAV10@AEAV?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@0@@Z 00000001800d5894 glyph.obj + 0002:000978a4 $chain$2$??$_Destroy_range@V?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@std@@@std@@YAXPEAV?$vector@EV?$allocator@E@std@@@0@QEAV10@AEAV?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@0@@Z 00000001800d58a4 glyph.obj + 0002:000978b8 $unwind$??$_Destroy_range@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@std@@@std@@YAXPEAV?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@0@QEAV10@AEAV?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@0@@Z 00000001800d58b8 glyph.obj + 0002:000978c4 $chain$1$??$_Destroy_range@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@std@@@std@@YAXPEAV?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@0@QEAV10@AEAV?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@0@@Z 00000001800d58c4 glyph.obj + 0002:000978dc $chain$2$??$_Destroy_range@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@std@@@std@@YAXPEAV?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@0@QEAV10@AEAV?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@0@@Z 00000001800d58dc glyph.obj + 0002:000978ec $chain$3$??$_Destroy_range@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@std@@@std@@YAXPEAV?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@0@QEAV10@AEAV?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@0@@Z 00000001800d58ec glyph.obj + 0002:00097904 $unwind$??$push_heap@V?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@UHistogramPair@brotli@@@std@@@std@@@std@@UHistogramPairComparator@brotli@@@std@@YAXV?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@UHistogramPair@brotli@@@std@@@std@@@0@0UHistogramPairComparator@brotli@@@Z 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?_Xlength@?$vector@GV?$allocator@G@std@@@std@@CAXXZ 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?_Xlength@?$vector@HV?$allocator@H@std@@@std@@CAXXZ 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?_Xlength@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@CAXXZ 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?_Xlength@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@CAXXZ 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?_Xlength@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@CAXXZ 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?_Xlength@?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@CAXXZ 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?allocate@?$allocator@H@std@@QEAAPEAH_K@Z 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?allocate@?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@QEAAPEAU?$Histogram@$0BAA@@brotli@@_K@Z 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?allocate@?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@QEAAPEAU?$Histogram@$0CAI@@brotli@@_K@Z 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?allocate@?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@QEAAPEAU?$Histogram@$0CMA@@brotli@@_K@Z 00000001800d5904 block_splitter.obj + 0002:00097904 $unwind$?_Xlength@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@CAXXZ 00000001800d5904 entropy_encode.obj + 0002:00097904 $unwind$?_Throw_tree_length_error@std@@YAXXZ 00000001800d5904 font.obj + 0002:00097904 $unwind$?_Xlength@?$vector@IV?$allocator@I@std@@@std@@CAXXZ 00000001800d5904 font.obj + 0002:00097904 $unwind$?_Xlength@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@CAXXZ 00000001800d5904 font.obj + 0002:00097904 $unwind$?_Xlength@?$vector@EV?$allocator@E@std@@@std@@CAXXZ 00000001800d5904 glyph.obj + 0002:00097904 $unwind$?_Xlength@?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@CAXXZ 00000001800d5904 glyph.obj + 0002:00097904 $unwind$?_Xlength@?$vector@V?$vector@EV?$allocator@E@std@@@std@@V?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@2@@std@@CAXXZ 00000001800d5904 glyph.obj + 0002:00097904 $unwind$?_Xlength@?$vector@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@2@@std@@CAXXZ 00000001800d5904 glyph.obj + 0002:00097904 $unwind$?allocate@?$allocator@V?$vector@EV?$allocator@E@std@@@std@@@std@@QEAAPEAV?$vector@EV?$allocator@E@std@@@2@_K@Z 00000001800d5904 glyph.obj + 0002:00097904 $unwind$?load_exe_hook@@YAP6A_JXZIPEAUDelayLoadInfo@@@Z 00000001800d5904 win_delay_load_hook.obj + 0002:00097904 $unwind$?_Xlen_string@std@@YAXXZ 00000001800d5904 woff2_enc.obj + 0002:00097904 $unwind$?_Xlength@?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@CAXXZ 00000001800d5904 woff2_enc.obj + 0002:00097904 $unwind$?DloadReleaseSectionWriteAccess@@YAXXZ 00000001800d5904 DelayImp:delayhlp.obj + 0002:00097904 $unwind$__scrt_initialize_default_local_stdio_options 00000001800d5904 LIBCMT:default_local_stdio_options.obj + 0002:00097904 $unwind$?dllmain_crt_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 00000001800d5904 LIBCMT:dll_dllmain.obj + 0002:00097904 $unwind$__report_rangecheckfailure 00000001800d5904 LIBCMT:gs_report.obj + 0002:00097904 $unwind$__GSHandlerCheck 00000001800d5904 LIBCMT:gshandler.obj + 0002:00097904 $unwind$?__scrt_uninitialize_thread_safe_statics@@YAXXZ 00000001800d5904 LIBCMT:thread_safe_statics.obj + 0002:00097904 $unwind$_Init_thread_notify 00000001800d5904 LIBCMT:thread_safe_statics.obj + 0002:00097904 $unwind$__scrt_acquire_startup_lock 00000001800d5904 LIBCMT:utility.obj + 0002:00097904 $unwind$__scrt_dllmain_after_initialize_c 00000001800d5904 LIBCMT:utility.obj + 0002:00097904 $unwind$__scrt_dllmain_before_initialize_c 00000001800d5904 LIBCMT:utility.obj + 0002:00097904 $unwind$__scrt_dllmain_crt_thread_attach 00000001800d5904 LIBCMT:utility.obj + 0002:00097904 $unwind$__scrt_dllmain_crt_thread_detach 00000001800d5904 LIBCMT:utility.obj + 0002:00097904 $unwind$__scrt_dllmain_uninitialize_c 00000001800d5904 LIBCMT:utility.obj + 0002:00097904 $unwind$__scrt_dllmain_uninitialize_critical 00000001800d5904 LIBCMT:utility.obj + 0002:00097904 $unwind$atexit 00000001800d5904 LIBCMT:utility.obj + 0002:00097904 $unwind$__vcrt_initialize 00000001800d5904 libvcruntime:initialization.obj + 0002:00097904 $unwind$__vcrt_thread_attach 00000001800d5904 libvcruntime:initialization.obj + 0002:00097904 $unwind$__vcrt_thread_detach 00000001800d5904 libvcruntime:initialization.obj + 0002:00097904 $unwind$__vcrt_uninitialize 00000001800d5904 libvcruntime:initialization.obj + 0002:00097904 $unwind$__vcrt_uninitialize_critical 00000001800d5904 libvcruntime:initialization.obj + 0002:00097904 $unwind$__vcrt_initialize_locks 00000001800d5904 libvcruntime:locks.obj + 0002:00097904 $unwind$__vcrt_freefls 00000001800d5904 libvcruntime:per_thread_data.obj + 0002:00097904 $unwind$__vcrt_getptd 00000001800d5904 libvcruntime:per_thread_data.obj + 0002:00097904 $unwind$__vcrt_initialize_ptd 00000001800d5904 libvcruntime:per_thread_data.obj + 0002:00097904 $unwind$__vcrt_uninitialize_ptd 00000001800d5904 libvcruntime:per_thread_data.obj + 0002:00097904 $unwind$_purecall 00000001800d5904 libvcruntime:purevirt.obj + 0002:00097904 $unwind$?FrameUnwindToEmptyState@__FrameHandler4@@SAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@@Z 00000001800d5904 libvcruntime:risctrnsctrl.obj + 0002:00097904 $unwind$_GetImageBase 00000001800d5904 libvcruntime:risctrnsctrl.obj + 0002:00097904 $unwind$_GetThrowImageBase 00000001800d5904 libvcruntime:risctrnsctrl.obj + 0002:00097904 $unwind$__dcrt_terminate_console_output 00000001800d5904 libucrt:initcon.obj + 0002:00097904 $unwind$??$uninitialize_environment_internal@D@@YAXAEAPEAPEAD@Z 00000001800d5904 libucrt:environment_initialization.obj + 0002:00097904 $unwind$??$uninitialize_environment_internal@_W@@YAXAEAPEAPEA_W@Z 00000001800d5904 libucrt:environment_initialization.obj + 0002:00097904 $unwind$__dcrt_uninitialize_environments_nolock 00000001800d5904 libucrt:environment_initialization.obj + 0002:00097904 $unwind$?__c32rtomb_utf8@__crt_mbstring@@YA_KPEAD_UPEAU_Mbstatet@@@Z 00000001800d5904 libucrt:c32rtomb.obj + 0002:00097904 $unwind$__acrt_initialize_heap 00000001800d5904 libucrt:heap_handle.obj + 0002:00097904 $unwind$_msize_base 00000001800d5904 libucrt:msize.obj + 0002:00097904 $unwind$?initialize_multibyte@@YAHXZ 00000001800d5904 libucrt:multibyte_initializer.obj + 0002:00097904 $unwind$__acrt_thread_attach 00000001800d5904 libucrt:initialization.obj + 0002:00097904 $unwind$__acrt_thread_detach 00000001800d5904 libucrt:initialization.obj + 0002:00097904 $unwind$__acrt_uninitialize 00000001800d5904 libucrt:initialization.obj + 0002:00097904 $unwind$__acrt_uninitialize_critical 00000001800d5904 libucrt:initialization.obj + 0002:00097904 $unwind$initialize_c 00000001800d5904 libucrt:initialization.obj + 0002:00097904 $unwind$uninitialize_allocated_io_buffers 00000001800d5904 libucrt:initialization.obj + 0002:00097904 $unwind$uninitialize_environment 00000001800d5904 libucrt:initialization.obj + 0002:00097904 $unwind$__acrt_initialize_ptd 00000001800d5904 libucrt:per_thread_data.obj + 0002:00097904 $unwind$__acrt_uninitialize_ptd 00000001800d5904 libucrt:per_thread_data.obj + 0002:00097904 $unwind$__acrt_AreFileApisANSI 00000001800d5904 libucrt:winapi_thunks.obj + 0002:00097904 $unwind$__pctype_func 00000001800d5904 libucrt:ctype.obj + 0002:00097904 $unwind$__acrt_release_locale_ref 00000001800d5904 libucrt:locale_refcounting.obj + 0002:00097904 $unwind$_isatty 00000001800d5904 libucrt:isatty.obj + 0002:00097904 $unwind$_get_osfhandle 00000001800d5904 libucrt:osfinfo.obj + 0002:00097904 $unwind$__acrt_initialize_multibyte 00000001800d5904 libucrt:mbctype.obj + 0002:00097904 $unwind$__acrt_update_thread_multibyte_data 00000001800d5904 libucrt:mbctype.obj + 0002:00097904 $unwind$__doserrno 00000001800d5904 libucrt:errno.obj + 0002:00097904 $unwind$_errno 00000001800d5904 libucrt:errno.obj + 0002:00097904 $unwind$_invoke_watson 00000001800d5904 libucrt:invalid_parameter.obj + 0002:00097904 $unwind$_set_error_mode 00000001800d5904 libucrt:set_error_mode.obj + 0002:00097904 $unwind$abort 00000001800d5904 libucrt:abort.obj + 0002:00097904 $unwind$__acrt_initialize_command_line 00000001800d5904 libucrt:argv_data.obj + 0002:00097904 $unwind$_fileno 00000001800d5904 libucrt:fileno.obj + 0002:00097904 $unwind$?state_case_size@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5904 libucrt:output.obj + 0002:00097904 $unwind$?state_case_size@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5904 libucrt:output.obj + 0002:00097904 $unwind$?state_case_size@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5904 libucrt:output.obj + 0002:00097904 $unwind$?validate_stream_is_ansi_if_required@?$__acrt_stdio_char_traits@D@@SA_NQEAU_iobuf@@@Z 00000001800d5904 libucrt:output.obj + 0002:00097904 $unwind$_stricmp 00000001800d5904 libucrt:stricmp.obj + 0002:00097904 $unwind$_statfp 00000001800d5904 libucrt:fpctrl.obj + 0002:00097904 $unwind$_set_errno_from_matherr 00000001800d5904 libucrt:fpexcept.obj + 0002:0009790c $unwind$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d590c glyph.obj + 0002:00097918 $chain$3$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5918 glyph.obj + 0002:00097938 $chain$5$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5938 glyph.obj + 0002:00097958 $chain$6$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5958 glyph.obj + 0002:00097968 $unwind$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@2@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5968 glyph.obj + 0002:00097974 $chain$4$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@2@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5974 glyph.obj + 0002:00097998 $chain$6$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@2@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5998 glyph.obj + 0002:000979bc $chain$7$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@V?$allocator@V?$vector@UPoint@Glyph@woff2@@V?$allocator@UPoint@Glyph@woff2@@@std@@@std@@@2@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d59bc glyph.obj + 0002:000979cc $unwind$?_Change_array@?$vector@GV?$allocator@G@std@@@std@@AEAAXQEAG_K1@Z 00000001800d59cc block_splitter.obj + 0002:000979cc $unwind$?_Change_array@?$vector@HV?$allocator@H@std@@@std@@AEAAXQEAH_K1@Z 00000001800d59cc block_splitter.obj + 0002:000979cc $unwind$?_Change_array@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@AEAAXQEAU?$Histogram@$0BAA@@brotli@@_K1@Z 00000001800d59cc block_splitter.obj + 0002:000979cc $unwind$?_Change_array@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAXQEAU?$Histogram@$0CAI@@brotli@@_K1@Z 00000001800d59cc block_splitter.obj + 0002:000979cc $unwind$?_Change_array@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAXQEAU?$Histogram@$0CMA@@brotli@@_K1@Z 00000001800d59cc block_splitter.obj + 0002:000979cc $unwind$?WriteBits@brotli@@YAXH_KPEIAHPEIAE@Z 00000001800d59cc brotli_bit_stream.obj + 0002:000979cc $unwind$?SetDepth@?A0xbf9879d9@brotli@@YAXAEBUHuffmanTree@12@PEAU312@PEAEH@Z 00000001800d59cc entropy_encode.obj + 0002:000979cc $unwind$?resize@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@QEAAX_K@Z 00000001800d59cc font.obj + 0002:000979cc $unwind$?_Change_array@?$vector@EV?$allocator@E@std@@@std@@AEAAXQEAE_K1@Z 00000001800d59cc glyph.obj + 0002:000979cc $unwind$__scrt_dllmain_exception_filter 00000001800d59cc LIBCMT:utility.obj + 0002:000979cc $unwind$?Is_bad_exception_allowed@@YAEPEBU_s_ESTypeList@@@Z 00000001800d59cc libvcruntime:frame.obj + 0002:000979cc $unwind$_ischartype_l 00000001800d59cc libucrt:atox.obj + 0002:000979cc $unwind$_recalloc_base 00000001800d59cc libucrt:recalloc.obj + 0002:000979cc $unwind$__acrt_free_locale 00000001800d59cc libucrt:locale_refcounting.obj + 0002:000979cc $unwind$__acrt_lowio_create_handle_array 00000001800d59cc libucrt:osfinfo.obj + 0002:000979cc $unwind$?setSBCS@@YAXPEAU__crt_multibyte_data@@@Z 00000001800d59cc libucrt:mbctype.obj + 0002:000979cc $unwind$__acrt_show_wide_message_box 00000001800d59cc libucrt:crtmbox.obj + 0002:000979cc $unwind$_seh_filter_exe 00000001800d59cc libucrt:exception_filter.obj + 0002:000979cc $unwind$_wassert 00000001800d59cc libucrt:assert.obj + 0002:000979cc $unwind$_initterm 00000001800d59cc libucrt:initterm.obj + 0002:000979cc $unwind$??$ensure_buffer_is_big_enough@D@formatting_buffer@__crt_stdio_output@@QEAA_N_K@Z 00000001800d59cc libucrt:output.obj + 0002:000979cc $unwind$??$ensure_buffer_is_big_enough@_W@formatting_buffer@__crt_stdio_output@@QEAA_N_K@Z 00000001800d59cc libucrt:output.obj + 0002:000979e0 $unwind$?Log2Floor@brotli@@YAHI@Z 00000001800d59e0 backward_references.obj + 0002:000979e0 $unwind$?Log2Floor@woff2@@YAHI@Z 00000001800d59e0 font.obj + 0002:000979ec $unwind$??1BlockEncoder@brotli@@QEAA@XZ 00000001800d59ec brotli_bit_stream.obj + 0002:000979ec $unwind$??1BlockSplitCode@brotli@@QEAA@XZ 00000001800d59ec brotli_bit_stream.obj + 0002:000979ec $unwind$??0StaticDictionary@brotli@@QEAA@XZ 00000001800d59ec encode.obj + 0002:000979ec $unwind$??1BlockSplit@brotli@@QEAA@XZ 00000001800d59ec encode.obj + 0002:000979ec $unwind$??1MetaBlockSplit@brotli@@QEAA@XZ 00000001800d59ec encode.obj + 0002:000979ec $unwind$?OutputOrderedTags@Font@woff2@@QEBA?AV?$vector@IV?$allocator@I@std@@@std@@XZ 00000001800d59ec font.obj + 0002:000979ec $unwind$?_Buy_raw@?$vector@EV?$allocator@E@std@@@std@@AEAAX_K@Z 00000001800d59ec font.obj + 0002:000979ec $unwind$?Write@BrotliMemOut@brotli@@UEAA_NPEBX_K@Z 00000001800d59ec streams.obj + 0002:000979ec $unwind$??1GlyfEncoder@?A0x723790ab@woff2@@QEAA@XZ 00000001800d59ec transform.obj + 0002:000979ec $unwind$?Write255UShort@woff2@@YAXPEAV?$vector@EV?$allocator@E@std@@@std@@H@Z 00000001800d59ec variable_length.obj + 0002:000979ec $unwind$?DloadGetSRWLockFunctionPointers@@YAEXZ 00000001800d59ec DelayImp:delayhlp.obj + 0002:000979ec $unwind$_RTC_Initialize 00000001800d59ec LIBCMT:initsect.obj + 0002:000979ec $unwind$_RTC_Terminate 00000001800d59ec LIBCMT:initsect.obj + 0002:000979ec $unwind$?__scrt_initialize_thread_safe_statics@@YAHXZ 00000001800d59ec LIBCMT:thread_safe_statics.obj + 0002:000979ec $unwind$??_Gbad_array_new_length@std@@UEAAPEAXI@Z 00000001800d59ec LIBCMT:throw_bad_alloc.obj + 0002:000979ec $unwind$??_Gbad_alloc@std@@UEAAPEAXI@Z 00000001800d59ec libcpmt:xthrow.obj + 0002:000979ec $unwind$??_Gexception@std@@UEAAPEAXI@Z 00000001800d59ec libcpmt:xthrow.obj + 0002:000979ec $unwind$??_Glength_error@std@@UEAAPEAXI@Z 00000001800d59ec libcpmt:xthrow.obj + 0002:000979ec $unwind$??_Glogic_error@std@@UEAAPEAXI@Z 00000001800d59ec libcpmt:xthrow.obj + 0002:000979ec $unwind$??_Gout_of_range@std@@UEAAPEAXI@Z 00000001800d59ec libcpmt:xthrow.obj + 0002:000979ec $unwind$__FrameUnwindFilter 00000001800d59ec libvcruntime:ehhelpers.obj + 0002:000979ec $unwind$??_Gbad_exception@std@@UEAAPEAXI@Z 00000001800d59ec libvcruntime:frame.obj + 0002:000979ec $unwind$?ExFilterRethrowFH4@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@HPEAH@Z 00000001800d59ec libvcruntime:frame.obj + 0002:000979ec $unwind$_FindAndUnlinkFrame 00000001800d59ec libvcruntime:risctrnsctrl.obj + 0002:000979ec $unwind$__vcrt_FlsSetValue 00000001800d59ec libvcruntime:winapi_downlevel.obj + 0002:000979ec $unwind$??$common_initialize_environment_nolock@D@@YAHXZ 00000001800d59ec libucrt:environment_initialization.obj + 0002:000979ec $unwind$__acrt_fp_strflt_to_string 00000001800d59ec libucrt:_fptostr.obj + 0002:000979ec $unwind$_realloc_base 00000001800d59ec libucrt:realloc_base.obj + 0002:000979ec $unwind$?replace_current_thread_locale_nolock@@YAXQEAU__acrt_ptd@@QEAU__crt_locale_data@@@Z 00000001800d59ec libucrt:per_thread_data.obj + 0002:000979ec $unwind$__acrt_execute_uninitializers 00000001800d59ec libucrt:shared_initialization.obj + 0002:000979ec $unwind$__acrt_FlsSetValue 00000001800d59ec libucrt:winapi_thunks.obj + 0002:000979ec $unwind$__acrt_LocaleNameToLCID 00000001800d59ec libucrt:winapi_thunks.obj + 0002:000979ec $unwind$__acrt_can_show_message_box 00000001800d59ec libucrt:winapi_thunks.obj + 0002:000979ec $unwind$_updatetlocinfoEx_nolock 00000001800d59ec libucrt:locale_refcounting.obj + 0002:000979ec $unwind$_close_nolock 00000001800d59ec libucrt:close.obj + 0002:000979ec $unwind$__acrt_uninitialize_lowio 00000001800d59ec libucrt:ioinit.obj + 0002:000979ec $unwind$__acrt_errno_map_os_error 00000001800d59ec libucrt:errno.obj + 0002:000979ec $unwind$_initterm_e 00000001800d59ec libucrt:initterm.obj + 0002:000979ec $unwind$__acrt_stdio_allocate_buffer_nolock 00000001800d59ec libucrt:_getbuf.obj + 0002:000979ec $unwind$__acrt_stdio_begin_temporary_buffering_nolock 00000001800d59ec libucrt:_sftbuf.obj + 0002:000979ec $unwind$_fclose_nolock 00000001800d59ec libucrt:fclose.obj + 0002:000979ec $unwind$strncpy_s 00000001800d59ec libucrt:strncpy_s.obj + 0002:000979ec $unwind$wcsncat_s 00000001800d59ec libucrt:wcsncat_s.obj + 0002:000979f8 $unwind$?ReadTrueTypeFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@@Z 00000001800d59f8 font.obj + 0002:00097a0c $chain$2$?ReadTrueTypeFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@@Z 00000001800d5a0c font.obj + 0002:00097a28 $chain$3$?ReadTrueTypeFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@@Z 00000001800d5a28 font.obj + 0002:00097a38 $chain$4$?ReadTrueTypeFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@@Z 00000001800d5a38 font.obj + 0002:00097a54 $unwind$?ReadCollectionFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@PEAV?$map@IPEAUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@5@@std@@@Z 00000001800d5a54 font.obj + 0002:00097a5c $chain$0$?ReadCollectionFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@PEAV?$map@IPEAUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@5@@std@@@Z 00000001800d5a5c font.obj + 0002:00097a70 $chain$3$?ReadCollectionFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@PEAV?$map@IPEAUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@5@@std@@@Z 00000001800d5a70 font.obj + 0002:00097a8c $chain$4$?ReadCollectionFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@PEAV?$map@IPEAUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@5@@std@@@Z 00000001800d5a8c font.obj + 0002:00097a9c $chain$5$?ReadCollectionFont@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFont@1@PEAV?$map@IPEAUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@5@@std@@@Z 00000001800d5a9c font.obj + 0002:00097aac $unwind$?ReadTrueTypeCollection@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFontCollection@1@@Z 00000001800d5aac font.obj + 0002:00097abc $chain$3$?ReadTrueTypeCollection@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFontCollection@1@@Z 00000001800d5abc font.obj + 0002:00097adc $chain$4$?ReadTrueTypeCollection@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFontCollection@1@@Z 00000001800d5adc font.obj + 0002:00097adc $chain$8$?ReadTrueTypeCollection@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFontCollection@1@@Z 00000001800d5adc font.obj + 0002:00097af4 $chain$6$?ReadTrueTypeCollection@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFontCollection@1@@Z 00000001800d5af4 font.obj + 0002:00097b14 $chain$7$?ReadTrueTypeCollection@woff2@@YA_NPEAVBuffer@1@PEBE_KPEAUFontCollection@1@@Z 00000001800d5b14 font.obj + 0002:00097b24 $unwind$?GetGlyphData@woff2@@YA_NAEBUFont@1@HPEAPEBEPEA_K@Z 00000001800d5b24 font.obj + 0002:00097b3c $unwind$??A?$map@HHU?$less@H@std@@V?$allocator@U?$pair@$$CBHH@std@@@2@@std@@QEAAAEAHAEBH@Z 00000001800d5b3c block_splitter.obj + 0002:00097b3c $unwind$??A?$map@IPEAUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@5@@std@@QEAAAEAPEAUTable@Font@woff2@@AEBI@Z 00000001800d5b3c font.obj + 0002:00097b3c $unwind$??A?$map@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@@std@@QEAAAEAUTable@Font@woff2@@AEBI@Z 00000001800d5b3c font.obj + 0002:00097b3c $unwind$??A?$map@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@@std@@QEAAAEAUTable@Font@woff2@@$$QEAI@Z 00000001800d5b3c transform.obj + 0002:00097b3c $unwind$??A?$map@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@@std@@QEAAAEAGAEBI@Z 00000001800d5b3c woff2_enc.obj + 0002:00097b3c $unwind$__dcrt_write_console 00000001800d5b3c libucrt:initcon.obj + 0002:00097b3c $unwind$??$__acrt_wcs_to_mbs_cp@U__crt_win32_buffer_no_resizing@@@@YAHQEB_WAEAV?$__crt_win32_buffer@DU__crt_win32_buffer_no_resizing@@@@I@Z 00000001800d5b3c libucrt:getmodulefilenamea.obj + 0002:00097b50 $unwind$??$_Emplace_reallocate@AEBI@?$vector@IV?$allocator@I@std@@@std@@QEAAPEAIQEAIAEBI@Z 00000001800d5b50 font.obj + 0002:00097b60 $chain$3$??$_Emplace_reallocate@AEBI@?$vector@IV?$allocator@I@std@@@std@@QEAAPEAIQEAIAEBI@Z 00000001800d5b60 font.obj + 0002:00097b80 $chain$5$??$_Emplace_reallocate@AEBI@?$vector@IV?$allocator@I@std@@@std@@QEAAPEAIQEAIAEBI@Z 00000001800d5b80 font.obj + 0002:00097b80 $chain$7$??$_Emplace_reallocate@AEBI@?$vector@IV?$allocator@I@std@@@std@@QEAAPEAIQEAIAEBI@Z 00000001800d5b80 font.obj + 0002:00097ba0 $chain$6$??$_Emplace_reallocate@AEBI@?$vector@IV?$allocator@I@std@@@std@@QEAAPEAIQEAIAEBI@Z 00000001800d5ba0 font.obj + 0002:00097bb0 $unwind$?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@H@std@@@std@@QEAAPEAU?$_Tree_node@HPEAX@2@U?$_Tree_id@PEAU?$_Tree_node@HPEAX@std@@@2@QEAU32@@Z 00000001800d5bb0 block_splitter.obj + 0002:00097bb0 $unwind$?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBEE@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@std@@@2@QEAU32@@Z 00000001800d5bb0 block_splitter.obj + 0002:00097bb0 $unwind$?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBHH@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@std@@@2@QEAU32@@Z 00000001800d5bb0 block_splitter.obj + 0002:00097bb0 $unwind$?_Extract@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@2@V?$_Tree_unchecked_const_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@U_Iterator_base0@2@@2@@Z 00000001800d5bb0 font.obj + 0002:00097bb0 $unwind$?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBII@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBII@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBII@std@@PEAX@std@@@2@QEAU32@@Z 00000001800d5bb0 font.obj + 0002:00097bb0 $unwind$?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@std@@@2@QEAU32@@Z 00000001800d5bb0 font.obj + 0002:00097bb0 $unwind$?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@2@QEAU32@@Z 00000001800d5bb0 font.obj + 0002:00097bb0 $unwind$?_Insert_node@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIG@std@@@std@@@std@@QEAAPEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@2@U?$_Tree_id@PEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@2@QEAU32@@Z 00000001800d5bb0 woff2_enc.obj + 0002:00097bbc $unwind$??$_Erase_tree@V?$allocator@U?$_Tree_node@HPEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@H@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@HPEAX@std@@@1@PEAU?$_Tree_node@HPEAX@1@@Z 00000001800d5bbc block_splitter.obj + 0002:00097bbc $unwind$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBEE@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBEE@std@@PEAX@1@@Z 00000001800d5bbc block_splitter.obj + 0002:00097bbc $unwind$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBHH@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBHH@std@@PEAX@1@@Z 00000001800d5bbc block_splitter.obj + 0002:00097bbc $unwind$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBII@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBII@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBII@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBII@std@@PEAX@1@@Z 00000001800d5bbc font.obj + 0002:00097bbc $unwind$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIPEAUTable@Font@woff2@@@std@@PEAX@1@@Z 00000001800d5bbc font.obj + 0002:00097bbc $unwind$??$_Partition_by_median_guess_unchecked@PEAIU?$less@X@std@@@std@@YA?AU?$pair@PEAIPEAI@0@PEAI0U?$less@X@0@@Z 00000001800d5bbc font.obj + 0002:00097bbc $unwind$??$_Erase_head@V?$allocator@U?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIG@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@1@@Z 00000001800d5bbc woff2_enc.obj + 0002:00097bbc $unwind$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIG@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@1@@Z 00000001800d5bbc woff2_enc.obj + 0002:00097bbc $unwind$_DllMainCRTStartup 00000001800d5bbc LIBCMT:dll_dllmain.obj + 0002:00097bbc $unwind$__vcrt_getptd_noexit 00000001800d5bbc libvcruntime:per_thread_data.obj + 0002:00097bbc $unwind$__vcrt_InitializeCriticalSectionEx 00000001800d5bbc libvcruntime:winapi_downlevel.obj + 0002:00097bbc $unwind$memcpy_s 00000001800d5bbc libucrt:cfout.obj + 0002:00097bbc $unwind$__acrt_getptd 00000001800d5bbc libucrt:per_thread_data.obj + 0002:00097bbc $unwind$__acrt_getptd_noexit 00000001800d5bbc libucrt:per_thread_data.obj + 0002:00097bbc $unwind$__acrt_execute_initializers 00000001800d5bbc libucrt:shared_initialization.obj + 0002:00097bbc $unwind$__acrt_InitializeCriticalSectionEx 00000001800d5bbc libucrt:winapi_thunks.obj + 0002:00097bbc $unwind$?free_crt_array_internal@@YAXQEAPEBX_K@Z 00000001800d5bbc libucrt:inittime.obj + 0002:00097bbc $unwind$??$common_lseek_nolock@_J@@YA_JH_JH@Z 00000001800d5bbc libucrt:lseek.obj + 0002:00097bbc $unwind$__acrt_stdio_flush_and_write_narrow_nolock 00000001800d5bbc libucrt:_flsbuf.obj + 0002:00097bbc $unwind$__acrt_stdio_flush_and_write_wide_nolock 00000001800d5bbc libucrt:_flsbuf.obj + 0002:00097bbc $unwind$__acrt_stdio_flush_nolock 00000001800d5bbc libucrt:fflush.obj + 0002:00097bbc $unwind$??0_LocaleUpdate@@QEAA@QEAU__crt_locale_pointers@@@Z 00000001800d5bbc libucrt:output.obj + 0002:00097bbc $unwind$?type_case_Z@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5bbc libucrt:output.obj + 0002:00097bbc $unwind$?type_case_Z@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5bbc libucrt:output.obj + 0002:00097bbc $unwind$?type_case_n@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5bbc libucrt:output.obj + 0002:00097bbc $unwind$?type_case_n@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5bbc libucrt:output.obj + 0002:00097bbc $unwind$?type_case_n@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5bbc libucrt:output.obj + 0002:00097bbc $unwind$?type_case_s@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5bbc libucrt:output.obj + 0002:00097bbc $unwind$?type_case_s@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d5bbc libucrt:output.obj + 0002:00097bbc $unwind$??R@@QEBAHXZ 00000001800d5bbc libucrt:setvbuf.obj + 0002:00097bbc $unwind$_exception_enabled 00000001800d5bbc libucrt:libm_error.obj + 0002:00097bcc $unwind$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5bcc font.obj + 0002:00097bd8 $chain$4$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5bd8 font.obj + 0002:00097bfc $chain$5$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5bfc font.obj + 0002:00097c10 $chain$6$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5c10 font.obj + 0002:00097c20 $chain$8$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5c20 font.obj + 0002:00097c44 $chain$9$??$_Resize_reallocate@U_Value_init_tag@std@@@?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d5c44 font.obj + 0002:00097c54 $unwind$??$_Sort_unchecked@PEAIU?$less@X@std@@@std@@YAXPEAI0_JU?$less@X@0@@Z 00000001800d5c54 font.obj + 0002:00097c54 $unwind$??$create_environment@D@@YAQEAPEADQEAD@Z 00000001800d5c54 libucrt:environment_initialization.obj + 0002:00097c6c $unwind$??$_Guess_median_unchecked@PEAIU?$less@X@std@@@std@@YAXPEAI00U?$less@X@0@@Z 00000001800d5c6c font.obj + 0002:00097c74 $chain$0$??$_Guess_median_unchecked@PEAIU?$less@X@std@@@std@@YAXPEAI00U?$less@X@0@@Z 00000001800d5c74 font.obj + 0002:00097c88 $chain$1$??$_Guess_median_unchecked@PEAIU?$less@X@std@@@std@@YAXPEAI00U?$less@X@0@@Z 00000001800d5c88 font.obj + 0002:00097c98 $unwind$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@@Z 00000001800d5c98 font.obj + 0002:00097ca8 $chain$1$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@@Z 00000001800d5ca8 font.obj + 0002:00097cc0 $chain$2$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@@Z 00000001800d5cc0 font.obj + 0002:00097cd0 $chain$3$??$_Erase_tree@V?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@std@@@?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBIUTable@Font@woff2@@@std@@@std@@@std@@QEAAXAEAV?$allocator@U?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@std@@@1@PEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@@Z 00000001800d5cd0 font.obj + 0002:00097ce8 $unwind$??$_Copy_nodes@U_Copy_tag@?$_Tree@V?$_Tmap_traits@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@$0A@@std@@@std@@@?$_Tree@V?$_Tmap_traits@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@$0A@@std@@@std@@IEAAPEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@PEAU21@0U_Copy_tag@01@@Z 00000001800d5ce8 font.obj + 0002:00097ce8 $unwind$??$_Copy_nodes@U_Copy_tag@?$_Tree@V?$_Tmap_traits@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@$0A@@std@@@std@@@?$_Tree@V?$_Tmap_traits@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@$0A@@std@@@std@@IEAAPEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@1@PEAU21@0U_Copy_tag@01@@Z 00000001800d5ce8 woff2_enc.obj + 0002:00097cfc $chain$0$??$_Copy_nodes@U_Copy_tag@?$_Tree@V?$_Tmap_traits@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@$0A@@std@@@std@@@?$_Tree@V?$_Tmap_traits@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@$0A@@std@@@std@@IEAAPEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@PEAU21@0U_Copy_tag@01@@Z 00000001800d5cfc font.obj + 0002:00097d10 $chain$1$??$_Copy_nodes@U_Copy_tag@?$_Tree@V?$_Tmap_traits@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@$0A@@std@@@std@@@?$_Tree@V?$_Tmap_traits@IUTable@Font@woff2@@U?$less@I@std@@V?$allocator@U?$pair@$$CBIUTable@Font@woff2@@@std@@@5@$0A@@std@@@std@@IEAAPEAU?$_Tree_node@U?$pair@$$CBIUTable@Font@woff2@@@std@@PEAX@1@PEAU21@0U_Copy_tag@01@@Z 00000001800d5d10 font.obj + 0002:00097d20 $unwind$??0?$vector@EV?$allocator@E@std@@@std@@QEAA@AEBV01@@Z 00000001800d5d20 font.obj + 0002:00097d30 $chain$1$??0?$vector@EV?$allocator@E@std@@@std@@QEAA@AEBV01@@Z 00000001800d5d30 font.obj + 0002:00097d48 $chain$2$??0?$vector@EV?$allocator@E@std@@@std@@QEAA@AEBV01@@Z 00000001800d5d48 font.obj + 0002:00097d58 $unwind$fprintf 00000001800d5d58 normalize.obj + 0002:00097d58 $unwind$fwprintf 00000001800d5d58 libucrt:assert.obj + 0002:00097d64 $unwind$?WriteNormalizedLoca@?A0x1efe2f25@woff2@@YA_NHHPEAUFont@2@@Z 00000001800d5d64 normalize.obj + 0002:00097d7c $chain$0$?NormalizeGlyphs@woff2@@YA_NPEAUFont@1@@Z 00000001800d5d7c normalize.obj + 0002:00097d90 $unwind$?_Forced_rehash@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d5d90 encode.obj + 0002:00097d90 $unwind$?FixChecksums@woff2@@YA_NPEAUFont@1@@Z 00000001800d5d90 normalize.obj + 0002:00097d9c $chain$2$?FixChecksums@woff2@@YA_NPEAUFont@1@@Z 00000001800d5d9c normalize.obj + 0002:00097db8 $chain$3$?FixChecksums@woff2@@YA_NPEAUFont@1@@Z 00000001800d5db8 normalize.obj + 0002:00097dd0 $chain$4$?FixChecksums@woff2@@YA_NPEAUFont@1@@Z 00000001800d5dd0 normalize.obj + 0002:00097de0 $unwind$?NormalizeWithoutFixingChecksums@woff2@@YA_NPEAUFont@1@@Z 00000001800d5de0 normalize.obj + 0002:00097df8 $unwind$?NormalizeFontCollection@woff2@@YA_NPEAUFontCollection@1@@Z 00000001800d5df8 normalize.obj + 0002:00097e04 $chain$0$?NormalizeFontCollection@woff2@@YA_NPEAUFontCollection@1@@Z 00000001800d5e04 normalize.obj + 0002:00097e18 $chain$3$?NormalizeFontCollection@woff2@@YA_NPEAUFontCollection@1@@Z 00000001800d5e18 normalize.obj + 0002:00097e34 $chain$4$?NormalizeFontCollection@woff2@@YA_NPEAUFontCollection@1@@Z 00000001800d5e34 normalize.obj + 0002:00097e44 $chain$6$?NormalizeFontCollection@woff2@@YA_NPEAUFontCollection@1@@Z 00000001800d5e44 normalize.obj + 0002:00097e44 $chain$8$?NormalizeFontCollection@woff2@@YA_NPEAUFontCollection@1@@Z 00000001800d5e44 normalize.obj + 0002:00097e64 $unwind$?GetTransformedGlyfBytes@GlyfEncoder@?A0x723790ab@woff2@@QEAAXPEAV?$vector@EV?$allocator@E@std@@@std@@@Z 00000001800d5e64 transform.obj + 0002:00097e78 $unwind$??0BrotliCompressor@brotli@@QEAA@UBrotliParams@1@@Z 00000001800d5e78 encode.obj + 0002:00097e78 $unwind$?WriteSimpleGlyph@GlyfEncoder@?A0x723790ab@woff2@@AEAAXHAEBVGlyph@3@@Z 00000001800d5e78 transform.obj + 0002:00097e94 $unwind$?WriteCompositeGlyph@GlyfEncoder@?A0x723790ab@woff2@@AEAAXHAEBVGlyph@3@@Z 00000001800d5e94 transform.obj + 0002:00097eac $unwind$?WriteTriplet@GlyfEncoder@?A0x723790ab@woff2@@AEAAX_NHH@Z 00000001800d5eac transform.obj + 0002:00097ec0 $unwind$?TransformGlyfAndLocaTables@woff2@@YA_NPEAUFont@1@@Z 00000001800d5ec0 transform.obj + 0002:00097ed0 $chain$3$?TransformGlyfAndLocaTables@woff2@@YA_NPEAUFont@1@@Z 00000001800d5ed0 transform.obj + 0002:00097ef0 $chain$5$?TransformGlyfAndLocaTables@woff2@@YA_NPEAUFont@1@@Z 00000001800d5ef0 transform.obj + 0002:00097f10 $unwind$??$emplace_back@AEBE@?$vector@EV?$allocator@E@std@@@std@@QEAAXAEBE@Z 00000001800d5f10 transform.obj + 0002:00097f10 $unwind$??$emplace_back@E@?$vector@EV?$allocator@E@std@@@std@@QEAAX$$QEAE@Z 00000001800d5f10 transform.obj + 0002:00097f1c $chain$3$??$emplace_back@AEBE@?$vector@EV?$allocator@E@std@@@std@@QEAAXAEBE@Z 00000001800d5f1c transform.obj + 0002:00097f1c $chain$3$??$emplace_back@E@?$vector@EV?$allocator@E@std@@@std@@QEAAX$$QEAE@Z 00000001800d5f1c transform.obj + 0002:00097f3c $chain$5$??$emplace_back@AEBE@?$vector@EV?$allocator@E@std@@@std@@QEAAXAEBE@Z 00000001800d5f3c transform.obj + 0002:00097f3c $chain$5$??$emplace_back@E@?$vector@EV?$allocator@E@std@@@std@@QEAAX$$QEAE@Z 00000001800d5f3c transform.obj + 0002:00097f54 $chain$6$??$emplace_back@AEBE@?$vector@EV?$allocator@E@std@@@std@@QEAAXAEBE@Z 00000001800d5f54 transform.obj + 0002:00097f54 $chain$6$??$emplace_back@E@?$vector@EV?$allocator@E@std@@@std@@QEAAX$$QEAE@Z 00000001800d5f54 transform.obj + 0002:00097f74 $unwind$?Store255UShort@woff2@@YAXHPEA_KPEAE@Z 00000001800d5f74 variable_length.obj + 0002:00097f88 $unwind$?Compress@?A0x5b9939dd@woff2@@YA_NPEBE_KPEAEPEAIW4Mode@BrotliParams@brotli@@@Z 00000001800d5f88 woff2_enc.obj + 0002:00097fac $unwind$?StoreTableEntry@?A0x5b9939dd@woff2@@YAXAEBUTable@2@PEA_KPEAE@Z 00000001800d5fac woff2_enc.obj + 0002:00097fbc $chain$0$?StoreTableEntry@?A0x5b9939dd@woff2@@YAXAEBUTable@2@PEA_KPEAE@Z 00000001800d5fbc woff2_enc.obj + 0002:00097fd0 $chain$2$?StoreTableEntry@?A0x5b9939dd@woff2@@YAXAEBUTable@2@PEA_KPEAE@Z 00000001800d5fd0 woff2_enc.obj + 0002:00097fe8 $chain$3$?StoreTableEntry@?A0x5b9939dd@woff2@@YAXAEBUTable@2@PEA_KPEAE@Z 00000001800d5fe8 woff2_enc.obj + 0002:00097ff8 $chain$4$?StoreTableEntry@?A0x5b9939dd@woff2@@YAXAEBUTable@2@PEA_KPEAE@Z 00000001800d5ff8 woff2_enc.obj + 0002:00098008 $unwind$?ComputeWoff2Length@?A0x5b9939dd@woff2@@YA_KAEBUFontCollection@2@AEBV?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@V?$map@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@@5@_K@Z 00000001800d6008 woff2_enc.obj + 0002:00098014 $chain$3$?ComputeWoff2Length@?A0x5b9939dd@woff2@@YA_KAEBUFontCollection@2@AEBV?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@V?$map@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@@5@_K@Z 00000001800d6014 woff2_enc.obj + 0002:00098034 $chain$4$?ComputeWoff2Length@?A0x5b9939dd@woff2@@YA_KAEBUFontCollection@2@AEBV?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@V?$map@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@@5@_K@Z 00000001800d6034 woff2_enc.obj + 0002:00098048 $chain$5$?ComputeWoff2Length@?A0x5b9939dd@woff2@@YA_KAEBUFontCollection@2@AEBV?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@V?$map@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@@5@_K@Z 00000001800d6048 woff2_enc.obj + 0002:00098058 $chain$6$?ComputeWoff2Length@?A0x5b9939dd@woff2@@YA_KAEBUFontCollection@2@AEBV?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@V?$map@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@@5@_K@Z 00000001800d6058 woff2_enc.obj + 0002:00098068 $unwind$?ConvertTTFToWOFF2@woff2@@YA_NPEBE_KPEAEPEA_KAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 00000001800d6068 woff2_enc.obj + 0002:00098080 $unwind$??1?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@QEAA@XZ 00000001800d6080 woff2_enc.obj + 0002:0009808c $chain$0$??1?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@QEAA@XZ 00000001800d608c woff2_enc.obj + 0002:000980a0 $chain$1$??1?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@QEAA@XZ 00000001800d60a0 woff2_enc.obj + 0002:000980b4 $chain$2$??1?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@QEAA@XZ 00000001800d60b4 woff2_enc.obj + 0002:000980c4 $chain$3$??1?$vector@UFont@woff2@@V?$allocator@UFont@woff2@@@std@@@std@@QEAA@XZ 00000001800d60c4 woff2_enc.obj + 0002:000980d4 $unwind$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@QEBD_K@Z 00000001800d60d4 woff2_enc.obj + 0002:000980e8 $chain$0$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@QEBD_K@Z 00000001800d60e8 woff2_enc.obj + 0002:000980fc $chain$1$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@QEBD_K@Z 00000001800d60fc woff2_enc.obj + 0002:000980fc $chain$3$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@QEBD_K@Z 00000001800d60fc woff2_enc.obj + 0002:0009810c $chain$2$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@QEBD_K@Z 00000001800d610c woff2_enc.obj + 0002:0009810c $chain$4$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@QEBD_K@Z 00000001800d610c woff2_enc.obj + 0002:00098120 $unwind$??$_Emplace_reallocate@AEBUTable@woff2@@@?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@QEAAPEAUTable@woff2@@QEAU23@AEBU23@@Z 00000001800d6120 woff2_enc.obj + 0002:00098130 $chain$3$??$_Emplace_reallocate@AEBUTable@woff2@@@?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@QEAAPEAUTable@woff2@@QEAU23@AEBU23@@Z 00000001800d6130 woff2_enc.obj + 0002:00098150 $chain$5$??$_Emplace_reallocate@AEBUTable@woff2@@@?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@QEAAPEAUTable@woff2@@QEAU23@AEBU23@@Z 00000001800d6150 woff2_enc.obj + 0002:00098150 $chain$7$??$_Emplace_reallocate@AEBUTable@woff2@@@?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@QEAAPEAUTable@woff2@@QEAU23@AEBU23@@Z 00000001800d6150 woff2_enc.obj + 0002:00098170 $chain$6$??$_Emplace_reallocate@AEBUTable@woff2@@@?$vector@UTable@woff2@@V?$allocator@UTable@woff2@@@std@@@std@@QEAAPEAUTable@woff2@@QEAU23@AEBU23@@Z 00000001800d6170 woff2_enc.obj + 0002:00098180 $chain$0$??$_Copy_nodes@U_Copy_tag@?$_Tree@V?$_Tmap_traits@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@$0A@@std@@@std@@@?$_Tree@V?$_Tmap_traits@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@$0A@@std@@@std@@IEAAPEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@1@PEAU21@0U_Copy_tag@01@@Z 00000001800d6180 woff2_enc.obj + 0002:00098194 $chain$1$??$_Copy_nodes@U_Copy_tag@?$_Tree@V?$_Tmap_traits@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@$0A@@std@@@std@@@?$_Tree@V?$_Tmap_traits@IGU?$less@I@std@@V?$allocator@U?$pair@$$CBIG@std@@@2@$0A@@std@@@std@@IEAAPEAU?$_Tree_node@U?$pair@$$CBIG@std@@PEAX@1@PEAU21@0U_Copy_tag@01@@Z 00000001800d6194 woff2_enc.obj + 0002:000981a4 $unwind$?GetLengthCode@brotli@@YAXHHHPEAGPEA_K@Z 00000001800d61a4 backward_references.obj + 0002:000981bc $unwind$?CreateBackwardReferences@brotli@@YAX_K0PEBE0PEBM0_KNHPEAUHashers@1@HPEAH5PEAUCommand@1@5@Z 00000001800d61bc backward_references.obj + 0002:000981c4 $unwind$??$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BA@$00@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BA@$00@0@PEAH5PEAUCommand@0@5@Z 00000001800d61c4 backward_references.obj + 0002:000981d8 $chain$5$??$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BA@$00@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BA@$00@0@PEAH5PEAUCommand@0@5@Z 00000001800d61d8 backward_references.obj + 0002:00098200 $chain$6$??$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BA@$00@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BA@$00@0@PEAH5PEAUCommand@0@5@Z 00000001800d6200 backward_references.obj + 0002:00098210 $unwind$??$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BB@$03@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BB@$03@0@PEAH5PEAUCommand@0@5@Z 00000001800d6210 backward_references.obj + 0002:00098224 $chain$5$??$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BB@$03@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BB@$03@0@PEAH5PEAUCommand@0@5@Z 00000001800d6224 backward_references.obj + 0002:0009824c $chain$6$??$CreateBackwardReferences@V?$HashLongestMatchQuickly@$0BB@$03@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatchQuickly@$0BB@$03@0@PEAH5PEAUCommand@0@5@Z 00000001800d624c backward_references.obj + 0002:0009825c $unwind$??$CreateBackwardReferences@V?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d625c backward_references.obj + 0002:0009825c $unwind$??$CreateBackwardReferences@V?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d625c backward_references.obj + 0002:0009825c $unwind$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d625c backward_references.obj + 0002:0009825c $unwind$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d625c backward_references.obj + 0002:0009825c $unwind$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d625c backward_references.obj + 0002:00098274 $chain$4$??$CreateBackwardReferences@V?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6274 backward_references.obj + 0002:00098298 $chain$5$??$CreateBackwardReferences@V?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6298 backward_references.obj + 0002:000982a8 $chain$4$??$CreateBackwardReferences@V?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d62a8 backward_references.obj + 0002:000982cc $chain$5$??$CreateBackwardReferences@V?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d62cc backward_references.obj + 0002:000982dc $chain$4$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d62dc backward_references.obj + 0002:00098300 $chain$5$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6300 backward_references.obj + 0002:00098310 $chain$4$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6310 backward_references.obj + 0002:00098334 $chain$5$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6334 backward_references.obj + 0002:00098344 $chain$4$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6344 backward_references.obj + 0002:00098368 $chain$5$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@$0A@$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6368 backward_references.obj + 0002:00098378 $unwind$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$00$00@brotli@@$00$00@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$00$00@0@PEAH5PEAUCommand@0@5@Z 00000001800d6378 backward_references.obj + 0002:000983a4 $chain$6$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$00$00@brotli@@$00$00@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$00$00@0@PEAH5PEAUCommand@0@5@Z 00000001800d63a4 backward_references.obj + 0002:000983d0 $chain$7$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$03$0BA@$00$00@brotli@@$00$00@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$03$0BA@$00$00@0@PEAH5PEAUCommand@0@5@Z 00000001800d63d0 backward_references.obj + 0002:000983e0 $unwind$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@$00$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d63e0 backward_references.obj + 0002:00098408 $chain$6$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@$00$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6408 backward_references.obj + 0002:00098434 $chain$7$??$CreateBackwardReferences@V?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@$00$0A@@brotli@@YAX_K0PEBE0PEBM0_KNHPEAV?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@0@PEAH5PEAUCommand@0@5@Z 00000001800d6434 backward_references.obj + 0002:00098444 $unwind$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6444 backward_references.obj + 0002:0009846c $chain$0$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d646c backward_references.obj + 0002:00098480 $chain$2$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6480 backward_references.obj + 0002:00098498 $chain$4$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6498 backward_references.obj + 0002:000984b0 $chain$5$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d64b0 backward_references.obj + 0002:000984c0 $chain$6$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d64c0 backward_references.obj + 0002:000984d8 $chain$7$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d64d8 backward_references.obj + 0002:000984ec $chain$8$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d64ec backward_references.obj + 0002:00098504 $chain$9$?FindLongestMatch@?$HashLongestMatch@$0P@$07$01$0BA@$00$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6504 backward_references.obj + 0002:00098518 $unwind$?FindLongestMatch@?$HashLongestMatch@$0P@$07$03$0BA@$00$00@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6518 backward_references.obj + 0002:0009854c $chain$0$?FindLongestMatch@?$HashLongestMatch@$0P@$07$03$0BA@$00$00@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d654c backward_references.obj + 0002:00098560 $unwind$?FindLongestMatch@?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6560 backward_references.obj + 0002:00098584 $chain$2$?FindLongestMatch@?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6584 backward_references.obj + 0002:0009859c $chain$3$?FindLongestMatch@?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d659c backward_references.obj + 0002:000985b0 $chain$4$?FindLongestMatch@?$HashLongestMatch@$0P@$07$03$0BA@$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d65b0 backward_references.obj + 0002:000985c4 $unwind$?FindLongestMatch@?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d65c4 backward_references.obj + 0002:000985c4 $unwind$?FindLongestMatch@?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d65c4 backward_references.obj + 0002:000985e8 $chain$1$?FindLongestMatch@?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d65e8 backward_references.obj + 0002:000985fc $chain$2$?FindLongestMatch@?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d65fc backward_references.obj + 0002:00098610 $chain$3$?FindLongestMatch@?$HashLongestMatch@$0P@$06$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6610 backward_references.obj + 0002:00098624 $chain$1$?FindLongestMatch@?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6624 backward_references.obj + 0002:00098638 $chain$2$?FindLongestMatch@?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6638 backward_references.obj + 0002:0009864c $chain$3$?FindLongestMatch@?$HashLongestMatch@$0P@$05$03$09$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d664c backward_references.obj + 0002:00098660 $unwind$?FindLongestMatch@?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6660 backward_references.obj + 0002:00098660 $unwind$?FindLongestMatch@?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6660 backward_references.obj + 0002:00098684 $chain$0$?FindLongestMatch@?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6684 backward_references.obj + 0002:00098698 $chain$1$?FindLongestMatch@?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6698 backward_references.obj + 0002:000986ac $chain$2$?FindLongestMatch@?$HashLongestMatch@$0O@$04$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d66ac backward_references.obj + 0002:000986c0 $chain$0$?FindLongestMatch@?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d66c0 backward_references.obj + 0002:000986d4 $chain$1$?FindLongestMatch@?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d66d4 backward_references.obj + 0002:000986e8 $chain$2$?FindLongestMatch@?$HashLongestMatch@$0O@$03$03$03$0A@$0A@@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d66e8 backward_references.obj + 0002:000986fc $unwind$?FindLongestMatch@?$HashLongestMatchQuickly@$0BB@$03@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d66fc backward_references.obj + 0002:0009871c $chain$1$?FindLongestMatch@?$HashLongestMatchQuickly@$0BB@$03@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d671c backward_references.obj + 0002:00098734 $chain$2$?FindLongestMatch@?$HashLongestMatchQuickly@$0BB@$03@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6734 backward_references.obj + 0002:00098748 $chain$3$?FindLongestMatch@?$HashLongestMatchQuickly@$0BB@$03@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6748 backward_references.obj + 0002:0009875c $unwind$?FindLongestMatch@?$HashLongestMatchQuickly@$0BA@$00@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d675c backward_references.obj + 0002:00098778 $chain$0$?FindLongestMatch@?$HashLongestMatchQuickly@$0BA@$00@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d6778 backward_references.obj + 0002:0009878c $chain$1$?FindLongestMatch@?$HashLongestMatchQuickly@$0BA@$00@brotli@@QEAA_NPEIBE_KPEIBM1NPEIBHIIIPEIAH44PEIAN@Z 00000001800d678c backward_references.obj + 0002:0009879c $unwind$?HuffmanBitCost@brotli@@YAHPEBEH@Z 00000001800d679c block_splitter.obj + 0002:000987bc $unwind$?ClusterCostDiff@brotli@@YANHH@Z 00000001800d67bc block_splitter.obj + 0002:000987e0 $unwind$?BitCost@brotli@@YAMHH@Z 00000001800d67e0 block_splitter.obj + 0002:000987f0 $unwind$?RemapBlockIds@brotli@@YAHPEAE_K@Z 00000001800d67f0 block_splitter.obj + 0002:0009880c $unwind$?BuildBlockSplit@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@PEAUBlockSplit@1@@Z 00000001800d680c block_splitter.obj + 0002:0009881c $chain$0$?BuildBlockSplit@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@PEAUBlockSplit@1@@Z 00000001800d681c block_splitter.obj + 0002:00098830 $chain$1$?BuildBlockSplit@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@PEAUBlockSplit@1@@Z 00000001800d6830 block_splitter.obj + 0002:00098840 $unwind$?SplitBlock@brotli@@YAXPEBUCommand@1@_KPEBEPEAUBlockSplit@1@33@Z 00000001800d6840 block_splitter.obj + 0002:0009884c $chain$6$?SplitBlock@brotli@@YAXPEBUCommand@1@_KPEBEPEAUBlockSplit@1@33@Z 00000001800d684c block_splitter.obj + 0002:00098878 $chain$7$?SplitBlock@brotli@@YAXPEBUCommand@1@_KPEBEPEAUBlockSplit@1@33@Z 00000001800d6878 block_splitter.obj + 0002:00098888 $unwind$??A?$map@EEU?$less@E@std@@V?$allocator@U?$pair@$$CBEE@std@@@2@@std@@QEAAAEAEAEBE@Z 00000001800d6888 block_splitter.obj + 0002:00098888 $unwind$?x_ismbbtype_l@@YAHPEAU__crt_locale_pointers@@IHH@Z 00000001800d6888 libucrt:ismbbyte.obj + 0002:00098898 $unwind$?push_back@?$vector@HV?$allocator@H@std@@@std@@QEAAX$$QEAH@Z 00000001800d6898 block_splitter.obj + 0002:00098898 $unwind$?push_back@?$vector@HV?$allocator@H@std@@@std@@QEAAXAEBH@Z 00000001800d6898 block_splitter.obj + 0002:000988a4 $chain$3$?push_back@?$vector@HV?$allocator@H@std@@@std@@QEAAX$$QEAH@Z 00000001800d68a4 block_splitter.obj + 0002:000988a4 $chain$3$?push_back@?$vector@HV?$allocator@H@std@@@std@@QEAAXAEBH@Z 00000001800d68a4 block_splitter.obj + 0002:000988c4 $chain$5$?push_back@?$vector@HV?$allocator@H@std@@@std@@QEAAX$$QEAH@Z 00000001800d68c4 block_splitter.obj + 0002:000988c4 $chain$5$?push_back@?$vector@HV?$allocator@H@std@@@std@@QEAAXAEBH@Z 00000001800d68c4 block_splitter.obj + 0002:000988dc $unwind$??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d68dc block_splitter.obj + 0002:000988f4 $chain$0$??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d68f4 block_splitter.obj + 0002:00098908 $chain$3$??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6908 block_splitter.obj + 0002:00098924 $chain$4$??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6924 block_splitter.obj + 0002:00098938 $chain$5$??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6938 block_splitter.obj + 0002:00098948 $chain$6$??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6948 block_splitter.obj + 0002:00098958 $chain$7$??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6958 block_splitter.obj + 0002:00098968 $chain$8$??$SplitByteVector@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6968 block_splitter.obj + 0002:00098988 $unwind$??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6988 block_splitter.obj + 0002:000989a0 $chain$0$??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d69a0 block_splitter.obj + 0002:000989b4 $chain$3$??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d69b4 block_splitter.obj + 0002:000989d0 $chain$4$??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d69d0 block_splitter.obj + 0002:000989e4 $chain$5$??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d69e4 block_splitter.obj + 0002:000989f4 $chain$6$??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d69f4 block_splitter.obj + 0002:00098a04 $chain$7$??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6a04 block_splitter.obj + 0002:00098a14 $chain$8$??$SplitByteVector@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXAEBV?$vector@GV?$allocator@G@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6a14 block_splitter.obj + 0002:00098a34 $unwind$??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6a34 block_splitter.obj + 0002:00098a4c $chain$0$??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6a4c block_splitter.obj + 0002:00098a60 $chain$3$??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6a60 block_splitter.obj + 0002:00098a7c $chain$4$??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6a7c block_splitter.obj + 0002:00098a90 $chain$5$??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6a90 block_splitter.obj + 0002:00098aa0 $chain$6$??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6aa0 block_splitter.obj + 0002:00098ab0 $chain$7$??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6ab0 block_splitter.obj + 0002:00098ac0 $chain$8$??$SplitByteVector@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXAEBV?$vector@EV?$allocator@E@std@@@std@@HHHNPEAUBlockSplit@0@@Z 00000001800d6ac0 block_splitter.obj + 0002:00098ae0 $unwind$??$_Emplace_reallocate@AEBG@?$vector@GV?$allocator@G@std@@@std@@QEAAPEAGQEAGAEBG@Z 00000001800d6ae0 block_splitter.obj + 0002:00098af0 $chain$3$??$_Emplace_reallocate@AEBG@?$vector@GV?$allocator@G@std@@@std@@QEAAPEAGQEAGAEBG@Z 00000001800d6af0 block_splitter.obj + 0002:00098b10 $chain$5$??$_Emplace_reallocate@AEBG@?$vector@GV?$allocator@G@std@@@std@@QEAAPEAGQEAGAEBG@Z 00000001800d6b10 block_splitter.obj + 0002:00098b10 $chain$7$??$_Emplace_reallocate@AEBG@?$vector@GV?$allocator@G@std@@@std@@QEAAPEAGQEAGAEBG@Z 00000001800d6b10 block_splitter.obj + 0002:00098b2c $chain$6$??$_Emplace_reallocate@AEBG@?$vector@GV?$allocator@G@std@@@std@@QEAAPEAGQEAGAEBG@Z 00000001800d6b2c block_splitter.obj + 0002:00098b3c $unwind$??$RefineEntropyCodes@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXPEBE_K1PEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@@Z 00000001800d6b3c block_splitter.obj + 0002:00098b58 $chain$2$??$RefineEntropyCodes@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXPEBE_K1PEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@@Z 00000001800d6b58 block_splitter.obj + 0002:00098b74 $chain$3$??$RefineEntropyCodes@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXPEBE_K1PEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@@Z 00000001800d6b74 block_splitter.obj + 0002:00098b84 $unwind$??$FindBlocks@E$0BAA@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6b84 block_splitter.obj + 0002:00098b84 $unwind$??$FindBlocks@E$0CAI@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAE@Z 00000001800d6b84 block_splitter.obj + 0002:00098b94 $chain$4$??$FindBlocks@E$0BAA@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6b94 block_splitter.obj + 0002:00098bb8 $chain$5$??$FindBlocks@E$0BAA@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6bb8 block_splitter.obj + 0002:00098bcc $chain$6$??$FindBlocks@E$0BAA@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6bcc block_splitter.obj + 0002:00098bdc $chain$7$??$FindBlocks@E$0BAA@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6bdc block_splitter.obj + 0002:00098bf4 $chain$8$??$FindBlocks@E$0BAA@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6bf4 block_splitter.obj + 0002:00098c04 $unwind$??$ClusterBlocks@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXPEBE_KPEAE@Z 00000001800d6c04 block_splitter.obj + 0002:00098c20 $chain$1$??$ClusterBlocks@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXPEBE_KPEAE@Z 00000001800d6c20 block_splitter.obj + 0002:00098c38 $chain$2$??$ClusterBlocks@U?$Histogram@$0BAA@@brotli@@E@brotli@@YAXPEBE_KPEAE@Z 00000001800d6c38 block_splitter.obj + 0002:00098c48 $unwind$??$RefineEntropyCodes@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXPEBG_K1PEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@@Z 00000001800d6c48 block_splitter.obj + 0002:00098c64 $chain$2$??$RefineEntropyCodes@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXPEBG_K1PEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@@Z 00000001800d6c64 block_splitter.obj + 0002:00098c80 $chain$3$??$RefineEntropyCodes@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXPEBG_K1PEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@@Z 00000001800d6c80 block_splitter.obj + 0002:00098c90 $unwind$??$FindBlocks@G$0CMA@@brotli@@YAXPEBG_KNAEBV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6c90 block_splitter.obj + 0002:00098ca0 $chain$0$??$FindBlocks@G$0CMA@@brotli@@YAXPEBG_KNAEBV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6ca0 block_splitter.obj + 0002:00098cb4 $chain$4$??$FindBlocks@G$0CMA@@brotli@@YAXPEBG_KNAEBV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6cb4 block_splitter.obj + 0002:00098cd4 $chain$5$??$FindBlocks@G$0CMA@@brotli@@YAXPEBG_KNAEBV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6cd4 block_splitter.obj + 0002:00098ce8 $chain$6$??$FindBlocks@G$0CMA@@brotli@@YAXPEBG_KNAEBV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6ce8 block_splitter.obj + 0002:00098cf8 $chain$7$??$FindBlocks@G$0CMA@@brotli@@YAXPEBG_KNAEBV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6cf8 block_splitter.obj + 0002:00098d10 $chain$8$??$FindBlocks@G$0CMA@@brotli@@YAXPEBG_KNAEBV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAE@Z 00000001800d6d10 block_splitter.obj + 0002:00098d20 $unwind$??$ClusterBlocks@U?$Histogram@$0CMA@@brotli@@G@brotli@@YAXPEBG_KPEAE@Z 00000001800d6d20 block_splitter.obj + 0002:00098d44 $unwind$??$RefineEntropyCodes@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXPEBE_K1PEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@@Z 00000001800d6d44 block_splitter.obj + 0002:00098d60 $chain$2$??$RefineEntropyCodes@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXPEBE_K1PEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@@Z 00000001800d6d60 block_splitter.obj + 0002:00098d7c $chain$3$??$RefineEntropyCodes@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXPEBE_K1PEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@@Z 00000001800d6d7c block_splitter.obj + 0002:00098d8c $chain$4$??$FindBlocks@E$0CAI@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAE@Z 00000001800d6d8c block_splitter.obj + 0002:00098db0 $chain$5$??$FindBlocks@E$0CAI@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAE@Z 00000001800d6db0 block_splitter.obj + 0002:00098dc4 $chain$6$??$FindBlocks@E$0CAI@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAE@Z 00000001800d6dc4 block_splitter.obj + 0002:00098dd4 $chain$7$??$FindBlocks@E$0CAI@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAE@Z 00000001800d6dd4 block_splitter.obj + 0002:00098dec $chain$8$??$FindBlocks@E$0CAI@@brotli@@YAXPEBE_KNAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAE@Z 00000001800d6dec block_splitter.obj + 0002:00098dfc $unwind$??$ClusterBlocks@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXPEBE_KPEAE@Z 00000001800d6dfc block_splitter.obj + 0002:00098e18 $chain$1$??$ClusterBlocks@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXPEBE_KPEAE@Z 00000001800d6e18 block_splitter.obj + 0002:00098e30 $chain$2$??$ClusterBlocks@U?$Histogram@$0CAI@@brotli@@E@brotli@@YAXPEBE_KPEAE@Z 00000001800d6e30 block_splitter.obj + 0002:00098e40 $unwind$?push_back@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CAI@@brotli@@@Z 00000001800d6e40 block_splitter.obj + 0002:00098e40 $unwind$?push_back@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CMA@@brotli@@@Z 00000001800d6e40 block_splitter.obj + 0002:00098e4c $chain$3$?push_back@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CAI@@brotli@@@Z 00000001800d6e4c block_splitter.obj + 0002:00098e6c $chain$4$?push_back@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CAI@@brotli@@@Z 00000001800d6e6c block_splitter.obj + 0002:00098e80 $chain$5$?push_back@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CAI@@brotli@@@Z 00000001800d6e80 block_splitter.obj + 0002:00098e90 $chain$7$?push_back@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CAI@@brotli@@@Z 00000001800d6e90 block_splitter.obj + 0002:00098ea8 $chain$3$?push_back@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CMA@@brotli@@@Z 00000001800d6ea8 block_splitter.obj + 0002:00098ec8 $chain$4$?push_back@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CMA@@brotli@@@Z 00000001800d6ec8 block_splitter.obj + 0002:00098edc $chain$5$?push_back@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CMA@@brotli@@@Z 00000001800d6edc block_splitter.obj + 0002:00098eec $chain$7$?push_back@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0CMA@@brotli@@@Z 00000001800d6eec block_splitter.obj + 0002:00098f04 $unwind$??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d6f04 block_splitter.obj + 0002:00098f04 $unwind$??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d6f04 block_splitter.obj + 0002:00098f04 $unwind$?resize@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAX_K@Z 00000001800d6f04 block_splitter.obj + 0002:00098f14 $chain$2$?resize@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAX_K@Z 00000001800d6f14 block_splitter.obj + 0002:00098f30 $chain$3$?resize@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAX_K@Z 00000001800d6f30 block_splitter.obj + 0002:00098f40 $chain$4$?resize@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAX_K@Z 00000001800d6f40 block_splitter.obj + 0002:00098f54 $unwind$?push_back@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0BAA@@brotli@@@Z 00000001800d6f54 block_splitter.obj + 0002:00098f60 $chain$2$?push_back@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0BAA@@brotli@@@Z 00000001800d6f60 block_splitter.obj + 0002:00098f7c $chain$4$?push_back@?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@QEAAXAEBU?$Histogram@$0BAA@@brotli@@@Z 00000001800d6f7c block_splitter.obj + 0002:00098f94 $unwind$??$ClusterHistograms@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@HHHPEAV12@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d6f94 block_splitter.obj + 0002:00098fa8 $chain$1$??$ClusterHistograms@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@HHHPEAV12@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d6fa8 block_splitter.obj + 0002:00098fc0 $chain$2$??$ClusterHistograms@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXAEBV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@HHHPEAV12@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d6fc0 block_splitter.obj + 0002:00098fd0 $unwind$??$ClusterHistograms@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@HHHPEAV12@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d6fd0 block_splitter.obj + 0002:00098fe4 $chain$1$??$ClusterHistograms@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@HHHPEAV12@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d6fe4 block_splitter.obj + 0002:00098ffc $chain$2$??$ClusterHistograms@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXAEBV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@HHHPEAV12@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d6ffc block_splitter.obj + 0002:0009900c $chain$2$??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d700c block_splitter.obj + 0002:00099028 $chain$3$??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d7028 block_splitter.obj + 0002:00099038 $chain$4$??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d7038 block_splitter.obj + 0002:0009904c $chain$2$??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d704c block_splitter.obj + 0002:00099068 $chain$3$??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d7068 block_splitter.obj + 0002:00099078 $chain$4$??$_Resize@U_Value_init_tag@std@@@?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d7078 block_splitter.obj + 0002:0009908c $unwind$?resize@?$vector@HV?$allocator@H@std@@@std@@QEAAX_K@Z 00000001800d708c block_splitter.obj + 0002:000990a0 $chain$0$?resize@?$vector@HV?$allocator@H@std@@@std@@QEAAX_K@Z 00000001800d70a0 block_splitter.obj + 0002:000990b4 $chain$1$?resize@?$vector@HV?$allocator@H@std@@@std@@QEAAX_K@Z 00000001800d70b4 block_splitter.obj + 0002:000990c4 $chain$2$?resize@?$vector@HV?$allocator@H@std@@@std@@QEAAX_K@Z 00000001800d70c4 block_splitter.obj + 0002:000990d8 $unwind$??$PopulationCost@$0BAA@@brotli@@YANAEBU?$Histogram@$0BAA@@0@@Z 00000001800d70d8 block_splitter.obj + 0002:000990f4 $unwind$??$HistogramCombine@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAU?$Histogram@$0BAA@@0@PEAH1HH@Z 00000001800d70f4 block_splitter.obj + 0002:000990f4 $unwind$??$HistogramCombine@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAU?$Histogram@$0CMA@@0@PEAH1HH@Z 00000001800d70f4 block_splitter.obj + 0002:00099114 $chain$0$??$HistogramCombine@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAU?$Histogram@$0BAA@@0@PEAH1HH@Z 00000001800d7114 block_splitter.obj + 0002:00099128 $chain$1$??$HistogramCombine@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAU?$Histogram@$0BAA@@0@PEAH1HH@Z 00000001800d7128 block_splitter.obj + 0002:00099138 $unwind$??$HistogramRemap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@HPEAU10@PEAH@Z 00000001800d7138 block_splitter.obj + 0002:00099138 $unwind$??$HistogramRemap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@HPEAU10@PEAH@Z 00000001800d7138 block_splitter.obj + 0002:00099150 $chain$0$??$HistogramRemap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@HPEAU10@PEAH@Z 00000001800d7150 block_splitter.obj + 0002:00099164 $chain$1$??$HistogramRemap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@HPEAU10@PEAH@Z 00000001800d7164 block_splitter.obj + 0002:00099174 $unwind$??$HistogramReindex@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d7174 block_splitter.obj + 0002:00099174 $unwind$??$HistogramReindex@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d7174 block_splitter.obj + 0002:00099174 $unwind$??$HistogramReindex@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d7174 block_splitter.obj + 0002:0009917c $chain$0$??$HistogramReindex@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d717c block_splitter.obj + 0002:00099190 $chain$5$??$HistogramReindex@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d7190 block_splitter.obj + 0002:000991b4 $chain$6$??$HistogramReindex@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d71b4 block_splitter.obj + 0002:000991c8 $chain$7$??$HistogramReindex@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d71c8 block_splitter.obj + 0002:000991d8 $chain$8$??$HistogramReindex@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d71d8 block_splitter.obj + 0002:000991f0 $chain$9$??$HistogramReindex@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d71f0 block_splitter.obj + 0002:00099200 $unwind$??$PopulationCost@$0CMA@@brotli@@YANAEBU?$Histogram@$0CMA@@0@@Z 00000001800d7200 block_splitter.obj + 0002:0009921c $chain$0$??$HistogramCombine@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAU?$Histogram@$0CMA@@0@PEAH1HH@Z 00000001800d721c block_splitter.obj + 0002:00099230 $chain$1$??$HistogramCombine@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAU?$Histogram@$0CMA@@0@PEAH1HH@Z 00000001800d7230 block_splitter.obj + 0002:00099240 $chain$0$??$HistogramRemap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@HPEAU10@PEAH@Z 00000001800d7240 block_splitter.obj + 0002:00099254 $chain$1$??$HistogramRemap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@HPEAU10@PEAH@Z 00000001800d7254 block_splitter.obj + 0002:00099264 $chain$5$??$HistogramReindex@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d7264 block_splitter.obj + 0002:0009928c $chain$6$??$HistogramReindex@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d728c block_splitter.obj + 0002:000992a0 $chain$7$??$HistogramReindex@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d72a0 block_splitter.obj + 0002:000992b0 $chain$8$??$HistogramReindex@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d72b0 block_splitter.obj + 0002:000992cc $chain$9$??$HistogramReindex@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d72cc block_splitter.obj + 0002:000992dc $unwind$??$PopulationCost@$0CAI@@brotli@@YANAEBU?$Histogram@$0CAI@@0@@Z 00000001800d72dc block_splitter.obj + 0002:000992f8 $unwind$??$HistogramCombine@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAU?$Histogram@$0CAI@@0@PEAH1HH@Z 00000001800d72f8 block_splitter.obj + 0002:00099318 $chain$0$??$HistogramCombine@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAU?$Histogram@$0CAI@@0@PEAH1HH@Z 00000001800d7318 block_splitter.obj + 0002:0009932c $chain$1$??$HistogramCombine@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAU?$Histogram@$0CAI@@0@PEAH1HH@Z 00000001800d732c block_splitter.obj + 0002:0009933c $unwind$??$HistogramRemap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@HPEAU10@PEAH@Z 00000001800d733c block_splitter.obj + 0002:00099354 $chain$0$??$HistogramRemap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@HPEAU10@PEAH@Z 00000001800d7354 block_splitter.obj + 0002:00099368 $chain$1$??$HistogramRemap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@HPEAU10@PEAH@Z 00000001800d7368 block_splitter.obj + 0002:00099378 $chain$5$??$HistogramReindex@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d7378 block_splitter.obj + 0002:000993a0 $chain$6$??$HistogramReindex@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d73a0 block_splitter.obj + 0002:000993b4 $chain$7$??$HistogramReindex@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d73b4 block_splitter.obj + 0002:000993c4 $chain$8$??$HistogramReindex@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d73c4 block_splitter.obj + 0002:000993e0 $chain$9$??$HistogramReindex@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@std@@PEAV?$vector@HV?$allocator@H@std@@@2@@Z 00000001800d73e0 block_splitter.obj + 0002:000993f0 $unwind$??$CompareAndPushToHeap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d73f0 block_splitter.obj + 0002:00099404 $chain$2$??$CompareAndPushToHeap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7404 block_splitter.obj + 0002:00099420 $chain$3$??$CompareAndPushToHeap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7420 block_splitter.obj + 0002:00099434 $chain$4$??$CompareAndPushToHeap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7434 block_splitter.obj + 0002:00099448 $chain$5$??$CompareAndPushToHeap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7448 block_splitter.obj + 0002:00099458 $chain$6$??$CompareAndPushToHeap@U?$Histogram@$0BAA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0BAA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7458 block_splitter.obj + 0002:00099468 $unwind$??$HistogramBitCostDistance@U?$Histogram@$0BAA@@brotli@@@brotli@@YANAEBU?$Histogram@$0BAA@@0@0@Z 00000001800d7468 block_splitter.obj + 0002:0009947c $unwind$??$CompareAndPushToHeap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d747c block_splitter.obj + 0002:00099490 $chain$2$??$CompareAndPushToHeap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7490 block_splitter.obj + 0002:000994ac $chain$3$??$CompareAndPushToHeap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d74ac block_splitter.obj + 0002:000994c0 $chain$4$??$CompareAndPushToHeap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d74c0 block_splitter.obj + 0002:000994d0 $chain$5$??$CompareAndPushToHeap@U?$Histogram@$0CMA@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CMA@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d74d0 block_splitter.obj + 0002:000994e0 $unwind$??$HistogramBitCostDistance@U?$Histogram@$0CMA@@brotli@@@brotli@@YANAEBU?$Histogram@$0CMA@@0@0@Z 00000001800d74e0 block_splitter.obj + 0002:000994f4 $unwind$??$CompareAndPushToHeap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d74f4 block_splitter.obj + 0002:00099508 $chain$2$??$CompareAndPushToHeap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7508 block_splitter.obj + 0002:00099524 $chain$3$??$CompareAndPushToHeap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7524 block_splitter.obj + 0002:00099538 $chain$4$??$CompareAndPushToHeap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7538 block_splitter.obj + 0002:00099548 $chain$5$??$CompareAndPushToHeap@U?$Histogram@$0CAI@@brotli@@@brotli@@YAXPEBU?$Histogram@$0CAI@@0@PEBHHHPEAV?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@@Z 00000001800d7548 block_splitter.obj + 0002:00099558 $unwind$??$HistogramBitCostDistance@U?$Histogram@$0CAI@@brotli@@@brotli@@YANAEBU?$Histogram@$0CAI@@0@0@Z 00000001800d7558 block_splitter.obj + 0002:0009956c $chain$1$??$push_heap@V?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@UHistogramPair@brotli@@@std@@@std@@@std@@UHistogramPairComparator@brotli@@@std@@YAXV?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@UHistogramPair@brotli@@@std@@@std@@@0@0UHistogramPairComparator@brotli@@@Z 00000001800d756c block_splitter.obj + 0002:00099584 $chain$2$??$push_heap@V?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@UHistogramPair@brotli@@@std@@@std@@@std@@UHistogramPairComparator@brotli@@@std@@YAXV?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@UHistogramPair@brotli@@@std@@@std@@@0@0UHistogramPairComparator@brotli@@@Z 00000001800d7584 block_splitter.obj + 0002:00099594 $unwind$??$_Emplace_reallocate@AEBUHistogramPair@brotli@@@?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@QEAAPEAUHistogramPair@brotli@@QEAU23@AEBU23@@Z 00000001800d7594 block_splitter.obj + 0002:000995a8 $chain$1$??$_Emplace_reallocate@AEBUHistogramPair@brotli@@@?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@QEAAPEAUHistogramPair@brotli@@QEAU23@AEBU23@@Z 00000001800d75a8 block_splitter.obj + 0002:000995c0 $chain$3$??$_Emplace_reallocate@AEBUHistogramPair@brotli@@@?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@QEAAPEAUHistogramPair@brotli@@QEAU23@AEBU23@@Z 00000001800d75c0 block_splitter.obj + 0002:000995c0 $chain$5$??$_Emplace_reallocate@AEBUHistogramPair@brotli@@@?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@QEAAPEAUHistogramPair@brotli@@QEAU23@AEBU23@@Z 00000001800d75c0 block_splitter.obj + 0002:000995d8 $chain$4$??$_Emplace_reallocate@AEBUHistogramPair@brotli@@@?$vector@UHistogramPair@brotli@@V?$allocator@UHistogramPair@brotli@@@std@@@std@@QEAAPEAUHistogramPair@brotli@@QEAU23@AEBU23@@Z 00000001800d75d8 block_splitter.obj + 0002:000995e8 $unwind$??$_Pop_heap_hole_by_index@PEAUHistogramPair@brotli@@U12@UHistogramPairComparator@2@@std@@YAXPEAUHistogramPair@brotli@@_J1$$QEAU12@UHistogramPairComparator@2@@Z 00000001800d75e8 block_splitter.obj + 0002:000995fc $unwind$?HuffmanBitCost@brotli@@YAHPEBEH@Z 00000001800d75fc brotli_bit_stream.obj + 0002:0009961c $unwind$?StoreVarLenUint8@brotli@@YAXHPEAHPEAE@Z 00000001800d761c brotli_bit_stream.obj + 0002:00099630 $unwind$?StoreCompressedMetaBlockHeader@brotli@@YA_N_N_KPEAHPEAE@Z 00000001800d7630 brotli_bit_stream.obj + 0002:00099648 $unwind$?StoreHuffmanTreeOfHuffmanTreeToBitMask@brotli@@YAXHPEBEPEAHPEAE@Z 00000001800d7648 brotli_bit_stream.obj + 0002:00099658 $chain$2$?StoreHuffmanTreeOfHuffmanTreeToBitMask@brotli@@YAXHPEBEPEAHPEAE@Z 00000001800d7658 brotli_bit_stream.obj + 0002:00099674 $chain$3$?StoreHuffmanTreeOfHuffmanTreeToBitMask@brotli@@YAXHPEBEPEAHPEAE@Z 00000001800d7674 brotli_bit_stream.obj + 0002:00099684 $unwind$?StoreSimpleHuffmanTree@brotli@@YAXPEBEQEAHHHPEAHPEAE@Z 00000001800d7684 brotli_bit_stream.obj + 0002:000996a0 $unwind$?StoreHuffmanTree@brotli@@YAXPEBE_KPEAHPEAE@Z 00000001800d76a0 brotli_bit_stream.obj + 0002:000996c0 $unwind$?BuildAndStoreHuffmanTree@brotli@@YAXPEBHHPEAEPEAGPEAH1@Z 00000001800d76c0 brotli_bit_stream.obj + 0002:000996e0 $unwind$?MoveToFrontTransform@brotli@@YA?AV?$vector@HV?$allocator@H@std@@@std@@AEBV23@@Z 00000001800d76e0 brotli_bit_stream.obj + 0002:000996e0 $unwind$?try_get_function@@YAPEAXW4function_id@?A0x84e3c32f@@QEBDQEBW4module_id@2@2@Z 00000001800d76e0 libvcruntime:winapi_downlevel.obj + 0002:000996e0 $unwind$?try_get_function@@YAPEAXW4function_id@?A0x391cf84c@@QEBDQEBW4module_id@2@2@Z 00000001800d76e0 libucrt:winapi_thunks.obj + 0002:000996fc $unwind$?RunLengthCodeZeros@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@PEAHPEAV23@2@Z 00000001800d76fc brotli_bit_stream.obj + 0002:00099714 $chain$0$?RunLengthCodeZeros@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@PEAHPEAV23@2@Z 00000001800d7714 brotli_bit_stream.obj + 0002:00099728 $chain$1$?RunLengthCodeZeros@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@PEAHPEAV23@2@Z 00000001800d7728 brotli_bit_stream.obj + 0002:00099738 $unwind$?BestMaxZeroRunLengthPrefix@brotli@@YAHAEBV?$vector@HV?$allocator@H@std@@@std@@@Z 00000001800d7738 brotli_bit_stream.obj + 0002:00099760 $unwind$?EncodeContextMap@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@HPEAHPEAE@Z 00000001800d7760 brotli_bit_stream.obj + 0002:0009977c $chain$2$?EncodeContextMap@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@HPEAHPEAE@Z 00000001800d777c brotli_bit_stream.obj + 0002:00099798 $chain$3$?EncodeContextMap@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@HPEAHPEAE@Z 00000001800d7798 brotli_bit_stream.obj + 0002:00099798 $chain$5$?EncodeContextMap@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@HPEAHPEAE@Z 00000001800d7798 brotli_bit_stream.obj + 0002:000997ac $chain$4$?EncodeContextMap@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@HPEAHPEAE@Z 00000001800d77ac brotli_bit_stream.obj + 0002:000997bc $unwind$?BuildAndStoreBlockSplitCode@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@0HPEAUBlockSplitCode@1@PEAHPEAE@Z 00000001800d77bc brotli_bit_stream.obj + 0002:000997d0 $chain$0$?BuildAndStoreBlockSplitCode@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@0HPEAUBlockSplitCode@1@PEAHPEAE@Z 00000001800d77d0 brotli_bit_stream.obj + 0002:000997e4 $chain$2$?BuildAndStoreBlockSplitCode@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@0HPEAUBlockSplitCode@1@PEAHPEAE@Z 00000001800d77e4 brotli_bit_stream.obj + 0002:000997fc $chain$3$?BuildAndStoreBlockSplitCode@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@0HPEAUBlockSplitCode@1@PEAHPEAE@Z 00000001800d77fc brotli_bit_stream.obj + 0002:0009980c $chain$4$?BuildAndStoreBlockSplitCode@brotli@@YAXAEBV?$vector@HV?$allocator@H@std@@@std@@0HPEAUBlockSplitCode@1@PEAHPEAE@Z 00000001800d780c brotli_bit_stream.obj + 0002:0009981c $unwind$?StoreTrivialContextMap@brotli@@YAXHHPEAHPEAE@Z 00000001800d781c brotli_bit_stream.obj + 0002:0009982c $chain$4$?StoreTrivialContextMap@brotli@@YAXHHPEAHPEAE@Z 00000001800d782c brotli_bit_stream.obj + 0002:00099850 $chain$5$?StoreTrivialContextMap@brotli@@YAXHHPEAHPEAE@Z 00000001800d7850 brotli_bit_stream.obj + 0002:00099860 $chain$6$?StoreTrivialContextMap@brotli@@YAXHHPEAHPEAE@Z 00000001800d7860 brotli_bit_stream.obj + 0002:00099884 $unwind$?StoreSymbol@BlockEncoder@brotli@@QEAAXHPEAHPEAE@Z 00000001800d7884 brotli_bit_stream.obj + 0002:00099898 $chain$0$?StoreSymbol@BlockEncoder@brotli@@QEAAXHPEAHPEAE@Z 00000001800d7898 brotli_bit_stream.obj + 0002:000998ac $chain$1$?StoreSymbol@BlockEncoder@brotli@@QEAAXHPEAHPEAE@Z 00000001800d78ac brotli_bit_stream.obj + 0002:000998bc $unwind$?StoreMetaBlock@brotli@@YA_NPEBE_K11EE_NHHHPEBUCommand@1@1AEBUMetaBlockSplit@1@PEAHPEAE@Z 00000001800d78bc brotli_bit_stream.obj + 0002:000998d0 $chain$2$?StoreMetaBlock@brotli@@YA_NPEBE_K11EE_NHHHPEBUCommand@1@1AEBUMetaBlockSplit@1@PEAHPEAE@Z 00000001800d78d0 brotli_bit_stream.obj + 0002:000998ec $chain$3$?StoreMetaBlock@brotli@@YA_NPEBE_K11EE_NHHHPEBUCommand@1@1AEBUMetaBlockSplit@1@PEAHPEAE@Z 00000001800d78ec brotli_bit_stream.obj + 0002:000998fc $unwind$?StoreUncompressedMetaBlock@brotli@@YA_N_NPEBE_K22PEAHPEAE@Z 00000001800d78fc brotli_bit_stream.obj + 0002:00099914 $chain$0$?StoreUncompressedMetaBlock@brotli@@YA_N_NPEBE_K22PEAHPEAE@Z 00000001800d7914 brotli_bit_stream.obj + 0002:00099928 $chain$1$?StoreUncompressedMetaBlock@brotli@@YA_N_NPEBE_K22PEAHPEAE@Z 00000001800d7928 brotli_bit_stream.obj + 0002:00099938 $unwind$??$PopulationCost@$0BBA@@brotli@@YANAEBU?$Histogram@$0BBA@@0@@Z 00000001800d7938 brotli_bit_stream.obj + 0002:00099954 $chain$0$??$_Resize@U_Value_init_tag@std@@@?$vector@GV?$allocator@G@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d7954 brotli_bit_stream.obj + 0002:00099968 $chain$1$??$_Resize@U_Value_init_tag@std@@@?$vector@GV?$allocator@G@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d7968 brotli_bit_stream.obj + 0002:00099978 $chain$2$??$_Resize@U_Value_init_tag@std@@@?$vector@GV?$allocator@G@std@@@std@@AEAAX_KAEBU_Value_init_tag@1@@Z 00000001800d7978 brotli_bit_stream.obj + 0002:0009998c $unwind$?ApplyTransform@brotli@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBUTransform@1@PEBEH@Z 00000001800d798c encode.obj + 0002:000999ac $chain$1$?ApplyTransform@brotli@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBUTransform@1@PEBEH@Z 00000001800d79ac encode.obj + 0002:000999c0 $chain$2$?ApplyTransform@brotli@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBUTransform@1@PEBEH@Z 00000001800d79c0 encode.obj + 0002:000999d0 $unwind$?Fill@StaticDictionary@brotli@@QEAAX_N@Z 00000001800d79d0 encode.obj + 0002:000999f4 $unwind$?Insert@StaticDictionary@brotli@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HH@Z 00000001800d79f4 encode.obj + 0002:00099a0c $unwind$?Init@Hashers@brotli@@QEAAXH@Z 00000001800d7a0c encode.obj + 0002:00099a14 $chain$1$?Init@Hashers@brotli@@QEAAXH@Z 00000001800d7a14 encode.obj + 0002:00099a2c $chain$2$?Init@Hashers@brotli@@QEAAXH@Z 00000001800d7a2c encode.obj + 0002:00099a40 $chain$3$?Init@Hashers@brotli@@QEAAXH@Z 00000001800d7a40 encode.obj + 0002:00099a50 $chain$4$?Init@Hashers@brotli@@QEAAXH@Z 00000001800d7a50 encode.obj + 0002:00099a60 $unwind$?CopyInputToRingBuffer@BrotliCompressor@brotli@@QEAAX_KPEBE@Z 00000001800d7a60 encode.obj + 0002:00099a60 $unwind$?OptimizeHistograms@brotli@@YAXHHPEAUMetaBlockSplit@1@@Z 00000001800d7a60 metablock.obj + 0002:00099a60 $unwind$??$common_xtox@K_W@@YAHKQEA_W_KI_N@Z 00000001800d7a60 libucrt:xtoa.obj + 0002:00099a60 $unwind$__acrt_DownlevelLocaleNameToLCID 00000001800d7a60 libucrt:lcidtoname_downlevel.obj + 0002:00099a60 $unwind$??R@@QEBAHXZ 00000001800d7a60 libucrt:onexit.obj + 0002:00099a60 $unwind$?type_case_integer@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 00000001800d7a60 libucrt:output.obj + 0002:00099a60 $unwind$?type_case_integer@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 00000001800d7a60 libucrt:output.obj + 0002:00099a60 $unwind$?type_case_integer@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 00000001800d7a60 libucrt:output.obj + 0002:00099a78 $unwind$?WriteBrotliData@BrotliCompressor@brotli@@QEAA_N_N0PEA_KPEAPEAE@Z 00000001800d7a78 encode.obj + 0002:00099a98 $unwind$?WriteMetaBlockInternal@BrotliCompressor@brotli@@AEAA_N_N0PEA_KPEAPEAE@Z 00000001800d7a98 encode.obj + 0002:00099ac0 $chain$1$?WriteMetaBlockInternal@BrotliCompressor@brotli@@AEAA_N_N0PEA_KPEAPEAE@Z 00000001800d7ac0 encode.obj + 0002:00099ad4 $chain$2$?WriteMetaBlockInternal@BrotliCompressor@brotli@@AEAA_N_N0PEA_KPEAPEAE@Z 00000001800d7ad4 encode.obj + 0002:00099ae4 $unwind$?BrotliCompress@brotli@@YAHUBrotliParams@1@PEAVBrotliIn@1@PEAVBrotliOut@1@@Z 00000001800d7ae4 encode.obj + 0002:00099b04 $unwind$?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@2@@Z 00000001800d7b04 encode.obj + 0002:00099b04 $unwind$?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@2@@Z 00000001800d7b04 encode.obj + 0002:00099b14 $chain$0$?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@2@@Z 00000001800d7b14 encode.obj + 0002:00099b14 $chain$0$?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@2@@Z 00000001800d7b14 encode.obj + 0002:00099b28 $chain$1$?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@2@@Z 00000001800d7b28 encode.obj + 0002:00099b28 $chain$1$?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@2@@Z 00000001800d7b28 encode.obj + 0002:00099b38 $chain$2$?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBIH@std@@@std@@@std@@@2@@Z 00000001800d7b38 encode.obj + 0002:00099b38 $chain$2$?_Assign_grow@?$_Hash_vec@V?$allocator@V?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@std@@@std@@@std@@QEAAX_KV?$_List_unchecked_iterator@V?$_List_val@U?$_List_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@std@@@std@@@2@@Z 00000001800d7b38 encode.obj + 0002:00099b4c $unwind$??$_Try_emplace@AEBI$$V@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@PEAU?$_List_node@U?$pair@$$CBIH@std@@PEAX@std@@_N@1@AEBI@Z 00000001800d7b4c encode.obj + 0002:00099b60 $chain$0$??$_Try_emplace@AEBI$$V@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@PEAU?$_List_node@U?$pair@$$CBIH@std@@PEAX@std@@_N@1@AEBI@Z 00000001800d7b60 encode.obj + 0002:00099b74 $chain$2$??$_Try_emplace@AEBI$$V@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@PEAU?$_List_node@U?$pair@$$CBIH@std@@PEAX@std@@_N@1@AEBI@Z 00000001800d7b74 encode.obj + 0002:00099b88 $chain$3$??$_Try_emplace@AEBI$$V@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@PEAU?$_List_node@U?$pair@$$CBIH@std@@PEAX@std@@_N@1@AEBI@Z 00000001800d7b88 encode.obj + 0002:00099b98 $unwind$??$_Try_emplace@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$V@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@PEAU?$_List_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@PEAX@std@@_N@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z 00000001800d7b98 encode.obj + 0002:00099bb4 $unwind$??$_Reallocate_grow_by@V@@PEBD_K@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@PEBD_K@Z 00000001800d7bb4 encode.obj + 0002:00099bc4 $chain$3$??$_Reallocate_grow_by@V@@PEBD_K@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@PEBD_K@Z 00000001800d7bc4 encode.obj + 0002:00099be4 $chain$4$??$_Reallocate_grow_by@V@@PEBD_K@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@PEBD_K@Z 00000001800d7be4 encode.obj + 0002:00099bf4 $chain$5$??$_Reallocate_grow_by@V@@PEBD_K@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@PEBD_K@Z 00000001800d7bf4 encode.obj + 0002:00099c14 $chain$1$?_Forced_rehash@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7c14 encode.obj + 0002:00099c2c $chain$2$?_Forced_rehash@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7c2c encode.obj + 0002:00099c40 $chain$3$?_Forced_rehash@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7c40 encode.obj + 0002:00099c50 $chain$5$?_Forced_rehash@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7c50 encode.obj + 0002:00099c6c $chain$6$?_Forced_rehash@?$_Hash@V?$_Umap_traits@IHV?$_Uhash_compare@IU?$hash@I@std@@U?$equal_to@I@2@@std@@V?$allocator@U?$pair@$$CBIH@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7c6c encode.obj + 0002:00099c7c $unwind$?_Forced_rehash@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7c7c encode.obj + 0002:00099c88 $chain$3$?_Forced_rehash@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7c88 encode.obj + 0002:00099ca8 $chain$5$?_Forced_rehash@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7ca8 encode.obj + 0002:00099cc0 $chain$6$?_Forced_rehash@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7cc0 encode.obj + 0002:00099cd0 $chain$8$?_Forced_rehash@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7cd0 encode.obj + 0002:00099cf8 $chain$9$?_Forced_rehash@?$_Hash@V?$_Umap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HV?$_Uhash_compare@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@$0A@@std@@@std@@IEAAX_K@Z 00000001800d7cf8 encode.obj + 0002:00099d08 $unwind$??$_Reallocate_grow_by@V@@$$V@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@@Z 00000001800d7d08 encode.obj + 0002:00099d14 $chain$2$??$_Reallocate_grow_by@V@@$$V@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@@Z 00000001800d7d14 encode.obj + 0002:00099d30 $chain$3$??$_Reallocate_grow_by@V@@$$V@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@@Z 00000001800d7d30 encode.obj + 0002:00099d40 $chain$4$??$_Reallocate_grow_by@V@@$$V@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@@Z 00000001800d7d40 encode.obj + 0002:00099d5c $unwind$??$_Reallocate_grow_by@V@@D@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@D@Z 00000001800d7d5c encode.obj + 0002:00099d6c $chain$2$??$_Reallocate_grow_by@V@@D@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@D@Z 00000001800d7d6c encode.obj + 0002:00099d88 $chain$3$??$_Reallocate_grow_by@V@@D@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@D@Z 00000001800d7d88 encode.obj + 0002:00099d98 $chain$4$??$_Reallocate_grow_by@V@@D@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAAEAV01@_KV@@D@Z 00000001800d7d98 encode.obj + 0002:00099db4 $unwind$?CreateHuffmanTree@brotli@@YAXPEBHHHPEAE@Z 00000001800d7db4 entropy_encode.obj + 0002:00099dd8 $unwind$?WriteHuffmanTreeRepetitions@brotli@@YAXHHHPEAV?$vector@EV?$allocator@E@std@@@std@@0@Z 00000001800d7dd8 entropy_encode.obj + 0002:00099de8 $unwind$?WriteHuffmanTreeRepetitionsZeros@brotli@@YAXHPEAV?$vector@EV?$allocator@E@std@@@std@@0@Z 00000001800d7de8 entropy_encode.obj + 0002:00099df8 $unwind$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7df8 entropy_encode.obj + 0002:00099e08 $chain$0$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7e08 entropy_encode.obj + 0002:00099e1c $chain$4$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7e1c entropy_encode.obj + 0002:00099e3c $chain$5$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7e3c entropy_encode.obj + 0002:00099e4c $chain$6$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7e4c entropy_encode.obj + 0002:00099e60 $chain$11$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7e60 entropy_encode.obj + 0002:00099e60 $chain$7$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7e60 entropy_encode.obj + 0002:00099e70 $chain$8$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7e70 entropy_encode.obj + 0002:00099e84 $chain$9$?OptimizeHuffmanCountsForRle@brotli@@YAHHPEAH@Z 00000001800d7e84 entropy_encode.obj + 0002:00099e98 $unwind$?WriteHuffmanTree@brotli@@YAXPEBEIPEAV?$vector@EV?$allocator@E@std@@@std@@1@Z 00000001800d7e98 entropy_encode.obj + 0002:00099eb4 $unwind$?ConvertBitDepthsToSymbols@brotli@@YAXPEBEHPEAG@Z 00000001800d7eb4 entropy_encode.obj + 0002:00099ec8 $chain$0$?ConvertBitDepthsToSymbols@brotli@@YAXPEBEHPEAG@Z 00000001800d7ec8 entropy_encode.obj + 0002:00099edc $chain$1$?ConvertBitDepthsToSymbols@brotli@@YAXPEBEHPEAG@Z 00000001800d7edc entropy_encode.obj + 0002:00099eec $unwind$??$_Emplace_reallocate@AEBUHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@AEBU234@@Z 00000001800d7eec entropy_encode.obj + 0002:00099eec $unwind$??$_Emplace_reallocate@UHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@$$QEAU234@@Z 00000001800d7eec entropy_encode.obj + 0002:00099efc $chain$3$??$_Emplace_reallocate@AEBUHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@AEBU234@@Z 00000001800d7efc entropy_encode.obj + 0002:00099efc $chain$3$??$_Emplace_reallocate@UHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@$$QEAU234@@Z 00000001800d7efc entropy_encode.obj + 0002:00099f1c $chain$5$??$_Emplace_reallocate@AEBUHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@AEBU234@@Z 00000001800d7f1c entropy_encode.obj + 0002:00099f1c $chain$5$??$_Emplace_reallocate@UHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@$$QEAU234@@Z 00000001800d7f1c entropy_encode.obj + 0002:00099f3c $chain$6$??$_Emplace_reallocate@AEBUHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@AEBU234@@Z 00000001800d7f3c entropy_encode.obj + 0002:00099f3c $chain$6$??$_Emplace_reallocate@UHuffmanTree@?A0xbf9879d9@brotli@@@?$vector@UHuffmanTree@?A0xbf9879d9@brotli@@V?$allocator@UHuffmanTree@?A0xbf9879d9@brotli@@@std@@@std@@QEAAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU234@$$QEAU234@@Z 00000001800d7f3c entropy_encode.obj + 0002:00099f4c $unwind$??$_Insertion_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0P6A_NAEBU123@1@Z@Z 00000001800d7f4c entropy_encode.obj + 0002:00099f58 $chain$3$??$_Insertion_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0P6A_NAEBU123@1@Z@Z 00000001800d7f58 entropy_encode.obj + 0002:00099f78 $chain$5$??$_Insertion_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0P6A_NAEBU123@1@Z@Z 00000001800d7f78 entropy_encode.obj + 0002:00099f8c $chain$6$??$_Insertion_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0P6A_NAEBU123@1@Z@Z 00000001800d7f8c entropy_encode.obj + 0002:00099f9c $unwind$??$_Stable_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXQEAUHuffmanTree@?A0xbf9879d9@brotli@@0_J01P6A_NAEBU123@2@Z@Z 00000001800d7f9c entropy_encode.obj + 0002:00099fbc $unwind$??$_Buffered_merge_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXQEAUHuffmanTree@?A0xbf9879d9@brotli@@0_J0P6A_NAEBU123@2@Z@Z 00000001800d7fbc entropy_encode.obj + 0002:00099fcc $chain$2$??$_Buffered_merge_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXQEAUHuffmanTree@?A0xbf9879d9@brotli@@0_J0P6A_NAEBU123@2@Z@Z 00000001800d7fcc entropy_encode.obj + 0002:00099fe8 $chain$3$??$_Buffered_merge_sort_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXQEAUHuffmanTree@?A0xbf9879d9@brotli@@0_J0P6A_NAEBU123@2@Z@Z 00000001800d7fe8 entropy_encode.obj + 0002:00099ff8 $unwind$??$_Buffered_inplace_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z@Z 00000001800d7ff8 entropy_encode.obj + 0002:0009a008 $chain$0$??$_Buffered_inplace_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z@Z 00000001800d8008 entropy_encode.obj + 0002:0009a01c $chain$5$??$_Buffered_inplace_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z@Z 00000001800d801c entropy_encode.obj + 0002:0009a03c $chain$6$??$_Buffered_inplace_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z@Z 00000001800d803c entropy_encode.obj + 0002:0009a04c $unwind$??$_Chunked_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@PEAU123@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0_J_JP6A_NAEBU123@4@Z@Z 00000001800d804c entropy_encode.obj + 0002:0009a05c $chain$3$??$_Chunked_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@PEAU123@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0_J_JP6A_NAEBU123@4@Z@Z 00000001800d805c entropy_encode.obj + 0002:0009a07c $chain$4$??$_Chunked_merge_unchecked@PEAUHuffmanTree@?A0xbf9879d9@brotli@@PEAU123@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@QEAU123@0_J_JP6A_NAEBU123@4@Z@Z 00000001800d807c entropy_encode.obj + 0002:0009a08c $unwind$??$_Buffered_inplace_merge_unchecked_impl@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z@Z 00000001800d808c entropy_encode.obj + 0002:0009a0a4 $unwind$??$_Buffered_inplace_merge_divide_and_conquer2@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z0011@Z 00000001800d80a4 entropy_encode.obj + 0002:0009a0b8 $chain$0$??$_Buffered_inplace_merge_divide_and_conquer2@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z0011@Z 00000001800d80b8 entropy_encode.obj + 0002:0009a0cc $chain$1$??$_Buffered_inplace_merge_divide_and_conquer2@PEAUHuffmanTree@?A0xbf9879d9@brotli@@P6A_NAEBU123@0@Z@std@@YAXPEAUHuffmanTree@?A0xbf9879d9@brotli@@00_J1QEAU123@_JP6A_NAEBU123@4@Z0011@Z 00000001800d80cc entropy_encode.obj + 0002:0009a0dc $unwind$?BuildHistograms@brotli@@YAXPEBUCommand@1@_KAEBVBlockSplit@1@22PEBE_K4EEAEBV?$vector@HV?$allocator@H@std@@@std@@PEAV?$vector@U?$Histogram@$0BAA@@brotli@@V?$allocator@U?$Histogram@$0BAA@@brotli@@@std@@@5@PEAV?$vector@U?$Histogram@$0CMA@@brotli@@V?$allocator@U?$Histogram@$0CMA@@brotli@@@std@@@5@PEAV?$vector@U?$Histogram@$0CAI@@brotli@@V?$allocator@U?$Histogram@$0CAI@@brotli@@@std@@@5@@Z 00000001800d80dc histogram.obj + 0002:0009a0f4 $unwind$?EstimateBitCostsForLiteralsUTF8@brotli@@YAX_K000PEBEPEAM@Z 00000001800d80f4 literal_cost.obj + 0002:0009a118 $chain$6$?EstimateBitCostsForLiteralsUTF8@brotli@@YAX_K000PEBEPEAM@Z 00000001800d8118 literal_cost.obj + 0002:0009a144 $chain$7$?EstimateBitCostsForLiteralsUTF8@brotli@@YAX_K000PEBEPEAM@Z 00000001800d8144 literal_cost.obj + 0002:0009a154 $unwind$?EstimateBitCostsForLiterals@brotli@@YAX_K000PEBEPEAM@Z 00000001800d8154 literal_cost.obj + 0002:0009a170 $chain$5$?EstimateBitCostsForLiterals@brotli@@YAX_K000PEBEPEAM@Z 00000001800d8170 literal_cost.obj + 0002:0009a198 $chain$6$?EstimateBitCostsForLiterals@brotli@@YAX_K000PEBEPEAM@Z 00000001800d8198 literal_cost.obj + 0002:0009a1a8 $unwind$?BitsEntropy@brotli@@YANPEBHH@Z 00000001800d81a8 metablock.obj + 0002:0009a1bc $chain$2$?BitsEntropy@brotli@@YANPEBHH@Z 00000001800d81bc metablock.obj + 0002:0009a1d8 $chain$3$?BitsEntropy@brotli@@YANPEBHH@Z 00000001800d81d8 metablock.obj + 0002:0009a1e8 $unwind$?BuildMetaBlock@brotli@@YAXPEBE_K1EEPEBUCommand@1@_KH_NPEAUMetaBlockSplit@1@@Z 00000001800d81e8 metablock.obj + 0002:0009a200 $chain$0$?BuildMetaBlock@brotli@@YAXPEBE_K1EEPEBUCommand@1@_KH_NPEAUMetaBlockSplit@1@@Z 00000001800d8200 metablock.obj + 0002:0009a214 $chain$2$?BuildMetaBlock@brotli@@YAXPEBE_K1EEPEBUCommand@1@_KH_NPEAUMetaBlockSplit@1@@Z 00000001800d8214 metablock.obj + 0002:0009a214 $chain$4$?BuildMetaBlock@brotli@@YAXPEBE_K1EEPEBUCommand@1@_KH_NPEAUMetaBlockSplit@1@@Z 00000001800d8214 metablock.obj + 0002:0009a228 $chain$3$?BuildMetaBlock@brotli@@YAXPEBE_K1EEPEBUCommand@1@_KH_NPEAUMetaBlockSplit@1@@Z 00000001800d8228 metablock.obj + 0002:0009a238 $unwind$?BuildMetaBlockGreedy@brotli@@YAXPEBE_K1PEBUCommand@1@1PEAUMetaBlockSplit@1@@Z 00000001800d8238 metablock.obj + 0002:0009a258 $unwind$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CAI@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8258 metablock.obj + 0002:0009a26c $chain$0$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CAI@@brotli@@@brotli@@QEAAX_N@Z 00000001800d826c metablock.obj + 0002:0009a280 $chain$1$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CAI@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8280 metablock.obj + 0002:0009a294 $chain$7$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CAI@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8294 metablock.obj + 0002:0009a2bc $chain$8$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CAI@@brotli@@@brotli@@QEAAX_N@Z 00000001800d82bc metablock.obj + 0002:0009a2d0 $chain$9$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CAI@@brotli@@@brotli@@QEAAX_N@Z 00000001800d82d0 metablock.obj + 0002:0009a2e0 $chain$10$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CAI@@brotli@@@brotli@@QEAAX_N@Z 00000001800d82e0 metablock.obj + 0002:0009a2f0 $unwind$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CMA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d82f0 metablock.obj + 0002:0009a304 $chain$0$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CMA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8304 metablock.obj + 0002:0009a318 $chain$1$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CMA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8318 metablock.obj + 0002:0009a32c $chain$7$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CMA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d832c metablock.obj + 0002:0009a354 $chain$8$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CMA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8354 metablock.obj + 0002:0009a368 $chain$9$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CMA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8368 metablock.obj + 0002:0009a378 $chain$10$?FinishBlock@?$BlockSplitter@U?$Histogram@$0CMA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8378 metablock.obj + 0002:0009a388 $unwind$?FinishBlock@?$BlockSplitter@U?$Histogram@$0BAA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8388 metablock.obj + 0002:0009a39c $chain$0$?FinishBlock@?$BlockSplitter@U?$Histogram@$0BAA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d839c metablock.obj + 0002:0009a3b0 $chain$1$?FinishBlock@?$BlockSplitter@U?$Histogram@$0BAA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d83b0 metablock.obj + 0002:0009a3c4 $chain$7$?FinishBlock@?$BlockSplitter@U?$Histogram@$0BAA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d83c4 metablock.obj + 0002:0009a3ec $chain$8$?FinishBlock@?$BlockSplitter@U?$Histogram@$0BAA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d83ec metablock.obj + 0002:0009a404 $chain$9$?FinishBlock@?$BlockSplitter@U?$Histogram@$0BAA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8404 metablock.obj + 0002:0009a414 $chain$10$?FinishBlock@?$BlockSplitter@U?$Histogram@$0BAA@@brotli@@@brotli@@QEAAX_N@Z 00000001800d8414 metablock.obj + 0002:0009a424 xdata 00000001800d8424 node:node.exe + 0002:0009a42c $unwind$?__scrt_throw_std_bad_alloc@@YAXXZ 00000001800d842c LIBCMT:throw_bad_alloc.obj + 0002:0009a42c $unwind$?__scrt_throw_std_bad_array_new_length@@YAXXZ 00000001800d842c LIBCMT:throw_bad_alloc.obj + 0002:0009a42c $unwind$?_Xlength_error@std@@YAXPEBD@Z 00000001800d842c libcpmt:xthrow.obj + 0002:0009a42c $unwind$?_Xout_of_range@std@@YAXPEBD@Z 00000001800d842c libcpmt:xthrow.obj + 0002:0009a42c $unwind$_raise_exc 00000001800d842c libucrt:fpexcept.obj + 0002:0009a438 $xdatasym 00000001800d8438 LIBCMT:amdsecgs.obj + 0002:0009a43c $unwind$__report_securityfailure 00000001800d843c LIBCMT:gs_report.obj + 0002:0009a444 $unwind$__report_gsfailure 00000001800d8444 LIBCMT:gs_report.obj + 0002:0009a44c $unwind$capture_current_context 00000001800d844c LIBCMT:gs_report.obj + 0002:0009a458 $unwind$capture_previous_context 00000001800d8458 LIBCMT:gs_report.obj + 0002:0009a464 $unwind$??2@YAPEAX_KAEBUnothrow_t@std@@@Z 00000001800d8464 LIBCMT:new_scalar_nothrow.obj + 0002:0009a474 $cppxdata$??2@YAPEAX_KAEBUnothrow_t@std@@@Z 00000001800d8474 LIBCMT:new_scalar_nothrow.obj + 0002:0009a481 $stateUnwindMap$??2@YAPEAX_KAEBUnothrow_t@std@@@Z 00000001800d8481 LIBCMT:new_scalar_nothrow.obj + 0002:0009a484 $tryMap$??2@YAPEAX_KAEBUnothrow_t@std@@@Z 00000001800d8484 LIBCMT:new_scalar_nothrow.obj + 0002:0009a48c $handlerMap$??2@YAPEAX_KAEBUnothrow_t@std@@@Z 00000001800d848c LIBCMT:new_scalar_nothrow.obj + 0002:0009a494 $ip2state$??2@YAPEAX_KAEBUnothrow_t@std@@@Z 00000001800d8494 LIBCMT:new_scalar_nothrow.obj + 0002:0009a498 $unwind$?catch$0@?0???2@YAPEAX_KAEBUnothrow_t@std@@@Z@4HA 00000001800d8498 LIBCMT:new_scalar_nothrow.obj + 0002:0009a4a8 $cppxdata$?catch$0@?0???2@YAPEAX_KAEBUnothrow_t@std@@@Z@4HA 00000001800d84a8 LIBCMT:new_scalar_nothrow.obj + 0002:0009a4b2 $stateUnwindMap$?catch$0@?0???2@YAPEAX_KAEBUnothrow_t@std@@@Z@4HA 00000001800d84b2 LIBCMT:new_scalar_nothrow.obj + 0002:0009a4b4 $ip2state$?catch$0@?0???2@YAPEAX_KAEBUnothrow_t@std@@@Z@4HA 00000001800d84b4 LIBCMT:new_scalar_nothrow.obj + 0002:0009a4b8 $unwind$?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 00000001800d84b8 LIBCMT:dll_dllmain.obj + 0002:0009a4f4 $unwind$?fin$0@?0??dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z@4HA 00000001800d84f4 LIBCMT:dll_dllmain.obj + 0002:0009a4f4 $unwind$?fin$0@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 00000001800d84f4 LIBCMT:dll_dllmain.obj + 0002:0009a4f4 $unwind$?fin$1@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 00000001800d84f4 LIBCMT:dll_dllmain.obj + 0002:0009a4f4 $unwind$_IsNonwritableInCurrentImage$filt$0 00000001800d84f4 LIBCMT:pesect.obj + 0002:0009a4f4 $unwind$?filt$0@?0??CxxCallCatchBlock@__FrameHandler4@@SAPEAXPEAU_EXCEPTION_RECORD@@@Z@4HA 00000001800d84f4 libvcruntime:frame.obj + 0002:0009a4f4 $unwind$_query_new_handler$fin$0 00000001800d84f4 libucrt:new_handler.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:per_thread_data.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:per_thread_data.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:per_thread_data.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:per_thread_data.obj + 0002:0009a4f4 $unwind$__acrt_update_thread_locale_data$fin$0 00000001800d84f4 libucrt:locale_refcounting.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:wsetlocale.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:close.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:commit.obj + 0002:0009a4f4 $unwind$__acrt_initialize_lowio$fin$0 00000001800d84f4 libucrt:ioinit.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$common_lseek@_J@@YA_JH_JH@Z@4HA 00000001800d84f4 libucrt:lseek.obj + 0002:0009a4f4 $unwind$__acrt_lowio_ensure_fh_exists$fin$0 00000001800d84f4 libucrt:osfinfo.obj + 0002:0009a4f4 $unwind$_write$fin$0 00000001800d84f4 libucrt:write.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:mbctype.obj + 0002:0009a4f4 $unwind$?fin$0@?0??update_thread_multibyte_data_internal@@YAPEAU__crt_multibyte_data@@QEAU__acrt_ptd@@QEAPEAU1@@Z@4HA 00000001800d84f4 libucrt:mbctype.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:signal.obj + 0002:0009a4f4 $unwind$raise$fin$0 00000001800d84f4 libucrt:signal.obj + 0002:0009a4f4 $unwind$?filt$0@?0???R@@QEBA@XZ@4HA 00000001800d84f4 libucrt:exit.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:exit.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:onexit.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:onexit.obj + 0002:0009a4f4 $unwind$_fcloseall$fin$0 00000001800d84f4 libucrt:closeall.obj + 0002:0009a4f4 $unwind$fclose$fin$0 00000001800d84f4 libucrt:fclose.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:fflush.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:fflush.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:fflush.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:output.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:output.obj + 0002:0009a4f4 $unwind$?fin$0@?0???$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z@4HA 00000001800d84f4 libucrt:setvbuf.obj + 0002:0009a4f4 $unwind$_ctrlfp$filt$0 00000001800d84f4 libucrt:fpctrl.obj + 0002:0009a4fc $unwind$?dllmain_crt_process_detach@@YAH_N@Z 00000001800d84fc LIBCMT:dll_dllmain.obj + 0002:0009a550 $unwind$?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 00000001800d8550 LIBCMT:dll_dllmain.obj + 0002:0009a578 $unwind$?filt$0@?0??dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z@4HA 00000001800d8578 LIBCMT:dll_dllmain.obj + 0002:0009a578 $unwind$?filt$0@?0??FrameUnwindToState@__FrameHandler4@@SAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@H@Z@4HA 00000001800d8578 libvcruntime:frame.obj + 0002:0009a578 $unwind$?fin$1@?0??FrameUnwindToState@__FrameHandler4@@SAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@H@Z@4HA 00000001800d8578 libvcruntime:frame.obj + 0002:0009a580 $unwind$__isa_available_init 00000001800d8580 LIBCMT:cpu_disp.obj + 0002:0009a590 $unwind$__scrt_is_nonwritable_in_current_image 00000001800d8590 LIBCMT:utility.obj + 0002:0009a5b0 $unwind$__scrt_is_nonwritable_in_current_image$filt$0 00000001800d85b0 LIBCMT:utility.obj + 0002:0009a5b8 $unwind$__scrt_fastfail 00000001800d85b8 LIBCMT:utility_desktop.obj + 0002:0009a5c8 $unwind$__security_init_cookie 00000001800d85c8 LIBCMT:gs_support.obj + 0002:0009a5d8 $xdatasym 00000001800d85d8 LIBCMT:guard_dispatch.obj + 0002:0009a5e0 $xdatasym 00000001800d85e0 LIBCMT:guard_xfg_dispatch.obj + 0002:0009a5e4 $unwind$__std_exception_copy 00000001800d85e4 libvcruntime:std_exception.obj + 0002:0009a5e4 $unwind$_free_osfhnd 00000001800d85e4 libucrt:osfinfo.obj + 0002:0009a5f8 $unwind$_CxxThrowException 00000001800d85f8 libvcruntime:throw.obj + 0002:0009a608 $unwind$?DecompFuncInfo@FH4@@YA_JPEAEAEAUFuncInfo4@1@_KH_N@Z 00000001800d8608 libvcruntime:risctrnsctrl.obj + 0002:0009a620 $unwind$?UnwindNestedFrames@__FrameHandler4@@SAXPEA_KPEAUEHExceptionRecord@@PEAU_CONTEXT@@0PEAXPEAUFuncInfo4@FH4@@HHPEAUHandlerType4@5@PEAU_xDISPATCHER_CONTEXT@@E@Z 00000001800d8620 libvcruntime:risctrnsctrl.obj + 0002:0009a634 $unwind$?GetRangeOfTrysToCheck@__FrameHandler4@@SA?AU?$pair@Viterator@TryBlockMap4@FH4@@V123@@std@@AEAVTryBlockMap4@FH4@@HPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@5@H@Z 00000001800d8634 libvcruntime:risctrnsctrl.obj + 0002:0009a650 $unwind$__CxxFrameHandler4 00000001800d8650 libvcruntime:risctrnsctrl.obj + 0002:0009a664 $unwind$??$_CallSETranslator@V__FrameHandler4@@@@YAHPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@K1H@Z 00000001800d8664 libvcruntime:risctrnsctrl.obj + 0002:0009a684 $unwind$?filt$0@?0???$_CallSETranslator@V__FrameHandler4@@@@YAHPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@K1H@Z@4HA 00000001800d8684 libvcruntime:risctrnsctrl.obj + 0002:0009a690 $unwind$__C_specific_handler 00000001800d8690 libvcruntime:riscchandler.obj + 0002:0009a6ac $unwind$__DestructExceptionObject 00000001800d86ac libvcruntime:ehhelpers.obj + 0002:0009a6cc $unwind$__DestructExceptionObject$filt$0 00000001800d86cc libvcruntime:ehhelpers.obj + 0002:0009a6cc $unwind$?fin$1@?0??CxxCallCatchBlock@__FrameHandler4@@SAPEAXPEAU_EXCEPTION_RECORD@@@Z@4HA 00000001800d86cc libvcruntime:frame.obj + 0002:0009a6d8 $xdatasym 00000001800d86d8 libvcruntime:memset.obj + 0002:0009a6e8 $unwind$?StateFromIp@__FrameHandler4@@SAHPEAUFuncInfo4@FH4@@PEAU_xDISPATCHER_CONTEXT@@_K@Z 00000001800d86e8 libvcruntime:ehstate.obj + 0002:0009a6fc $unwind$?getStartStop@UWMap4@FH4@@QEAAXHHAEAViterator@12@0@Z 00000001800d86fc libvcruntime:frame.obj + 0002:0009a714 $unwind$?getStateFromIterators@UWMap4@FH4@@SAHAEBViterator@12@H0H0@Z 00000001800d8714 libvcruntime:frame.obj + 0002:0009a714 $unwind$strpbrk 00000001800d8714 libucrt:strpbrk.obj + 0002:0009a724 $unwind$?FrameUnwindToState@__FrameHandler4@@SAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@H@Z 00000001800d8724 libvcruntime:frame.obj + 0002:0009a76c $unwind$?CxxCallCatchBlock@__FrameHandler4@@SAPEAXPEAU_EXCEPTION_RECORD@@@Z 00000001800d876c libvcruntime:frame.obj + 0002:0009a7c8 $unwind$?IsInExceptionSpec@@YAEPEAUEHExceptionRecord@@PEBU_s_ESTypeList@@@Z 00000001800d87c8 libvcruntime:frame.obj + 0002:0009a7e4 $unwind$??$__InternalCxxFrameHandler@V__FrameHandler4@@@@YA?AW4_EXCEPTION_DISPOSITION@@PEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@H1E@Z 00000001800d87e4 libvcruntime:frame.obj + 0002:0009a7fc $unwind$__GSHandlerCheck_SEH 00000001800d87fc LIBCMT:gshandlerseh.obj + 0002:0009a7fc $unwind$??$TypeMatchHelper@V__FrameHandler3@@@@YAHPEBU_s_HandlerType@@PEBU_s_CatchableType@@PEBU_s_ThrowInfo@@@Z 00000001800d87fc libvcruntime:frame.obj + 0002:0009a7fc $unwind$??$TypeMatchHelper@V__FrameHandler4@@@@YAHPEAUHandlerType4@FH4@@PEBU_s_CatchableType@@PEBU_s_ThrowInfo@@@Z 00000001800d87fc libvcruntime:frame.obj + 0002:0009a7fc $unwind$?initialize_stdio_handles_nolock@@YAXXZ 00000001800d87fc libucrt:ioinit.obj + 0002:0009a7fc $unwind$__acrt_initialize_stdio 00000001800d87fc libucrt:_file.obj + 0002:0009a814 $unwind$??$BuildCatchObjectHelperInternal@V__FrameHandler4@@@@YAHPEAUEHExceptionRecord@@PEAXPEAUHandlerType4@FH4@@PEBU_s_CatchableType@@@Z 00000001800d8814 libvcruntime:frame.obj + 0002:0009a854 $unwind$??$BuildCatchObjectInternal@V__FrameHandler4@@@@YAXPEAUEHExceptionRecord@@PEAXPEAUHandlerType4@FH4@@PEBU_s_CatchableType@@@Z 00000001800d8854 libvcruntime:frame.obj + 0002:0009a880 $unwind$??$FindHandler@V__FrameHandler4@@@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@EH1@Z 00000001800d8880 libvcruntime:frame.obj + 0002:0009a8a0 $unwind$??$CatchIt@V__FrameHandler4@@@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@PEAUHandlerType4@4@PEBU_s_CatchableType@@PEAUTryBlockMapEntry4@4@H1EE@Z 00000001800d88a0 libvcruntime:frame.obj + 0002:0009a8b8 $unwind$??$FindHandlerForForeignException@V__FrameHandler4@@@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEAUFuncInfo4@FH4@@HH1@Z 00000001800d88b8 libvcruntime:frame.obj + 0002:0009a8d8 $xdatasym 00000001800d88d8 libvcruntime:notify.obj + 0002:0009a8e8 $xdatasym 00000001800d88e8 libvcruntime:handlers.obj + 0002:0009a908 $xdatasym 00000001800d8908 libvcruntime:memcpy.obj + 0002:0009a918 $unwind$swprintf 00000001800d8918 libucrt:assert.obj + 0002:0009a928 $unwind$??$common_assert_to_stderr@_W@@YAXQEB_W0I@Z 00000001800d8928 libucrt:assert.obj + 0002:0009a944 $unwind$??$common_assert_to_message_box@_W@@YAXQEB_W0IQEAX@Z 00000001800d8944 libucrt:assert.obj + 0002:0009a960 $unwind$??$common_assert_to_message_box_build_string@_W@@YAXQEA_W_KQEB_W2IQEAX@Z 00000001800d8960 libucrt:assert.obj + 0002:0009a980 $unwind$__acrt_call_reportfault 00000001800d8980 libucrt:invalid_parameter.obj + 0002:0009a9a0 $unwind$__acrt_MessageBoxW 00000001800d89a0 libucrt:winapi_thunks.obj + 0002:0009a9a0 $unwind$_invalid_parameter 00000001800d89a0 libucrt:invalid_parameter.obj + 0002:0009a9b4 $unwind$__stdio_common_vfprintf 00000001800d89b4 libucrt:output.obj + 0002:0009a9b4 $unwind$__stdio_common_vfwprintf 00000001800d89b4 libucrt:output.obj + 0002:0009a9bc $unwind$??$common_vsprintf@Vstandard_base@__crt_stdio_output@@_W@@YAH_KQEA_W0QEB_WQEAU__crt_locale_pointers@@QEAD@Z 00000001800d89bc libucrt:output.obj + 0002:0009a9dc $unwind$??$parse_command_line@D@@YAXPEADPEAPEAD0PEA_K2@Z 00000001800d89dc libucrt:argv_parsing.obj + 0002:0009a9dc $unwind$?write_string_impl@?$output_adapter_common@DV?$stream_output_adapter@D@__crt_stdio_output@@@__crt_stdio_output@@IEBAXQEBDHQEAHAEAV__crt_deferred_errno_cache@@@Z 00000001800d89dc libucrt:output.obj + 0002:0009a9dc $unwind$?write_string_impl@?$output_adapter_common@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@__crt_stdio_output@@IEBAXQEB_WHQEAHAEAV__crt_deferred_errno_cache@@@Z 00000001800d89dc libucrt:output.obj + 0002:0009a9f8 $unwind$?process@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 00000001800d89f8 libucrt:output.obj + 0002:0009aa08 $unwind$?parse_int_from_format_string@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 00000001800d8a08 libucrt:output.obj + 0002:0009aa08 $unwind$?process@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 00000001800d8a08 libucrt:output.obj + 0002:0009aa08 $unwind$?process@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 00000001800d8a08 libucrt:output.obj + 0002:0009aa1c $unwind$?state_case_type@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d8a1c libucrt:output.obj + 0002:0009aa34 $unwind$?type_case_a@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d8a34 libucrt:output.obj + 0002:0009aa40 $unwind$?write_stored_string_tchar@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 00000001800d8a40 libucrt:output.obj + 0002:0009aa58 $unwind$??R@@QEBAHXZ 00000001800d8a58 libucrt:output.obj + 0002:0009aa58 $unwind$??R@@QEBAHXZ 00000001800d8a58 libucrt:output.obj + 0002:0009aa78 $unwind$?parse_int_from_format_string@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 00000001800d8a78 libucrt:output.obj + 0002:0009aa78 $unwind$?parse_int_from_format_string@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 00000001800d8a78 libucrt:output.obj + 0002:0009aa8c $unwind$?state_case_type@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d8a8c libucrt:output.obj + 0002:0009aaac $unwind$?type_case_c_tchar@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_N_W@Z 00000001800d8aac libucrt:output.obj + 0002:0009aaac $unwind$?type_case_c_tchar@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_N_W@Z 00000001800d8aac libucrt:output.obj + 0002:0009aabc $unwind$?type_case_a@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d8abc libucrt:output.obj + 0002:0009aabc $unwind$?type_case_a@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d8abc libucrt:output.obj + 0002:0009aacc $unwind$?write_stored_string_tchar@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_N_W@Z 00000001800d8acc libucrt:output.obj + 0002:0009aae0 $unwind$?write_string@?$string_output_adapter@_W@__crt_stdio_output@@QEBAXQEB_WHQEAHAEAV__crt_deferred_errno_cache@@@Z 00000001800d8ae0 libucrt:output.obj + 0002:0009aaf8 $unwind$?state_case_type@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800d8af8 libucrt:output.obj + 0002:0009ab1c $unwind$?write_stored_string_tchar@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_N_W@Z 00000001800d8b1c libucrt:output.obj + 0002:0009ab30 $unwind$??$write_multiple_characters@V?$string_output_adapter@_W@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$string_output_adapter@_W@0@DHQEAH@Z 00000001800d8b30 libucrt:output.obj + 0002:0009ab3c $unwind$??$write_multiple_characters@V?$stream_output_adapter@D@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$stream_output_adapter@D@0@DHQEAH@Z 00000001800d8b3c libucrt:output.obj + 0002:0009ab3c $unwind$??$write_multiple_characters@V?$stream_output_adapter@_W@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$stream_output_adapter@_W@0@DHQEAH@Z 00000001800d8b3c libucrt:output.obj + 0002:0009ab54 $unwind$??$type_case_integer_parse_into_buffer@I@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 00000001800d8b54 libucrt:output.obj + 0002:0009ab54 $unwind$??$type_case_integer_parse_into_buffer@I@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 00000001800d8b54 libucrt:output.obj + 0002:0009ab54 $unwind$??$type_case_integer_parse_into_buffer@I@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 00000001800d8b54 libucrt:output.obj + 0002:0009ab54 $unwind$??$type_case_integer_parse_into_buffer@_K@?$output_processor@DV?$stream_output_adapter@D@__crt_stdio_output@@V?$standard_base@DV?$stream_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 00000001800d8b54 libucrt:output.obj + 0002:0009ab54 $unwind$??$type_case_integer_parse_into_buffer@_K@?$output_processor@_WV?$stream_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$stream_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 00000001800d8b54 libucrt:output.obj + 0002:0009ab54 $unwind$??$type_case_integer_parse_into_buffer@_K@?$output_processor@_WV?$string_output_adapter@_W@__crt_stdio_output@@V?$standard_base@_WV?$string_output_adapter@_W@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 00000001800d8b54 libucrt:output.obj + 0002:0009ab5c $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8b5c libucrt:output.obj + 0002:0009ab80 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8b80 libucrt:output.obj + 0002:0009aba4 $unwind$log2 00000001800d8ba4 libucrt:log2.obj + 0002:0009abb0 $unwind$_mbsdec_l 00000001800d8bb0 libucrt:mbsdec.obj + 0002:0009abb0 $unwind$_stricmp_l 00000001800d8bb0 libucrt:stricmp.obj + 0002:0009abbc $unwind$_query_new_handler 00000001800d8bbc libucrt:new_handler.obj + 0002:0009abdc $unwind$?common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z 00000001800d8bdc libucrt:exit.obj + 0002:0009abe8 $unwind$??R@@QEBA@XZ 00000001800d8be8 libucrt:exit.obj + 0002:0009ac08 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8c08 libucrt:exit.obj + 0002:0009ac2c $unwind$_configure_narrow_argv 00000001800d8c2c libucrt:argv_parsing.obj + 0002:0009ac40 $unwind$??$free_environment@D@@YAXQEAPEAD@Z 00000001800d8c40 libucrt:environment_initialization.obj + 0002:0009ac40 $unwind$??$free_environment@_W@@YAXQEAPEA_W@Z 00000001800d8c40 libucrt:environment_initialization.obj + 0002:0009ac4c $unwind$_register_onexit_function 00000001800d8c4c libucrt:onexit.obj + 0002:0009ac54 $unwind$_execute_onexit_table 00000001800d8c54 libucrt:onexit.obj + 0002:0009ac5c $unwind$??R@@QEBAHXZ 00000001800d8c5c libucrt:onexit.obj + 0002:0009ac74 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8c74 libucrt:onexit.obj + 0002:0009ac98 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8c98 libucrt:onexit.obj + 0002:0009acbc $unwind$terminate 00000001800d8cbc libucrt:terminate.obj + 0002:0009acdc $unwind$??$parse_integer@KV?$c_string_character_source@D@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@D@0@H_N@Z 00000001800d8cdc libucrt:atox.obj + 0002:0009acf8 $unwind$??$parse_integer@KV?$c_string_character_source@_W@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@_W@0@H_N@Z 00000001800d8cf8 libucrt:atox.obj + 0002:0009ad10 $xdatasym 00000001800d8d10 libucrt:strncmp.obj + 0002:0009ad14 $unwind$__acrt_GetModuleFileNameA 00000001800d8d14 libucrt:getmodulefilenamea.obj + 0002:0009ad30 $unwind$?common_flush_all@@YAH_N@Z 00000001800d8d30 libucrt:fflush.obj + 0002:0009ad38 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8d38 libucrt:fflush.obj + 0002:0009ad5c $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8d5c libucrt:fflush.obj + 0002:0009ad84 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8d84 libucrt:fflush.obj + 0002:0009ada8 $unwind$setvbuf 00000001800d8da8 libucrt:setvbuf.obj + 0002:0009adb0 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8db0 libucrt:setvbuf.obj + 0002:0009add4 $unwind$__acrt_uninitialize_locale 00000001800d8dd4 libucrt:wsetlocale.obj + 0002:0009add4 $unwind$__acrt_get_sigabrt_handler 00000001800d8dd4 libucrt:signal.obj + 0002:0009addc $unwind$raise 00000001800d8ddc libucrt:signal.obj + 0002:0009ae18 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8e18 libucrt:signal.obj + 0002:0009ae3c $unwind$_free_base 00000001800d8e3c libucrt:free_base.obj + 0002:0009ae3c $unwind$?destroy_fls@@YAXPEAX@Z 00000001800d8e3c libucrt:per_thread_data.obj + 0002:0009ae3c $unwind$__acrt_locale_free_numeric 00000001800d8e3c libucrt:initnum.obj + 0002:0009ae3c $unwind$__acrt_locale_free_lc_time_if_unreferenced 00000001800d8e3c libucrt:locale_refcounting.obj + 0002:0009ae44 $unwind$?construct_ptd_array@@YAXQEAU__acrt_ptd@@@Z 00000001800d8e44 libucrt:per_thread_data.obj + 0002:0009ae4c $unwind$?destroy_ptd_array@@YAXQEAU__acrt_ptd@@@Z 00000001800d8e4c libucrt:per_thread_data.obj + 0002:0009ae54 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8e54 libucrt:per_thread_data.obj + 0002:0009ae78 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8e78 libucrt:per_thread_data.obj + 0002:0009ae9c $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8e9c libucrt:per_thread_data.obj + 0002:0009aec0 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d8ec0 libucrt:per_thread_data.obj + 0002:0009aee4 $unwind$__acrt_initialize_winapi_thunks 00000001800d8ee4 libucrt:winapi_thunks.obj + 0002:0009aeec $unwind$?fp_format_e@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 00000001800d8eec libucrt:cvt.obj + 0002:0009aeec $unwind$_mbtowc_l 00000001800d8eec libucrt:mbtowc.obj + 0002:0009aeec $unwind$__acrt_LCMapStringEx 00000001800d8eec libucrt:winapi_thunks.obj + 0002:0009af00 $unwind$__acrt_is_interactive 00000001800d8f00 libucrt:winapi_thunks.obj + 0002:0009af14 $unwind$_fcloseall 00000001800d8f14 libucrt:closeall.obj + 0002:0009af38 $unwind$__acrt_initialize_lowio 00000001800d8f38 libucrt:ioinit.obj + 0002:0009af58 $unwind$?initialize_inherited_file_handles_nolock@@YAXXZ 00000001800d8f58 libucrt:ioinit.obj + 0002:0009af74 $unwind$_wctomb_s_l 00000001800d8f74 libucrt:wctomb.obj + 0002:0009af84 $unwind$__acrt_fp_format 00000001800d8f84 libucrt:cvt.obj + 0002:0009af98 $unwind$?fp_format_e_internal@@YAHQEAD_KH_NIQEAU_strflt@@2QEAU__crt_locale_pointers@@@Z 00000001800d8f98 libucrt:cvt.obj + 0002:0009afb0 $unwind$?fp_format_a@@YAHQEBNPEAD_KQEAD2H_NIQEAU__crt_locale_pointers@@@Z 00000001800d8fb0 libucrt:cvt.obj + 0002:0009afcc $unwind$__dcrt_get_narrow_environment_from_os 00000001800d8fcc libucrt:get_environment_from_os.obj + 0002:0009afcc $unwind$?fp_format_f_internal@@YAHQEAD_KHQEAU_strflt@@_NQEAU__crt_locale_pointers@@@Z 00000001800d8fcc libucrt:cvt.obj + 0002:0009afcc $unwind$??$__acrt_wcs_to_mbs_cp@U__crt_win32_buffer_internal_dynamic_resizing@@@@YAHQEB_WAEAV?$__crt_win32_buffer@DU__crt_win32_buffer_internal_dynamic_resizing@@@@I@Z 00000001800d8fcc libucrt:argv_wildcards.obj + 0002:0009afe4 $unwind$?fp_format_g@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 00000001800d8fe4 libucrt:cvt.obj + 0002:0009aff8 $unwind$_fputwc_nolock 00000001800d8ff8 libucrt:fputwc.obj + 0002:0009b014 $unwind$__acrt_stdio_end_temporary_buffering_nolock 00000001800d9014 libucrt:_sftbuf.obj + 0002:0009b01c $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d901c libucrt:wsetlocale.obj + 0002:0009b044 $unwind$_call_matherr 00000001800d9044 libucrt:libm_error.obj + 0002:0009b04c $unwind$_handle_error 00000001800d904c libucrt:libm_error.obj + 0002:0009b06c $unwind$_write 00000001800d906c libucrt:write.obj + 0002:0009b09c $unwind$_write_nolock 00000001800d909c libucrt:write.obj + 0002:0009b0b4 $unwind$?write_double_translated_ansi_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z 00000001800d90b4 libucrt:write.obj + 0002:0009b0d8 $unwind$?write_text_ansi_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z 00000001800d90d8 libucrt:write.obj + 0002:0009b0d8 $unwind$?write_text_utf16le_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z 00000001800d90d8 libucrt:write.obj + 0002:0009b0f8 $unwind$?write_text_utf8_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z 00000001800d90f8 libucrt:write.obj + 0002:0009b11c $unwind$??$write_buffer_nolock@D@@YA_NDV__crt_stdio_stream@@@Z 00000001800d911c libucrt:_flsbuf.obj + 0002:0009b12c $unwind$??$write_buffer_nolock@_W@@YA_N_WV__crt_stdio_stream@@@Z 00000001800d912c libucrt:_flsbuf.obj + 0002:0009b13c $unwind$??$__acrt_mbs_to_wcs_cp@U__crt_win32_buffer_internal_dynamic_resizing@@@@YAHQEBDAEAV?$__crt_win32_buffer@_WU__crt_win32_buffer_internal_dynamic_resizing@@@@I@Z 00000001800d913c libucrt:argv_wildcards.obj + 0002:0009b154 $unwind$??$common_expand_argv_wildcards@D@@YAHQEAPEADQEAPEAPEAD@Z 00000001800d9154 libucrt:argv_wildcards.obj + 0002:0009b16c $unwind$??$copy_and_add_argument_to_buffer@D@@YAHQEBD0_KAEAV?$argument_list@D@?A0x5f5c8891@@@Z 00000001800d916c libucrt:argv_wildcards.obj + 0002:0009b188 $unwind$??$expand_argument_wildcards@D@@YAHQEAD0AEAV?$argument_list@D@?A0x5f5c8891@@@Z 00000001800d9188 libucrt:argv_wildcards.obj + 0002:0009b1ac $unwind$_setmbcp_nolock 00000001800d91ac libucrt:mbctype.obj + 0002:0009b1cc $unwind$__dcrt_lowio_ensure_console_output_initialized 00000001800d91cc libucrt:initcon.obj + 0002:0009b1cc $unwind$_isleadbyte_l 00000001800d91cc libucrt:_wctype.obj + 0002:0009b1cc $unwind$?getSystemCP@@YAHH@Z 00000001800d91cc libucrt:mbctype.obj + 0002:0009b1d4 $unwind$?update_thread_multibyte_data_internal@@YAPEAU__crt_multibyte_data@@QEAU__acrt_ptd@@QEAPEAU1@@Z 00000001800d91d4 libucrt:mbctype.obj + 0002:0009b1fc $unwind$?setmbcp_internal@@YAHH_NQEAU__acrt_ptd@@QEAPEAU__crt_multibyte_data@@@Z 00000001800d91fc libucrt:mbctype.obj + 0002:0009b20c $unwind$?setSBUpLow@@YAXPEAU__crt_multibyte_data@@@Z 00000001800d920c libucrt:mbctype.obj + 0002:0009b228 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d9228 libucrt:mbctype.obj + 0002:0009b24c $unwind$__GSHandlerCheckCommon 00000001800d924c LIBCMT:gshandler.obj + 0002:0009b24c $unwind$__acrt_WideCharToMultiByte 00000001800d924c libucrt:widechartomultibyte.obj + 0002:0009b254 $unwind$iswctype 00000001800d9254 libucrt:iswctype.obj + 0002:0009b260 $unwind$_isctype_l 00000001800d9260 libucrt:isctype.obj + 0002:0009b27c $unwind$_close 00000001800d927c libucrt:close.obj + 0002:0009b27c $unwind$_commit 00000001800d927c libucrt:commit.obj + 0002:0009b284 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d9284 libucrt:commit.obj + 0002:0009b2a8 $unwind$__acrt_update_thread_locale_data 00000001800d92a8 libucrt:locale_refcounting.obj + 0002:0009b2cc $unwind$fclose 00000001800d92cc libucrt:fclose.obj + 0002:0009b2f0 $unwind$__acrt_lowio_destroy_handle_array 00000001800d92f0 libucrt:osfinfo.obj + 0002:0009b300 $unwind$__acrt_lowio_ensure_fh_exists 00000001800d9300 libucrt:osfinfo.obj + 0002:0009b32c $unwind$?__mbsrtowcs_utf8@__crt_mbstring@@YA_KPEA_WPEAPEBD_KPEAU_Mbstatet@@@Z 00000001800d932c libucrt:mbrtowc.obj + 0002:0009b344 $unwind$__acrt_fltout 00000001800d9344 libucrt:cfout.obj + 0002:0009b364 $unwind$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 00000001800d9364 libucrt:cfout.obj + 0002:0009b37c $chain$0$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 00000001800d937c libucrt:cfout.obj + 0002:0009b390 $chain$1$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 00000001800d9390 libucrt:cfout.obj + 0002:0009b3a0 $unwind$__acrt_locale_free_monetary 00000001800d93a0 libucrt:initmon.obj + 0002:0009b3a8 $unwind$__acrt_locale_free_time 00000001800d93a8 libucrt:inittime.obj + 0002:0009b3b8 $unwind$__acrt_GetStringTypeA 00000001800d93b8 libucrt:getstringtypea.obj + 0002:0009b3e0 $unwind$_raise_exc_ex 00000001800d93e0 libucrt:fpexcept.obj + 0002:0009b3f4 $unwind$_ctrlfp 00000001800d93f4 libucrt:fpctrl.obj + 0002:0009b41c $unwind$??$common_lseek@_J@@YA_JH_JH@Z 00000001800d941c libucrt:lseek.obj + 0002:0009b44c $unwind$_putwch_nolock 00000001800d944c libucrt:putwch.obj + 0002:0009b454 $unwind$qsort 00000001800d9454 libucrt:qsort.obj + 0002:0009b46c $chain$4$qsort 00000001800d946c libucrt:qsort.obj + 0002:0009b490 $chain$5$qsort 00000001800d9490 libucrt:qsort.obj + 0002:0009b4a0 $unwind$fallbackMethod 00000001800d94a0 libucrt:strpbrk.obj + 0002:0009b4b0 $unwind$__acrt_LCMapStringA 00000001800d94b0 libucrt:lcmapstringa.obj + 0002:0009b4c0 $unwind$?__acrt_LCMapStringA_stat@@YAHPEAU__crt_locale_pointers@@PEB_WKPEBDHPEADHHH@Z 00000001800d94c0 libucrt:lcmapstringa.obj + 0002:0009b4e8 $unwind$??$?RV@@AEAV@@V@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV@@AEAV@@$$QEAV@@@Z 00000001800d94e8 libucrt:close.obj + 0002:0009b50c $unwind$?__mbrtoc32_utf8@__crt_mbstring@@YA_KPEA_UPEBD_KPEAU_Mbstatet@@@Z 00000001800d950c libucrt:mbrtoc32.obj + 0002:0009b528 $xdatasym 00000001800d9528 libucrt:log10.obj + 0002:0009b538 $xdatasym 00000001800d9538 libucrt:fpsr.obj + 0002:0009b540 $unwind$__acrt_fenv_set_control 00000001800d9540 libucrt:_fenvutils.obj + 0002:0009b550 $unwind$__acrt_initialize_fma3 00000001800d9550 libucrt:fma3_available.obj + 0002:0009b558 $unwind$_log_special_common 00000001800d9558 libucrt:log_special.obj + 0002:0009b564 $unwind$?DloadObtainSection@@YAPEAXPEAK0@Z 00000001800d9564 DelayImp:delayhlp.obj + 0002:0009b574 $unwind$?DloadMakePermanentImageCommit@@YAXPEAX_K@Z 00000001800d9574 DelayImp:delayhlp.obj + 0002:0009b580 $unwind$?DloadProtectSection@@YAXKPEAK@Z 00000001800d9580 DelayImp:delayhlp.obj + 0002:0009b590 $unwind$__delayLoadHelper2 00000001800d9590 DelayImp:delayhlp.obj + 0002:0009b5ac $unwind$_IsNonwritableInCurrentImage 00000001800d95ac LIBCMT:pesect.obj + 0002:0009b5d0 $xdatasym 00000001800d95d0 LIBCMT:chkstk.obj + 0002:0009b5d8 $xdatasym 00000001800d95d8 libvcruntime:memcmp.obj + 0002:0009c230 .edata 00000001800da230 addon.exp + 0002:0009c258 rgpv 00000001800da258 addon.exp + 0002:0009c25c rgszName 00000001800da25c addon.exp + 0002:0009c260 rgwOrd 00000001800da260 addon.exp + 0002:0009c262 szName 00000001800da262 addon.exp + 0002:0009c26d $N00001 00000001800da26d addon.exp + 0002:0009c53c .idata$6 00000001800da53c kernel32:KERNEL32.dll + 0003:00000040 ?__vcrt_flsindex@@3KA 00000001800db040 libvcruntime:per_thread_data.obj + 0003:00000160 ?errno_no_memory@@3HA 00000001800db160 libucrt:errno.obj + 0003:00000164 ?doserrno_no_memory@@3KA 00000001800db164 libucrt:errno.obj + 0003:00000168 ?__acrt_flsindex@@3KA 00000001800db168 libucrt:per_thread_data.obj + 0003:00000660 _mbctypes 00000001800db660 libucrt:mbctype.obj + 0003:00000770 _mbcasemaps 00000001800db770 libucrt:mbctype.obj + 0003:00000870 ?__rgctypeflag@@3PADA 00000001800db870 libucrt:mbctype.obj + 0003:00000880 ?__rgcode_page_info@@3PAUcode_page_info@@A 00000001800db880 libucrt:mbctype.obj + 0003:00000a20 ?dazSupported@?1??_ctrlfp@@9@9 00000001800dba20 libucrt:fpctrl.obj + 0003:00000a30 ?__dcrt_lowio_console_output_handle@@3PEAXEA 00000001800dba30 libucrt:initcon.obj + 0003:00000a50 _module 00000001800dba50 addon.obj + 0003:00000cd0 GS_ExceptionRecord 00000001800dbcd0 LIBCMT:gs_report.obj + 0003:00000d70 GS_ContextRecord 00000001800dbd70 LIBCMT:gs_report.obj + 0003:00001240 ?g_tss_cv@@3U_RTL_CONDITION_VARIABLE@@A 00000001800dc240 LIBCMT:thread_safe_statics.obj + 0003:00001248 ?g_tss_event@@3PEAXEA 00000001800dc248 LIBCMT:thread_safe_statics.obj + 0003:00001250 ?g_tss_mutex@@3U_RTL_CRITICAL_SECTION@@A 00000001800dc250 LIBCMT:thread_safe_statics.obj + 0003:00001278 ?g_sleep_condition_variable_cs@@3P6AHPEAU_RTL_CONDITION_VARIABLE@@PEAU_RTL_CRITICAL_SECTION@@K@ZEA 00000001800dc278 LIBCMT:thread_safe_statics.obj + 0003:00001280 ?g_wake_all_condition_variable@@3P6AXPEAU_RTL_CONDITION_VARIABLE@@@ZEA 00000001800dc280 LIBCMT:thread_safe_statics.obj + 0003:00001288 ?__proc_attached@@3HA 00000001800dc288 LIBCMT:dll_dllmain.obj + 0003:000012a0 ?is_initialized_as_dll@@3_NA 00000001800dc2a0 LIBCMT:utility.obj + 0003:000012a1 ?module_local_atexit_table_initialized@@3_NA 00000001800dc2a1 LIBCMT:utility.obj + 0003:000012a8 ?module_local_atexit_table@@3U_onexit_table_t@@A 00000001800dc2a8 LIBCMT:utility.obj + 0003:000012c0 ?module_local_at_quick_exit_table@@3U_onexit_table_t@@A 00000001800dc2c0 LIBCMT:utility.obj + 0003:00001320 ?__vcrt_startup_thread_ptd@@3U__vcrt_ptd@@A 00000001800dc320 libvcruntime:per_thread_data.obj + 0003:000013a0 __vcrt_lock_table 00000001800dc3a0 libvcruntime:locks.obj + 0003:000013c8 __vcrt_locks_initialized 00000001800dc3c8 libvcruntime:locks.obj + 0003:00001410 ?heap@@3V_HeapManager@@A 00000001800dc410 libvcruntime:undname.obj + 0003:00001438 ?module_handles@@3PAPEAUHINSTANCE__@@A 00000001800dc438 libvcruntime:winapi_downlevel.obj + 0003:00001450 ?function_pointers@@3PAPEAXA 00000001800dc450 libvcruntime:winapi_downlevel.obj + 0003:00001478 ?__acrt_invalid_parameter_handler@@3V?$dual_state_global@P6AXPEB_W00I_K@Z@__crt_state_management@@A 00000001800dc478 libucrt:invalid_parameter.obj + 0003:00001498 ?__acrt_new_handler@@3V?$dual_state_global@P6AH_K@Z@__crt_state_management@@A 00000001800dc498 libucrt:new_handler.obj + 0003:000014a0 ?c_termination_complete@@3JA 00000001800dc4a0 libucrt:exit.obj + 0003:000014a8 ?thread_local_exit_callback_func@@3P6AXPEAXK0@ZEA 00000001800dc4a8 libucrt:exit.obj + 0003:000014c0 ?program_name@?1???$common_configure_argv@D@@YAHW4_crt_argv_mode@@@Z@4PADA 00000001800dc4c0 libucrt:argv_parsing.obj + 0003:00001618 ?__acrt_app_type@@3W4_crt_app_type@@A 00000001800dc618 libucrt:report_runtime_error.obj + 0003:0000161c __acrt_error_mode 00000001800dc61c libucrt:set_error_mode.obj + 0003:00001620 ?ctrlc_action@@3V?$dual_state_global@P6AXH@Z@__crt_state_management@@A 00000001800dc620 libucrt:signal.obj + 0003:00001628 ?ctrlbreak_action@@3V?$dual_state_global@P6AXH@Z@__crt_state_management@@A 00000001800dc628 libucrt:signal.obj + 0003:00001630 ?abort_action@@3V?$dual_state_global@P6AXH@Z@__crt_state_management@@A 00000001800dc630 libucrt:signal.obj + 0003:00001638 ?term_action@@3V?$dual_state_global@P6AXH@Z@__crt_state_management@@A 00000001800dc638 libucrt:signal.obj + 0003:00001640 ?module_handles@@3PAPEAUHINSTANCE__@@A 00000001800dc640 libucrt:winapi_thunks.obj + 0003:000016e0 ?encoded_function_pointers@@3PAPEAXA 00000001800dc6e0 libucrt:winapi_thunks.obj + 0003:00001bf8 ?internal_state@?1??_mbtowc_l@@9@4U_Mbstatet@@A 00000001800dcbf8 libucrt:mbtowc.obj + 0003:00001c00 ?enable_percent_n@@3_KA 00000001800dcc00 libucrt:printf_count_output.obj + 0003:00001c30 ?__acrt_lock_table@@3PAU_RTL_CRITICAL_SECTION@@A 00000001800dcc30 libucrt:locks.obj + 0003:00001e60 ?__acrt_locks_initialized@@3IA 00000001800dce60 libucrt:locks.obj + 0003:00001e64 ?state_cache@?1???$get_cached_win_policy@Udeveloper_information_policy_properties@?1??__acrt_get_developer_information_policy@@YA?AW4developer_information_policy@@XZ@@@YA?AW4developer_information_policy@@W4AppPolicyShowDeveloperDiagnostic@@@Z@4JA 00000001800dce64 libucrt:win_policies.obj + 0003:00001e68 ?state_cache@?1???$get_cached_win_policy@Uwindowing_model_policy_properties@?1??__acrt_get_windowing_model_policy@@YA?AW4windowing_model_policy@@XZ@@@YA?AW4windowing_model_policy@@W4AppPolicyWindowingModel@@@Z@4JA 00000001800dce68 libucrt:win_policies.obj + 0003:00001e88 ?fSystemSet@@3HA 00000001800dce88 libucrt:mbctype.obj + 0003:00001e8c ?initialized@?1??__acrt_initialize_multibyte@@9@4_NA 00000001800dce8c libucrt:mbctype.obj + 0003:00001ec8 ?user_matherr@@3V?$dual_state_global@P6AHPEAU_exception@@@Z@__crt_state_management@@A 00000001800dcec8 libucrt:matherr.obj + 0003:00001ed0 ?__acrt_global_new_mode@@3V?$dual_state_global@J@__crt_state_management@@A 00000001800dced0 libucrt:new_mode.obj + 0003:00001ee0 ?internal_pst@?1??__mbrtoc32_utf8@__crt_mbstring@@YA_KPEA_UPEBD_KPEAU_Mbstatet@@@Z@4U3@A 00000001800dcee0 libucrt:mbrtoc32.obj + 0003:00001f30 ?$TSS0@?9??WriteMetaBlockInternal@BrotliCompressor@brotli@@AEAA_N_N0PEA_KPEAPEAE@Z@4HA 00000001800dcf30 encode.obj + 0003:00001f38 ?kBitCostThreshold@?9??WriteMetaBlockInternal@BrotliCompressor@brotli@@AEAA_N_N0PEA_KPEAPEAE@Z@4NB 00000001800dcf38 encode.obj + 0005:00000000 MsetTab 00000001800e1000 libvcruntime:memset.obj + 0005:00000050 MoveSmall 00000001800e1050 libvcruntime:memcpy.obj + 0006:00000060 $R000000 00000001800e2060 * linker generated manifest res * + + Exports + + ordinal name + + 1 _register_addon_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/addon.node b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/addon.node new file mode 100644 index 0000000..246355a Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/addon.node differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/addon.pdb b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/addon.pdb new file mode 100644 index 0000000..e7c7e68 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/addon.pdb differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.node.recipe b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.node.recipe new file mode 100644 index 0000000..d1bfde6 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.node.recipe @@ -0,0 +1,11 @@ + + + + + D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\Release\addon.node + + + + + + \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.obj new file mode 100644 index 0000000..1298eb3 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.11640.write.1.tlog b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.11640.write.1.tlog new file mode 100644 index 0000000..7b55127 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.11640.write.1.tlog differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.command.1.tlog b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.command.1.tlog new file mode 100644 index 0000000..239ea33 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.command.1.tlog differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.read.1.tlog b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.read.1.tlog new file mode 100644 index 0000000..2520046 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/CL.read.1.tlog differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/addon.lastbuildstate b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/addon.lastbuildstate new file mode 100644 index 0000000..872e871 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/addon.lastbuildstate @@ -0,0 +1,2 @@ +PlatformToolSet=v142:VCToolArchitecture=Native64Bit:VCToolsVersion=14.28.29333:TargetPlatformVersion=10.0.18362.0: +Release|x64|D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\| diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/addon.write.1u.tlog b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/addon.write.1u.tlog new file mode 100644 index 0000000..a639191 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/addon.write.1u.tlog differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.command.1.tlog b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.command.1.tlog new file mode 100644 index 0000000..7649fca Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.command.1.tlog differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.read.1.tlog b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.read.1.tlog new file mode 100644 index 0000000..561bc39 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.read.1.tlog differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.write.1.tlog b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.write.1.tlog new file mode 100644 index 0000000..51bac4f Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/addon.tlog/link.write.1.tlog differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/backward_references.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/backward_references.obj new file mode 100644 index 0000000..c43f2bb Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/backward_references.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/block_splitter.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/block_splitter.obj new file mode 100644 index 0000000..29bad56 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/block_splitter.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/brotli_bit_stream.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/brotli_bit_stream.obj new file mode 100644 index 0000000..0d78aa4 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/brotli_bit_stream.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/encode.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/encode.obj new file mode 100644 index 0000000..92a826f Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/encode.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/encode_parallel.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/encode_parallel.obj new file mode 100644 index 0000000..64d405c Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/encode_parallel.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/entropy_encode.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/entropy_encode.obj new file mode 100644 index 0000000..8f99244 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/entropy_encode.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/font.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/font.obj new file mode 100644 index 0000000..8429dcf Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/font.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/glyph.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/glyph.obj new file mode 100644 index 0000000..a24bc9e Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/glyph.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/histogram.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/histogram.obj new file mode 100644 index 0000000..ab3dc60 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/histogram.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/literal_cost.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/literal_cost.obj new file mode 100644 index 0000000..bad610a Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/literal_cost.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/metablock.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/metablock.obj new file mode 100644 index 0000000..f646ab3 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/metablock.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/normalize.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/normalize.obj new file mode 100644 index 0000000..50d3790 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/normalize.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/streams.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/streams.obj new file mode 100644 index 0000000..5916aff Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/streams.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/table_tags.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/table_tags.obj new file mode 100644 index 0000000..c948cb7 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/table_tags.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/transform.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/transform.obj new file mode 100644 index 0000000..75f700b Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/transform.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/variable_length.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/variable_length.obj new file mode 100644 index 0000000..b1d7053 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/variable_length.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/win_delay_load_hook.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/win_delay_load_hook.obj new file mode 100644 index 0000000..5603ca4 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/win_delay_load_hook.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/woff2_common.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/woff2_common.obj new file mode 100644 index 0000000..220a52a Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/woff2_common.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/woff2_enc.obj b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/woff2_enc.obj new file mode 100644 index 0000000..207034f Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/build/Release/obj/addon/woff2_enc.obj differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/addon.vcxproj b/packages/字体精简工具/node_modules/ttf2woff2/build/addon.vcxproj new file mode 100644 index 0000000..56ac43c --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/build/addon.vcxproj @@ -0,0 +1,170 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {46DF3445-DA9F-2BE3-00FC-63170CA4C4DE} + Win32Proj + addon + true + x64 + 10.0.18362.0 + + + + DynamicLibrary + + + v142 + + + + + + + + + + $(ExecutablePath);$(MSBuildProjectDirectory)\..\bin\;$(MSBuildProjectDirectory)\..\bin\ + true + $(Configuration)\obj\$(ProjectName)\ + false + true + $(SolutionDir)$(Configuration)\ + .node + .node + .node + .node + $(ProjectName) + $(OutDir)\$(ProjectName).node + + + + C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\include\node;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\src;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\openssl\config;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\openssl\openssl\include;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\uv\include;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\zlib;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\v8\include;..\..\nan;%(AdditionalIncludeDirectories) + /bigobj %(AdditionalOptions) + EnableFastChecks + true + false + OldStyle + 4351;4355;4800;4251;4275;4244;4267;%(DisableSpecificWarnings) + false + false + true + false + Disabled + NotUsing + NODE_GYP_MODULE_NAME=addon;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;OPENSSL_NO_PINSHARED;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";DEBUG;_DEBUG;V8_ENABLE_CHECKS;%(PreprocessorDefinitions) + MultiThreadedDebug + true + true + false + Level3 + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;"C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\x64\node.lib" + /ignore:4199 %(AdditionalOptions) + true + true + node.exe;%(DelayLoadDLLs) + true + true + true + $(OutDir)$(ProjectName).node + true + true + .node + MachineX64 + + + C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\include\node;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\src;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\openssl\config;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\openssl\openssl\include;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\uv\include;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\zlib;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\v8\include;..\..\nan;%(AdditionalIncludeDirectories) + NODE_GYP_MODULE_NAME=addon;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;OPENSSL_NO_PINSHARED;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";DEBUG;_DEBUG;V8_ENABLE_CHECKS;%(PreprocessorDefinitions);%(PreprocessorDefinitions) + + + + + C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\include\node;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\src;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\openssl\config;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\openssl\openssl\include;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\uv\include;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\zlib;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\v8\include;..\..\nan;%(AdditionalIncludeDirectories) + %(AdditionalOptions) + true + false + OldStyle + 4351;4355;4800;4251;4275;4244;4267;%(DisableSpecificWarnings) + false + Speed + true + AnySuitable + true + true + true + Full + NotUsing + NODE_GYP_MODULE_NAME=addon;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;OPENSSL_NO_PINSHARED;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";%(PreprocessorDefinitions) + MultiThreaded + false + true + true + false + Level3 + true + + + /LTCG:INCREMENTAL %(AdditionalOptions) + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;"C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\x64\node.lib" + /ignore:4199 /LTCG:INCREMENTAL %(AdditionalOptions) + true + true + node.exe;%(DelayLoadDLLs) + true + true + true + true + true + $(OutDir)$(ProjectName).node + true + true + .node + MachineX64 + + + C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\include\node;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\src;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\openssl\config;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\openssl\openssl\include;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\uv\include;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\zlib;C:\Users\Administrator\AppData\Local\node-gyp\Cache\10.17.0\deps\v8\include;..\..\nan;%(AdditionalIncludeDirectories) + NODE_GYP_MODULE_NAME=addon;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;OPENSSL_NO_PINSHARED;BUILDING_NODE_EXTENSION;HOST_BINARY="node.exe";%(PreprocessorDefinitions);%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/addon.vcxproj.filters b/packages/字体精简工具/node_modules/ttf2woff2/build/addon.vcxproj.filters new file mode 100644 index 0000000..cf8ad20 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/build/addon.vcxproj.filters @@ -0,0 +1,265 @@ + + + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {AA5A2424-BF4B-2D0E-A03D-9BC526F055E8} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {AA5A2424-BF4B-2D0E-A03D-9BC526F055E8} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {AA5A2424-BF4B-2D0E-A03D-9BC526F055E8} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {AA5A2424-BF4B-2D0E-A03D-9BC526F055E8} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {AA5A2424-BF4B-2D0E-A03D-9BC526F055E8} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {AA5A2424-BF4B-2D0E-A03D-9BC526F055E8} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {AA5A2424-BF4B-2D0E-A03D-9BC526F055E8} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {AA5A2424-BF4B-2D0E-A03D-9BC526F055E8} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + {8556DCA2-6C1A-59FD-7AE4-68CBB5F240BF} + + + {3D195042-CAF3-E4EB-53FD-C085FC7A6AC3} + + + {7B735499-E5DD-1C2B-6C26-70023832A1CF} + + + {92EF4BA8-6BC2-65D1-451F-28EBD4AE726A} + + + {A3C8E949-BCF6-0C67-6656-340A2A097708} + + + {56DF7A98-063D-FB9D-485C-089023B4C16A} + + + {741E0E76-39B2-B1AB-9FA1-F1A20B16F295} + + + {56DF7A98-063D-FB9D-485C-089023B4C16A} + + + {77348C0E-2034-7791-74D5-63C077DF5A3B} + + + {8CDEE807-BC53-E450-C8B8-4DEBB66742D4} + + + {739DB09A-CC57-A953-A6CF-F64FA08E4FA7} + + + + + ..\csrc + + + ..\csrc\woff2 + + + ..\csrc\woff2 + + + ..\csrc\woff2 + + + ..\csrc\woff2 + + + ..\csrc\woff2 + + + ..\csrc\woff2 + + + ..\csrc\woff2 + + + ..\csrc\woff2 + + + ..\csrc\enc + + + ..\csrc\enc + + + ..\csrc\enc + + + ..\csrc\enc + + + ..\csrc\enc + + + ..\csrc\enc + + + ..\csrc\enc + + + ..\csrc\enc + + + ..\csrc\enc + + + ..\csrc\enc + + + C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src + + + .. + + + diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/binding.sln b/packages/字体精简工具/node_modules/ttf2woff2/build/binding.sln new file mode 100644 index 0000000..9ac9a3b --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/build/binding.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2015 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "addon", "addon.vcxproj", "{46DF3445-DA9F-2BE3-00FC-63170CA4C4DE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {46DF3445-DA9F-2BE3-00FC-63170CA4C4DE}.Debug|x64.ActiveCfg = Debug|x64 + {46DF3445-DA9F-2BE3-00FC-63170CA4C4DE}.Debug|x64.Build.0 = Debug|x64 + {46DF3445-DA9F-2BE3-00FC-63170CA4C4DE}.Release|x64.ActiveCfg = Release|x64 + {46DF3445-DA9F-2BE3-00FC-63170CA4C4DE}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/packages/字体精简工具/node_modules/ttf2woff2/build/config.gypi b/packages/字体精简工具/node_modules/ttf2woff2/build/config.gypi new file mode 100644 index 0000000..a7166f0 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/build/config.gypi @@ -0,0 +1,197 @@ +# Do not edit. File was generated by node-gyp's "configure" step +{ + "target_defaults": { + "cflags": [], + "default_configuration": "Release", + "defines": [], + "include_dirs": [], + "libraries": [], + "msbuild_toolset": "v142", + "msvs_windows_target_platform_version": "10.0.18362.0" + }, + "variables": { + "asan": 0, + "build_v8_with_gn": "false", + "coverage": "false", + "debug_nghttp2": "false", + "enable_lto": "false", + "enable_pgo_generate": "false", + "enable_pgo_use": "false", + "force_dynamic_crt": 0, + "host_arch": "x64", + "icu_data_in": "..\\..\\deps/icu-small\\source/data/in\\icudt64l.dat", + "icu_endianness": "l", + "icu_gyp_path": "tools/icu/icu-generic.gyp", + "icu_locales": "en,root", + "icu_path": "deps/icu-small", + "icu_small": "true", + "icu_ver_major": "64", + "nasm_version": "2.14", + "node_byteorder": "little", + "node_debug_lib": "false", + "node_enable_d8": "false", + "node_enable_v8_vtunejit": "false", + "node_install_npm": "true", + "node_module_version": 64, + "node_no_browser_globals": "false", + "node_prefix": "/usr/local", + "node_release_urlbase": "https://nodejs.org/download/release/", + "node_shared": "false", + "node_shared_cares": "false", + "node_shared_http_parser": "false", + "node_shared_libuv": "false", + "node_shared_nghttp2": "false", + "node_shared_openssl": "false", + "node_shared_zlib": "false", + "node_tag": "", + "node_target_type": "executable", + "node_use_bundled_v8": "true", + "node_use_dtrace": "false", + "node_use_etw": "true", + "node_use_large_pages": "false", + "node_use_openssl": "true", + "node_use_pch": "false", + "node_use_perfctr": "true", + "node_use_v8_platform": "true", + "node_with_ltcg": "true", + "node_without_node_options": "false", + "openssl_fips": "", + "openssl_no_asm": 0, + "shlib_suffix": "so.64", + "target_arch": "x64", + "v8_enable_gdbjit": 0, + "v8_enable_i18n_support": 1, + "v8_enable_inspector": 1, + "v8_no_strict_aliasing": 1, + "v8_optimized_debug": 0, + "v8_promise_internal_field_count": 1, + "v8_random_seed": 0, + "v8_trace_maps": 0, + "v8_typed_array_max_size_in_heap": 0, + "v8_use_snapshot": "true", + "want_separate_host_toolset": 0, + "nodedir": "C:\\Users\\Administrator\\AppData\\Local\\node-gyp\\Cache\\10.17.0", + "standalone_static_library": 1, + "msbuild_path": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\MSBuild\\Current\\Bin\\MSBuild.exe", + "access": "", + "allow_same_version": "", + "also": "", + "always_auth": "", + "audit": "true", + "audit_level": "low", + "auth_type": "legacy", + "before": "", + "bin_links": "true", + "browser": "", + "ca": "", + "cache": "C:\\Users\\Administrator\\AppData\\Roaming\\npm-cache", + "cache_lock_retries": "10", + "cache_lock_stale": "60000", + "cache_lock_wait": "10000", + "cache_max": "Infinity", + "cache_min": "10", + "cert": "", + "cidr": "", + "color": "true", + "commit_hooks": "true", + "depth": "Infinity", + "description": "true", + "dev": "", + "dry_run": "", + "editor": "notepad.exe", + "engine_strict": "", + "fetch_retries": "2", + "fetch_retry_factor": "10", + "fetch_retry_maxtimeout": "60000", + "fetch_retry_mintimeout": "10000", + "force": "", + "git": "git", + "git_tag_version": "true", + "global": "", + "globalconfig": "C:\\Users\\Administrator\\AppData\\Roaming\\npm\\etc\\npmrc", + "globalignorefile": "C:\\Users\\Administrator\\AppData\\Roaming\\npm\\etc\\npmignore", + "global_style": "", + "group": "", + "ham_it_up": "", + "heading": "npm", + "https_proxy": "", + "if_present": "", + "ignore_prepublish": "", + "ignore_scripts": "", + "init_author_email": "", + "init_author_name": "", + "init_author_url": "", + "init_license": "ISC", + "init_module": "C:\\Users\\Administrator\\.npm-init.js", + "init_version": "1.0.0", + "json": "", + "key": "", + "legacy_bundling": "", + "link": "", + "local_address": "", + "logs_max": "10", + "long": "", + "maxsockets": "50", + "message": "%s", + "metrics_registry": "https://registry.npmjs.org/", + "node_gyp": "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js", + "node_options": "", + "node_version": "10.17.0", + "noproxy": "", + "offline": "", + "onload_script": "", + "only": "", + "optional": "true", + "otp": "", + "package_lock": "true", + "package_lock_only": "", + "parseable": "", + "prefer_offline": "", + "prefer_online": "", + "prefix": "C:\\Users\\Administrator\\AppData\\Roaming\\npm", + "preid": "", + "production": "true", + "progress": "true", + "read_only": "", + "rebuild_bundle": "true", + "registry": "https://registry.npm.taobao.org/", + "rollback": "true", + "save": "true", + "save_bundle": "", + "save_dev": "", + "save_exact": "", + "save_optional": "", + "save_prefix": "^", + "save_prod": "", + "scope": "", + "scripts_prepend_node_path": "auto", + "script_shell": "", + "searchexclude": "", + "searchlimit": "20", + "searchopts": "", + "searchstaleness": "900", + "send_metrics": "", + "shell": "C:\\Windows\\system32\\cmd.exe", + "shrinkwrap": "true", + "sign_git_commit": "", + "sign_git_tag": "", + "sso_poll_frequency": "500", + "sso_type": "oauth", + "strict_ssl": "true", + "tag": "latest", + "tag_version_prefix": "v", + "timing": "", + "tmp": "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp", + "umask": "0000", + "unicode": "", + "unsafe_perm": "true", + "update_notifier": "true", + "usage": "", + "user": "", + "userconfig": "C:\\Users\\Administrator\\.npmrc", + "user_agent": "npm/6.11.3 node/v10.17.0 win32 x64", + "version": "", + "versions": "", + "viewer": "browser" + } +} diff --git a/packages/字体精简工具/node_modules/ttf2woff2/builderror.log b/packages/字体精简工具/node_modules/ttf2woff2/builderror.log new file mode 100644 index 0000000..1380ee8 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/builderror.log @@ -0,0 +1,88 @@ + +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2>if not defined npm_config_node_gyp (node "C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" configure ) else (node "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" configure ) + +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2>if not defined npm_config_node_gyp (node "C:\Program Files\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" build ) else (node "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" build ) +ڴ˽һһĿҪòɣӡ-mء + addon.cc + glyph.cc + font.cc + normalize.cc + table_tags.cc + transform.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\woff2\font.cc(147,24): warning C4018: <: з/޷Ųƥ [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\woff2\font.cc(370,21): warning C4018: >: з/޷Ųƥ [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + variable_length.cc + woff2_common.cc + woff2_enc.cc + backward_references.cc + block_splitter.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28,19): warning C4099: brotli::BlockSplit: ǰʹáclassʹõǡstruct (Դļ ..\csrc\enc\block_splitter.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28): message : μbrotli::BlockSplit (Դļ ..\csrc\enc\block_splitter.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + brotli_bit_stream.cc + encode.cc + encode_parallel.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28,19): warning C4099: brotli::BlockSplit: ǰʹáclassʹõǡstruct (Դļ ..\csrc\enc\brotli_bit_stream.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28): message : μbrotli::BlockSplit (Դļ ..\csrc\enc\brotli_bit_stream.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + entropy_encode.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(38,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\woff2\woff2_enc.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(40,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\woff2\woff2_enc.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(56,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\woff2\woff2_enc.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(63,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\woff2\woff2_enc.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(65,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\woff2\woff2_enc.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(66,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\woff2\woff2_enc.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(89,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\woff2\woff2_enc.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\encode.h(77,35): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\woff2\woff2_enc.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(396,11): warning C4018: >: з/޷Ųƥ (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(360): message : ڱ ģ Աbool brotli::HashLongestMatch<15,8,2,16,true,false>::FindLongestMatch(const uint8_t *__restrict ,const size_t,const float *__restrict ,const size_t,const double,const int *__restrict ,const uint32_t,uint32_t,const uint32_t,int *__restrict ,int *__restrict ,int *__restrict ,double *__restrict )ʱ (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\backward_references.cc(95): message : 鿴ڱĺ ģ ʵbool brotli::HashLongestMatch<15,8,2,16,true,false>::FindLongestMatch(const uint8_t *__restrict ,const size_t,const float *__restrict ,const size_t,const double,const int *__restrict ,const uint32_t,uint32_t,const uint32_t,int *__restrict ,int *__restrict ,int *__restrict ,double *__restrict ) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(612): message : 鿴ڱ ģ ʵbrotli::HashLongestMatch<15,8,2,16,true,false> (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(512,19): warning C4018: <=: з/޷Ųƥ (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\entropy_encode.cc(377,26): warning C4018: <: з/޷Ųƥ [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\entropy_encode.cc(380,32): warning C4018: <: з/޷Ųƥ [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\entropy_encode.cc(407,21): warning C4018: <: з/޷Ųƥ [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\entropy_encode.cc(426,26): warning C4018: <: з/޷Ųƥ [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\entropy_encode.cc(431,34): warning C4018: <: з/޷Ųƥ [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + histogram.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(38,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(40,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(56,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(63,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(65,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(66,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(89,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\encode.h(77,35): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28,19): warning C4099: brotli::BlockSplit: ǰʹáclassʹõǡstruct (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28): message : μbrotli::BlockSplit (Դļ ..\csrc\enc\encode.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(207,11): warning C4018: >: з/޷Ųƥ (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(166): message : ڱ ģ Աbool brotli::HashLongestMatchQuickly<17,4>::FindLongestMatch(const uint8_t *__restrict ,const size_t,const float *__restrict ,const size_t,const double,const int *__restrict ,const uint32_t,const uint32_t,const uint32_t,int *__restrict ,int *__restrict ,int *__restrict ,double *__restrict )ʱ (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\backward_references.cc(95): message : 鿴ڱĺ ģ ʵbool brotli::HashLongestMatchQuickly<17,4>::FindLongestMatch(const uint8_t *__restrict ,const size_t,const float *__restrict ,const size_t,const double,const int *__restrict ,const uint32_t,const uint32_t,const uint32_t,int *__restrict ,int *__restrict ,int *__restrict ,double *__restrict ) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(605): message : 鿴ڱ ģ ʵbrotli::HashLongestMatchQuickly<17,4> (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(231,13): warning C4018: >: з/޷Ųƥ (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\hash.h(261,19): warning C4018: <=: з/޷Ųƥ (Դļ ..\csrc\enc\backward_references.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + literal_cost.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(38,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(40,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(56,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(63,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(65,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(66,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\ringbuffer.h(89,1): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + metablock.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\encode.h(77,35): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28,19): warning C4099: brotli::BlockSplit: ǰʹáclassʹõǡstruct (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28): message : μbrotli::BlockSplit (Դļ ..\csrc\enc\encode_parallel.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + streams.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\literal_cost.cc(117,24): warning C4305: +=: ӡdoublefloatض [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\literal_cost.cc(162,22): warning C4305: +=: ӡdoublefloatض [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + win_delay_load_hook.cc +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28,19): warning C4099: brotli::BlockSplit: ǰʹáclassʹõǡstruct (Դļ ..\csrc\enc\histogram.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28): message : μbrotli::BlockSplit (Դļ ..\csrc\enc\histogram.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28,19): warning C4099: brotli::BlockSplit: ǰʹáclassʹõǡstruct (Դļ ..\csrc\enc\metablock.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\metablock.h(28): message : μbrotli::BlockSplit (Դļ ..\csrc\enc\metablock.cc) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] +D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\csrc\enc\encode_parallel.cc(313,52): warning C4334: <<: 32 λλĽʽתΪ 64 λ(Ƿϣ 64 λλ?) [D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\addon.vcxproj] + ڴ D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\Release\addon.lib Ͷ D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\Release\addon.exp + ɴ + Previous IPDB not found, fall back to full compilation. + All 2598 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. + ɴ + addon.vcxproj -> D:\workspace\plugin\mini_font\packages\mini_font\publish\mini_font\node_modules\ttf2woff2\build\Release\\addon.node diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/addon.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/addon.cc new file mode 100644 index 0000000..7712b72 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/addon.cc @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include "./woff2/woff2_enc.h" + +using namespace v8; + +NAN_METHOD(convert) { + Isolate *isolate = info.GetIsolate(); + Local context = isolate->GetCurrentContext(); + Local inputBuffer = info[0]->ToObject(context).ToLocalChecked(); + + if (!node::Buffer::HasInstance(inputBuffer)) { + Nan::ThrowError(Nan::TypeError("First arg should be a Buffer")); + return; + } + + size_t input_length = node::Buffer::Length(inputBuffer); + char* input_data = node::Buffer::Data(inputBuffer); + + // Determine the maximum needed length + size_t max_output_length = woff2::MaxWOFF2CompressedSize( + reinterpret_cast(input_data), input_length); + size_t actual_output_length = max_output_length; + + char* output_data = (char*) calloc(max_output_length, 1); + + // Create the Woff2 font + if (!woff2::ConvertTTFToWOFF2( + reinterpret_cast(input_data), input_length, + reinterpret_cast(output_data), &actual_output_length + )) { + Nan::ThrowError(Nan::Error("Could not convert the given font.")); + return; + } + + // Free the unused memory + output_data = (char*) realloc(output_data, actual_output_length); + + Nan::MaybeLocal outputBuffer = Nan::NewBuffer( + output_data, + actual_output_length + ); + + info.GetReturnValue().Set(outputBuffer.ToLocalChecked()); +} + + +NAN_MODULE_INIT(Init) { + Nan::Set(target, Nan::New("convert").ToLocalChecked(), + Nan::GetFunction(Nan::New(convert)).ToLocalChecked()); +} + +NODE_MODULE(addon, Init) diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/backward_references.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/backward_references.cc new file mode 100644 index 0000000..bfeaab6 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/backward_references.cc @@ -0,0 +1,374 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Function to find backward reference copies. + +#include "./backward_references.h" + +#include +#include + +#include "./command.h" + +namespace brotli { + +template +void CreateBackwardReferences(size_t num_bytes, + size_t position, + const uint8_t* ringbuffer, + size_t ringbuffer_mask, + const float* literal_cost, + size_t literal_cost_mask, + const size_t max_backward_limit, + const double base_min_score, + const int quality, + Hasher* hasher, + int* dist_cache, + int* last_insert_len, + Command* commands, + int* num_commands) { + if (num_bytes >= 3 && position >= 3) { + // Prepare the hashes for three last bytes of the last write. + // These could not be calculated before, since they require knowledge + // of both the previous and the current block. + hasher->Store(&ringbuffer[(position - 3) & ringbuffer_mask], + position - 3); + hasher->Store(&ringbuffer[(position - 2) & ringbuffer_mask], + position - 2); + hasher->Store(&ringbuffer[(position - 1) & ringbuffer_mask], + position - 1); + } + const Command * const orig_commands = commands; + int insert_length = *last_insert_len; + size_t i = position & ringbuffer_mask; + const int i_diff = position - i; + const size_t i_end = i + num_bytes; + + // For speed up heuristics for random data. + const int random_heuristics_window_size = quality < 9 ? 64 : 512; + int apply_random_heuristics = i + random_heuristics_window_size; + + double average_cost = 5.4; + if (kUseCostModel) { + average_cost = 0.0; + for (int k = position; k < position + num_bytes; ++k) { + average_cost += literal_cost[k & literal_cost_mask]; + } + if (num_bytes > 0) { + average_cost /= num_bytes; + } + } + + // M1 match is for considering for two repeated copies, if moving + // one literal form the previous copy to the current one allows the + // current copy to be more efficient (because the way static dictionary + // codes words). M1 matching improves text compression density by ~0.15 %. + bool match_found_M1 = false; + int best_len_M1 = 0; + int best_len_code_M1 = 0; + int best_dist_M1 = 0; + double best_score_M1 = 0; + while (i + 3 < i_end) { + int max_length = i_end - i; + size_t max_distance = std::min(i + i_diff, max_backward_limit); + double min_score = base_min_score; + if (kUseCostModel && insert_length < 8) { + double cost_diff[8] = + { 0.1, 0.038, 0.019, 0.013, 0.001, 0.001, 0.001, 0.001 }; + min_score += cost_diff[insert_length]; + } + int best_len = 0; + int best_len_code = 0; + int best_dist = 0; + double best_score = min_score; + bool match_found = hasher->FindLongestMatch( + ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, average_cost, + dist_cache, i + i_diff, max_length, max_distance, + &best_len, &best_len_code, &best_dist, &best_score); + if (match_found) { + if (kUseDictionary && match_found_M1 && best_score_M1 > best_score) { + // Two copies after each other. Take the last literal from the + // last copy, and use it as the first of this one. + Command prev_cmd = commands[-1]; + commands[-1] = Command(prev_cmd.insert_len_, + prev_cmd.copy_len_ - 1, + prev_cmd.copy_len_ - 1, + prev_cmd.DistanceCode()); + hasher->Store(ringbuffer + i, i + i_diff); + --i; + best_len = best_len_M1; + best_len_code = best_len_code_M1; + best_dist = best_dist_M1; + best_score = best_score_M1; + } else { + // Found a match. Let's look for something even better ahead. + int delayed_backward_references_in_row = 0; + for (;;) { + --max_length; + int best_len_2 = quality < 4 ? std::min(best_len - 1, max_length) : 0; + int best_len_code_2 = 0; + int best_dist_2 = 0; + double best_score_2 = min_score; + max_distance = std::min(i + i_diff + 1, max_backward_limit); + hasher->Store(ringbuffer + i, i + i_diff); + match_found = hasher->FindLongestMatch( + ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, average_cost, + dist_cache, i + i_diff + 1, max_length, max_distance, + &best_len_2, &best_len_code_2, &best_dist_2, &best_score_2); + double cost_diff_lazy = 7.0; + if (kUseCostModel) { + cost_diff_lazy = 0.0; + if (best_len >= 4) { + cost_diff_lazy += + literal_cost[(i + 4) & literal_cost_mask] - average_cost; + } + { + const int tail_length = best_len_2 - best_len + 1; + for (int k = 0; k < tail_length; ++k) { + cost_diff_lazy -= + literal_cost[(i + best_len + k) & literal_cost_mask] - + average_cost; + } + } + // If we are not inserting any symbols, inserting one is more + // expensive than if we were inserting symbols anyways. + if (insert_length < 1) { + cost_diff_lazy += 0.97; + } + // Add bias to slightly avoid lazy matching. + cost_diff_lazy += 2.0 + delayed_backward_references_in_row * 0.2; + cost_diff_lazy += 0.04 * literal_cost[i & literal_cost_mask]; + } + if (match_found && best_score_2 >= best_score + cost_diff_lazy) { + // Ok, let's just write one byte for now and start a match from the + // next byte. + ++i; + ++insert_length; + best_len = best_len_2; + best_len_code = best_len_code_2; + best_dist = best_dist_2; + best_score = best_score_2; + if (++delayed_backward_references_in_row < 4) { + continue; + } + } + break; + } + } + apply_random_heuristics = + i + 2 * best_len + random_heuristics_window_size; + max_distance = std::min(i + i_diff, max_backward_limit); + int distance_code = best_dist + 16; + if (best_dist <= max_distance) { + if (best_dist == dist_cache[0]) { + distance_code = 1; + } else if (best_dist == dist_cache[1]) { + distance_code = 2; + } else if (best_dist == dist_cache[2]) { + distance_code = 3; + } else if (best_dist == dist_cache[3]) { + distance_code = 4; + } else if (quality > 1 && best_dist >= 6) { + for (int k = 4; k < kNumDistanceShortCodes; ++k) { + int idx = kDistanceCacheIndex[k]; + int candidate = dist_cache[idx] + kDistanceCacheOffset[k]; + static const int kLimits[16] = { 0, 0, 0, 0, + 6, 6, 11, 11, + 11, 11, 11, 11, + 12, 12, 12, 12 }; + if (best_dist == candidate && best_dist >= kLimits[k]) { + distance_code = k + 1; + break; + } + } + } + if (distance_code > 1) { + dist_cache[3] = dist_cache[2]; + dist_cache[2] = dist_cache[1]; + dist_cache[1] = dist_cache[0]; + dist_cache[0] = best_dist; + } + } + Command cmd(insert_length, best_len, best_len_code, distance_code); + *commands++ = cmd; + insert_length = 0; + if (kUseDictionary) { + ++i; + // Copy all copied literals to the hasher, except the last one. + // We cannot store the last one yet, otherwise we couldn't find + // the possible M1 match. + for (int j = 1; j < best_len - 1; ++j) { + if (i + 3 < i_end) { + hasher->Store(ringbuffer + i, i + i_diff); + } + ++i; + } + // Prepare M1 match. + if (hasher->HasStaticDictionary() && + best_len >= 4 && i + 20 < i_end && best_dist <= max_distance) { + max_distance = std::min(i + i_diff, max_backward_limit); + best_score_M1 = min_score; + match_found_M1 = hasher->FindLongestMatch( + ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, average_cost, + dist_cache, i + i_diff, i_end - i, max_distance, + &best_len_M1, &best_len_code_M1, &best_dist_M1, &best_score_M1); + } else { + match_found_M1 = false; + } + if (kUseCostModel) { + // This byte is just moved from the previous copy to the current, + // that is no gain. + best_score_M1 -= literal_cost[i & literal_cost_mask]; + // Adjust for losing the opportunity for lazy matching. + best_score_M1 -= 3.75; + } + // Store the last one of the match. + if (i + 3 < i_end) { + hasher->Store(ringbuffer + i, i + i_diff); + } + ++i; + } else { + // Put the hash keys into the table, if there are enough + // bytes left. + for (int j = 1; j < best_len; ++j) { + hasher->Store(&ringbuffer[i + j], i + i_diff + j); + } + i += best_len; + } + } else { + match_found_M1 = false; + ++insert_length; + hasher->Store(ringbuffer + i, i + i_diff); + ++i; + // If we have not seen matches for a long time, we can skip some + // match lookups. Unsuccessful match lookups are very very expensive + // and this kind of a heuristic speeds up compression quite + // a lot. + if (i > apply_random_heuristics) { + // Going through uncompressible data, jump. + if (i > apply_random_heuristics + 4 * random_heuristics_window_size) { + // It is quite a long time since we saw a copy, so we assume + // that this data is not compressible, and store hashes less + // often. Hashes of non compressible data are less likely to + // turn out to be useful in the future, too, so we store less of + // them to not to flood out the hash table of good compressible + // data. + int i_jump = std::min(i + 16, i_end - 4); + for (; i < i_jump; i += 4) { + hasher->Store(ringbuffer + i, i + i_diff); + insert_length += 4; + } + } else { + int i_jump = std::min(i + 8, i_end - 3); + for (; i < i_jump; i += 2) { + hasher->Store(ringbuffer + i, i + i_diff); + insert_length += 2; + } + } + } + } + } + insert_length += (i_end - i); + *last_insert_len = insert_length; + *num_commands += (commands - orig_commands); +} + +void CreateBackwardReferences(size_t num_bytes, + size_t position, + const uint8_t* ringbuffer, + size_t ringbuffer_mask, + const float* literal_cost, + size_t literal_cost_mask, + const size_t max_backward_limit, + const double base_min_score, + const int quality, + Hashers* hashers, + int hash_type, + int* dist_cache, + int* last_insert_len, + Command* commands, + int* num_commands) { + switch (hash_type) { + case 1: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h1.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + case 2: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h2.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + case 3: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h3.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + case 4: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h4.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + case 5: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h5.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + case 6: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h6.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + case 7: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h7.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + case 8: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h8.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + case 9: + CreateBackwardReferences( + num_bytes, position, ringbuffer, ringbuffer_mask, + literal_cost, literal_cost_mask, max_backward_limit, base_min_score, + quality, hashers->hash_h9.get(), dist_cache, last_insert_len, + commands, num_commands); + break; + default: + break; + } +} + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/backward_references.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/backward_references.h new file mode 100644 index 0000000..691a7b1 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/backward_references.h @@ -0,0 +1,46 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Function to find backward reference copies. + +#ifndef BROTLI_ENC_BACKWARD_REFERENCES_H_ +#define BROTLI_ENC_BACKWARD_REFERENCES_H_ + +#include +#include + +#include "./hash.h" +#include "./command.h" + +namespace brotli { + +void CreateBackwardReferences(size_t num_bytes, + size_t position, + const uint8_t* ringbuffer, + size_t ringbuffer_mask, + const float* literal_cost, + size_t literal_cost_mask, + const size_t max_backward_limit, + const double base_min_score, + const int quality, + Hashers* hashers, + int hash_type, + int* dist_cache, + int* last_insert_len, + Command* commands, + int* num_commands); + +} // namespace brotli + +#endif // BROTLI_ENC_BACKWARD_REFERENCES_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/bit_cost.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/bit_cost.h new file mode 100644 index 0000000..47c35ef --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/bit_cost.h @@ -0,0 +1,168 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Functions to estimate the bit cost of Huffman trees. + +#ifndef BROTLI_ENC_BIT_COST_H_ +#define BROTLI_ENC_BIT_COST_H_ + +#include + +#include "./entropy_encode.h" +#include "./fast_log.h" + +namespace brotli { + +static inline double BitsEntropy(const int *population, int size) { + int sum = 0; + double retval = 0; + const int *population_end = population + size; + int p; + if (size & 1) { + goto odd_number_of_elements_left; + } + while (population < population_end) { + p = *population++; + sum += p; + retval -= p * FastLog2(p); + odd_number_of_elements_left: + p = *population++; + sum += p; + retval -= p * FastLog2(p); + } + if (sum) retval += sum * FastLog2(sum); + if (retval < sum) { + // At least one bit per literal is needed. + retval = sum; + } + return retval; +} + +static const int kHuffmanExtraBits[kCodeLengthCodes] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, +}; + +static inline int HuffmanTreeBitCost(const int* counts, const uint8_t* depth) { + int nbits = 0; + for (int i = 0; i < kCodeLengthCodes; ++i) { + nbits += counts[i] * (depth[i] + kHuffmanExtraBits[i]); + } + return nbits; +} + +static inline int HuffmanTreeBitCost( + const Histogram& histogram, + const EntropyCode& entropy) { + return HuffmanTreeBitCost(&histogram.data_[0], &entropy.depth_[0]); +} + +static inline int HuffmanBitCost(const uint8_t* depth, int length) { + int max_depth = 1; + int histogram[kCodeLengthCodes] = { 0 }; + int tail_start = 0; + int prev_value = 8; + // compute histogram of compacted huffman tree + for (int i = 0; i < length;) { + const int value = depth[i]; + if (value > max_depth) { + max_depth = value; + } + int reps = 1; + for (int k = i + 1; k < length && depth[k] == value; ++k) { + ++reps; + } + i += reps; + if (i == length && value == 0) + break; + if (value == 0) { + if (reps < 3) { + histogram[0] += reps; + } else { + reps -= 2; + while (reps > 0) { + ++histogram[17]; + reps >>= 3; + } + } + } else { + tail_start = i; + if (value != prev_value) { + ++histogram[value]; + --reps; + } + prev_value = value; + if (reps < 3) { + histogram[value] += reps; + } else { + reps -= 2; + while (reps > 0) { + ++histogram[16]; + reps >>= 2; + } + } + } + } + + // create huffman tree of huffman tree + uint8_t cost[kCodeLengthCodes] = { 0 }; + CreateHuffmanTree(histogram, kCodeLengthCodes, 7, cost); + // account for rle extra bits + cost[16] += 2; + cost[17] += 3; + + int tree_size = 0; + int bits = 18 + 2 * max_depth; // huffman tree of huffman tree cost + for (int i = 0; i < kCodeLengthCodes; ++i) { + bits += histogram[i] * cost[i]; // huffman tree bit cost + tree_size += histogram[i]; + } + return bits; +} + +template +double PopulationCost(const Histogram& histogram) { + if (histogram.total_count_ == 0) { + return 12; + } + int count = 0; + for (int i = 0; i < kSize && count < 5; ++i) { + if (histogram.data_[i] > 0) { + ++count; + } + } + if (count == 1) { + return 12; + } + if (count == 2) { + return 20 + histogram.total_count_; + } + uint8_t depth[kSize] = { 0 }; + CreateHuffmanTree(&histogram.data_[0], kSize, 15, depth); + int bits = 0; + for (int i = 0; i < kSize; ++i) { + bits += histogram.data_[i] * depth[i]; + } + if (count == 3) { + bits += 28; + } else if (count == 4) { + bits += 37; + } else { + bits += HuffmanBitCost(depth, kSize); + } + return bits; +} + +} // namespace brotli + +#endif // BROTLI_ENC_BIT_COST_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/block_splitter.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/block_splitter.cc new file mode 100644 index 0000000..080976d --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/block_splitter.cc @@ -0,0 +1,402 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Block split point selection utilities. + +#include "./block_splitter.h" + +#include +#include +#include +#include + +#include +#include + +#include "./cluster.h" +#include "./command.h" +#include "./fast_log.h" +#include "./histogram.h" + +namespace brotli { + +static const int kMaxLiteralHistograms = 100; +static const int kMaxCommandHistograms = 50; +static const double kLiteralBlockSwitchCost = 28.1; +static const double kCommandBlockSwitchCost = 13.5; +static const double kDistanceBlockSwitchCost = 14.6; +static const int kLiteralStrideLength = 70; +static const int kCommandStrideLength = 40; +static const int kSymbolsPerLiteralHistogram = 544; +static const int kSymbolsPerCommandHistogram = 530; +static const int kSymbolsPerDistanceHistogram = 544; +static const int kMinLengthForBlockSplitting = 128; +static const int kIterMulForRefining = 2; +static const int kMinItersForRefining = 100; + +void CopyLiteralsToByteArray(const Command* cmds, + const size_t num_commands, + const uint8_t* data, + std::vector* literals) { + // Count how many we have. + size_t total_length = 0; + for (int i = 0; i < num_commands; ++i) { + total_length += cmds[i].insert_len_; + } + if (total_length == 0) { + return; + } + + // Allocate. + literals->resize(total_length); + + // Loop again, and copy this time. + size_t pos = 0; + size_t from_pos = 0; + for (int i = 0; i < num_commands && pos < total_length; ++i) { + memcpy(&(*literals)[pos], data + from_pos, cmds[i].insert_len_); + pos += cmds[i].insert_len_; + from_pos += cmds[i].insert_len_ + cmds[i].copy_len_; + } +} + +void CopyCommandsToByteArray(const Command* cmds, + const size_t num_commands, + std::vector* insert_and_copy_codes, + std::vector* distance_prefixes) { + for (int i = 0; i < num_commands; ++i) { + const Command& cmd = cmds[i]; + insert_and_copy_codes->push_back(cmd.cmd_prefix_); + if (cmd.copy_len_ > 0 && cmd.cmd_prefix_ >= 128) { + distance_prefixes->push_back(cmd.dist_prefix_); + } + } +} + +inline static unsigned int MyRand(unsigned int* seed) { + *seed *= 16807U; + if (*seed == 0) { + *seed = 1; + } + return *seed; +} + +template +void InitialEntropyCodes(const DataType* data, size_t length, + int literals_per_histogram, + int max_histograms, + size_t stride, + std::vector* vec) { + int total_histograms = length / literals_per_histogram + 1; + if (total_histograms > max_histograms) { + total_histograms = max_histograms; + } + unsigned int seed = 7; + int block_length = length / total_histograms; + for (int i = 0; i < total_histograms; ++i) { + int pos = length * i / total_histograms; + if (i != 0) { + pos += MyRand(&seed) % block_length; + } + if (pos + stride >= length) { + pos = length - stride - 1; + } + HistogramType histo; + histo.Add(data + pos, stride); + vec->push_back(histo); + } +} + +template +void RandomSample(unsigned int* seed, + const DataType* data, + size_t length, + size_t stride, + HistogramType* sample) { + size_t pos = 0; + if (stride >= length) { + pos = 0; + stride = length; + } else { + pos = MyRand(seed) % (length - stride + 1); + } + sample->Add(data + pos, stride); +} + +template +void RefineEntropyCodes(const DataType* data, size_t length, + size_t stride, + std::vector* vec) { + int iters = + kIterMulForRefining * length / stride + kMinItersForRefining; + unsigned int seed = 7; + iters = ((iters + vec->size() - 1) / vec->size()) * vec->size(); + for (int iter = 0; iter < iters; ++iter) { + HistogramType sample; + RandomSample(&seed, data, length, stride, &sample); + int ix = iter % vec->size(); + (*vec)[ix].AddHistogram(sample); + } +} + +inline static float BitCost(int total, int count) { + return count == 0 ? FastLog2(total) + 2 : FastLog2(total) - FastLog2(count); +} + +template +void FindBlocks(const DataType* data, const size_t length, + const double block_switch_bitcost, + const std::vector > &vec, + uint8_t *block_id) { + if (vec.size() <= 1) { + for (int i = 0; i < length; ++i) { + block_id[i] = 0; + } + return; + } + int vecsize = vec.size(); + double* insert_cost = new double[kSize * vecsize]; + memset(insert_cost, 0, sizeof(insert_cost[0]) * kSize * vecsize); + for (int i = 0; i < kSize; ++i) { + for (int j = 0; j < vecsize; ++j) { + insert_cost[i * vecsize + j] = + BitCost(vec[j].total_count_, vec[j].data_[i]); + } + } + double *cost = new double[vecsize]; + memset(cost, 0, sizeof(cost[0]) * vecsize); + bool* switch_signal = new bool[length * vecsize]; + memset(switch_signal, 0, sizeof(switch_signal[0]) * length * vecsize); + // After each iteration of this loop, cost[k] will contain the difference + // between the minimum cost of arriving at the current byte position using + // entropy code k, and the minimum cost of arriving at the current byte + // position. This difference is capped at the block switch cost, and if it + // reaches block switch cost, it means that when we trace back from the last + // position, we need to switch here. + for (size_t byte_ix = 0; byte_ix < length; ++byte_ix) { + int ix = byte_ix * vecsize; + int insert_cost_ix = data[byte_ix] * vecsize; + double min_cost = 1e99; + for (int k = 0; k < vecsize; ++k) { + // We are coding the symbol in data[byte_ix] with entropy code k. + cost[k] += insert_cost[insert_cost_ix + k]; + if (cost[k] < min_cost) { + min_cost = cost[k]; + block_id[byte_ix] = k; + } + } + double block_switch_cost = block_switch_bitcost; + // More blocks for the beginning. + if (byte_ix < 2000) { + block_switch_cost *= 0.77 + 0.07 * byte_ix / 2000; + } + for (int k = 0; k < vecsize; ++k) { + cost[k] -= min_cost; + if (cost[k] >= block_switch_cost) { + cost[k] = block_switch_cost; + switch_signal[ix + k] = true; + } + } + } + // Now trace back from the last position and switch at the marked places. + int byte_ix = length - 1; + int ix = byte_ix * vecsize; + int cur_id = block_id[byte_ix]; + while (byte_ix > 0) { + --byte_ix; + ix -= vecsize; + if (switch_signal[ix + cur_id]) { + cur_id = block_id[byte_ix]; + } + block_id[byte_ix] = cur_id; + } + delete[] insert_cost; + delete[] cost; + delete[] switch_signal; +} + +int RemapBlockIds(uint8_t* block_ids, const size_t length) { + std::map new_id; + int next_id = 0; + for (int i = 0; i < length; ++i) { + if (new_id.find(block_ids[i]) == new_id.end()) { + new_id[block_ids[i]] = next_id; + ++next_id; + } + } + for (int i = 0; i < length; ++i) { + block_ids[i] = new_id[block_ids[i]]; + } + return next_id; +} + +template +void BuildBlockHistograms(const DataType* data, const size_t length, + uint8_t* block_ids, + std::vector* histograms) { + int num_types = RemapBlockIds(block_ids, length); + histograms->clear(); + histograms->resize(num_types); + for (int i = 0; i < length; ++i) { + (*histograms)[block_ids[i]].Add(data[i]); + } +} + +template +void ClusterBlocks(const DataType* data, const size_t length, + uint8_t* block_ids) { + std::vector histograms; + std::vector block_index(length); + int cur_idx = 0; + HistogramType cur_histogram; + for (int i = 0; i < length; ++i) { + bool block_boundary = (i + 1 == length || block_ids[i] != block_ids[i + 1]); + block_index[i] = cur_idx; + cur_histogram.Add(data[i]); + if (block_boundary) { + histograms.push_back(cur_histogram); + cur_histogram.Clear(); + ++cur_idx; + } + } + std::vector clustered_histograms; + std::vector histogram_symbols; + // Block ids need to fit in one byte. + static const int kMaxNumberOfBlockTypes = 256; + ClusterHistograms(histograms, 1, histograms.size(), + kMaxNumberOfBlockTypes, + &clustered_histograms, + &histogram_symbols); + for (int i = 0; i < length; ++i) { + block_ids[i] = histogram_symbols[block_index[i]]; + } +} + +void BuildBlockSplit(const std::vector& block_ids, BlockSplit* split) { + int cur_id = block_ids[0]; + int cur_length = 1; + split->num_types = -1; + for (int i = 1; i < block_ids.size(); ++i) { + if (block_ids[i] != cur_id) { + split->types.push_back(cur_id); + split->lengths.push_back(cur_length); + split->num_types = std::max(split->num_types, cur_id); + cur_id = block_ids[i]; + cur_length = 0; + } + ++cur_length; + } + split->types.push_back(cur_id); + split->lengths.push_back(cur_length); + split->num_types = std::max(split->num_types, cur_id); + ++split->num_types; +} + +template +void SplitByteVector(const std::vector& data, + const int literals_per_histogram, + const int max_histograms, + const int sampling_stride_length, + const double block_switch_cost, + BlockSplit* split) { + if (data.empty()) { + split->num_types = 1; + return; + } else if (data.size() < kMinLengthForBlockSplitting) { + split->num_types = 1; + split->types.push_back(0); + split->lengths.push_back(data.size()); + return; + } + std::vector histograms; + // Find good entropy codes. + InitialEntropyCodes(data.data(), data.size(), + literals_per_histogram, + max_histograms, + sampling_stride_length, + &histograms); + RefineEntropyCodes(data.data(), data.size(), + sampling_stride_length, + &histograms); + // Find a good path through literals with the good entropy codes. + std::vector block_ids(data.size()); + for (int i = 0; i < 10; ++i) { + FindBlocks(data.data(), data.size(), + block_switch_cost, + histograms, + &block_ids[0]); + BuildBlockHistograms(data.data(), data.size(), &block_ids[0], &histograms); + } + ClusterBlocks(data.data(), data.size(), &block_ids[0]); + BuildBlockSplit(block_ids, split); +} + +void SplitBlock(const Command* cmds, + const size_t num_commands, + const uint8_t* data, + BlockSplit* literal_split, + BlockSplit* insert_and_copy_split, + BlockSplit* dist_split) { + // Create a continuous array of literals. + std::vector literals; + CopyLiteralsToByteArray(cmds, num_commands, data, &literals); + + // Compute prefix codes for commands. + std::vector insert_and_copy_codes; + std::vector distance_prefixes; + CopyCommandsToByteArray(cmds, num_commands, + &insert_and_copy_codes, + &distance_prefixes); + + SplitByteVector( + literals, + kSymbolsPerLiteralHistogram, kMaxLiteralHistograms, + kLiteralStrideLength, kLiteralBlockSwitchCost, + literal_split); + SplitByteVector( + insert_and_copy_codes, + kSymbolsPerCommandHistogram, kMaxCommandHistograms, + kCommandStrideLength, kCommandBlockSwitchCost, + insert_and_copy_split); + SplitByteVector( + distance_prefixes, + kSymbolsPerDistanceHistogram, kMaxCommandHistograms, + kCommandStrideLength, kDistanceBlockSwitchCost, + dist_split); +} + +void SplitBlockByTotalLength(const Command* all_commands, + const size_t num_commands, + int input_size, + int target_length, + std::vector >* blocks) { + int num_blocks = input_size / target_length + 1; + int length_limit = input_size / num_blocks + 1; + int total_length = 0; + std::vector cur_block; + for (int i = 0; i < num_commands; ++i) { + const Command& cmd = all_commands[i]; + int cmd_length = cmd.insert_len_ + cmd.copy_len_; + if (total_length > length_limit) { + blocks->push_back(cur_block); + cur_block.clear(); + total_length = 0; + } + cur_block.push_back(cmd); + total_length += cmd_length; + } + blocks->push_back(cur_block); +} + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/block_splitter.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/block_splitter.h new file mode 100644 index 0000000..cc3e044 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/block_splitter.h @@ -0,0 +1,74 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Block split point selection utilities. + +#ifndef BROTLI_ENC_BLOCK_SPLITTER_H_ +#define BROTLI_ENC_BLOCK_SPLITTER_H_ + +#include +#include +#include +#include +#include + +#include "./command.h" +#include "./metablock.h" + +namespace brotli { + +struct BlockSplitIterator { + explicit BlockSplitIterator(const BlockSplit& split) + : split_(split), idx_(0), type_(0), length_(0) { + if (!split.lengths.empty()) { + length_ = split.lengths[0]; + } + } + + void Next() { + if (length_ == 0) { + ++idx_; + type_ = split_.types[idx_]; + length_ = split_.lengths[idx_]; + } + --length_; + } + + const BlockSplit& split_; + int idx_; + int type_; + int length_; +}; + +void CopyLiteralsToByteArray(const Command* cmds, + const size_t num_commands, + const uint8_t* data, + std::vector* literals); + +void SplitBlock(const Command* cmds, + const size_t num_commands, + const uint8_t* data, + BlockSplit* literal_split, + BlockSplit* insert_and_copy_split, + BlockSplit* dist_split); + +void SplitBlockByTotalLength(const Command* all_commands, + const size_t num_commands, + int input_size, + int target_length, + std::vector >* blocks); + +} // namespace brotli + +#endif // BROTLI_ENC_BLOCK_SPLITTER_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/brotli_bit_stream.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/brotli_bit_stream.cc new file mode 100644 index 0000000..c6985de --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/brotli_bit_stream.cc @@ -0,0 +1,830 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Brotli bit stream functions to support the low level format. There are no +// compression algorithms here, just the right ordering of bits to match the +// specs. + +#include "./brotli_bit_stream.h" + +#include +#include +#include + +#include "./bit_cost.h" +#include "./context.h" +#include "./entropy_encode.h" +#include "./fast_log.h" +#include "./prefix.h" +#include "./write_bits.h" + +namespace brotli { + +// returns false if fail +// nibblesbits represents the 2 bits to encode MNIBBLES (0-3) +bool EncodeMlen(size_t length, int* bits, int* numbits, int* nibblesbits) { + length--; // MLEN - 1 is encoded + int lg = length == 0 ? 1 : Log2Floor(length) + 1; + if (lg > 24) return false; + int mnibbles = (lg < 16 ? 16 : (lg + 3)) / 4; + *nibblesbits = mnibbles - 4; + *numbits = mnibbles * 4; + *bits = length; + return true; +} + +void StoreVarLenUint8(int n, int* storage_ix, uint8_t* storage) { + if (n == 0) { + WriteBits(1, 0, storage_ix, storage); + } else { + WriteBits(1, 1, storage_ix, storage); + int nbits = Log2Floor(n); + WriteBits(3, nbits, storage_ix, storage); + WriteBits(nbits, n - (1 << nbits), storage_ix, storage); + } +} + +bool StoreCompressedMetaBlockHeader(bool final_block, + size_t length, + int* storage_ix, + uint8_t* storage) { + // Write ISLAST bit. + WriteBits(1, final_block, storage_ix, storage); + // Write ISEMPTY bit. + if (final_block) { + WriteBits(1, length == 0, storage_ix, storage); + if (length == 0) { + return true; + } + } + + if (length == 0) { + // Only the last meta-block can be empty. + return false; + } + + int lenbits; + int nlenbits; + int nibblesbits; + if (!EncodeMlen(length, &lenbits, &nlenbits, &nibblesbits)) { + return false; + } + + WriteBits(2, nibblesbits, storage_ix, storage); + WriteBits(nlenbits, lenbits, storage_ix, storage); + + if (!final_block) { + // Write ISUNCOMPRESSED bit. + WriteBits(1, 0, storage_ix, storage); + } + return true; +} + +bool StoreUncompressedMetaBlockHeader(size_t length, + int* storage_ix, + uint8_t* storage) { + // Write ISLAST bit. Uncompressed block cannot be the last one, so set to 0. + WriteBits(1, 0, storage_ix, storage); + int lenbits; + int nlenbits; + int nibblesbits; + if (!EncodeMlen(length, &lenbits, &nlenbits, &nibblesbits)) { + return false; + } + WriteBits(2, nibblesbits, storage_ix, storage); + WriteBits(nlenbits, lenbits, storage_ix, storage); + // Write ISUNCOMPRESSED bit. + WriteBits(1, 1, storage_ix, storage); + return true; +} + +void StoreHuffmanTreeOfHuffmanTreeToBitMask( + const int num_codes, + const uint8_t *code_length_bitdepth, + int *storage_ix, + uint8_t *storage) { + static const uint8_t kStorageOrder[kCodeLengthCodes] = { + 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15 + }; + // The bit lengths of the Huffman code over the code length alphabet + // are compressed with the following static Huffman code: + // Symbol Code + // ------ ---- + // 0 00 + // 1 1110 + // 2 110 + // 3 01 + // 4 10 + // 5 1111 + static const uint8_t kHuffmanBitLengthHuffmanCodeSymbols[6] = { + 0, 7, 3, 2, 1, 15 + }; + static const uint8_t kHuffmanBitLengthHuffmanCodeBitLengths[6] = { + 2, 4, 3, 2, 2, 4 + }; + + // Throw away trailing zeros: + int codes_to_store = kCodeLengthCodes; + if (num_codes > 1) { + for (; codes_to_store > 0; --codes_to_store) { + if (code_length_bitdepth[kStorageOrder[codes_to_store - 1]] != 0) { + break; + } + } + } + int skip_some = 0; // skips none. + if (code_length_bitdepth[kStorageOrder[0]] == 0 && + code_length_bitdepth[kStorageOrder[1]] == 0) { + skip_some = 2; // skips two. + if (code_length_bitdepth[kStorageOrder[2]] == 0) { + skip_some = 3; // skips three. + } + } + WriteBits(2, skip_some, storage_ix, storage); + for (int i = skip_some; i < codes_to_store; ++i) { + uint8_t l = code_length_bitdepth[kStorageOrder[i]]; + WriteBits(kHuffmanBitLengthHuffmanCodeBitLengths[l], + kHuffmanBitLengthHuffmanCodeSymbols[l], storage_ix, storage); + } +} + +void StoreHuffmanTreeToBitMask( + const std::vector &huffman_tree, + const std::vector &huffman_tree_extra_bits, + const uint8_t *code_length_bitdepth, + const std::vector &code_length_bitdepth_symbols, + int * __restrict storage_ix, + uint8_t * __restrict storage) { + for (int i = 0; i < huffman_tree.size(); ++i) { + int ix = huffman_tree[i]; + WriteBits(code_length_bitdepth[ix], code_length_bitdepth_symbols[ix], + storage_ix, storage); + // Extra bits + switch (ix) { + case 16: + WriteBits(2, huffman_tree_extra_bits[i], storage_ix, storage); + break; + case 17: + WriteBits(3, huffman_tree_extra_bits[i], storage_ix, storage); + break; + } + } +} + +void StoreSimpleHuffmanTree(const uint8_t* depths, + int symbols[4], + int num_symbols, + int max_bits, + int *storage_ix, uint8_t *storage) { + // value of 1 indicates a simple Huffman code + WriteBits(2, 1, storage_ix, storage); + WriteBits(2, num_symbols - 1, storage_ix, storage); // NSYM - 1 + + // Sort + for (int i = 0; i < num_symbols; i++) { + for (int j = i + 1; j < num_symbols; j++) { + if (depths[symbols[j]] < depths[symbols[i]]) { + std::swap(symbols[j], symbols[i]); + } + } + } + + if (num_symbols == 2) { + WriteBits(max_bits, symbols[0], storage_ix, storage); + WriteBits(max_bits, symbols[1], storage_ix, storage); + } else if (num_symbols == 3) { + WriteBits(max_bits, symbols[0], storage_ix, storage); + WriteBits(max_bits, symbols[1], storage_ix, storage); + WriteBits(max_bits, symbols[2], storage_ix, storage); + } else { + WriteBits(max_bits, symbols[0], storage_ix, storage); + WriteBits(max_bits, symbols[1], storage_ix, storage); + WriteBits(max_bits, symbols[2], storage_ix, storage); + WriteBits(max_bits, symbols[3], storage_ix, storage); + // tree-select + WriteBits(1, depths[symbols[0]] == 1 ? 1 : 0, storage_ix, storage); + } +} + +// num = alphabet size +// depths = symbol depths +void StoreHuffmanTree(const uint8_t* depths, size_t num, + int *storage_ix, uint8_t *storage) { + // Write the Huffman tree into the brotli-representation. + std::vector huffman_tree; + std::vector huffman_tree_extra_bits; + // TODO: Consider allocating these from stack. + huffman_tree.reserve(256); + huffman_tree_extra_bits.reserve(256); + WriteHuffmanTree(depths, num, &huffman_tree, &huffman_tree_extra_bits); + + // Calculate the statistics of the Huffman tree in brotli-representation. + int huffman_tree_histogram[kCodeLengthCodes] = { 0 }; + for (int i = 0; i < huffman_tree.size(); ++i) { + ++huffman_tree_histogram[huffman_tree[i]]; + } + + int num_codes = 0; + int code = 0; + for (int i = 0; i < kCodeLengthCodes; ++i) { + if (huffman_tree_histogram[i]) { + if (num_codes == 0) { + code = i; + num_codes = 1; + } else if (num_codes == 1) { + num_codes = 2; + break; + } + } + } + + // Calculate another Huffman tree to use for compressing both the + // earlier Huffman tree with. + // TODO: Consider allocating these from stack. + uint8_t code_length_bitdepth[kCodeLengthCodes] = { 0 }; + std::vector code_length_bitdepth_symbols(kCodeLengthCodes); + CreateHuffmanTree(&huffman_tree_histogram[0], kCodeLengthCodes, + 5, &code_length_bitdepth[0]); + ConvertBitDepthsToSymbols(code_length_bitdepth, kCodeLengthCodes, + code_length_bitdepth_symbols.data()); + + // Now, we have all the data, let's start storing it + StoreHuffmanTreeOfHuffmanTreeToBitMask(num_codes, code_length_bitdepth, + storage_ix, storage); + + if (num_codes == 1) { + code_length_bitdepth[code] = 0; + } + + // Store the real huffman tree now. + StoreHuffmanTreeToBitMask(huffman_tree, + huffman_tree_extra_bits, + &code_length_bitdepth[0], + code_length_bitdepth_symbols, + storage_ix, storage); +} + +void BuildAndStoreHuffmanTree(const int *histogram, + const int length, + uint8_t* depth, + uint16_t* bits, + int* storage_ix, + uint8_t* storage) { + int count = 0; + int s4[4] = { 0 }; + for (size_t i = 0; i < length; i++) { + if (histogram[i]) { + if (count < 4) { + s4[count] = i; + } else if (count > 4) { + break; + } + count++; + } + } + + int max_bits_counter = length - 1; + int max_bits = 0; + while (max_bits_counter) { + max_bits_counter >>= 1; + ++max_bits; + } + + if (count <= 1) { + WriteBits(4, 1, storage_ix, storage); + WriteBits(max_bits, s4[0], storage_ix, storage); + return; + } + + CreateHuffmanTree(histogram, length, 15, depth); + ConvertBitDepthsToSymbols(depth, length, bits); + + if (count <= 4) { + StoreSimpleHuffmanTree(depth, s4, count, max_bits, storage_ix, storage); + } else { + StoreHuffmanTree(depth, length, storage_ix, storage); + } +} + +int IndexOf(const std::vector& v, int value) { + for (int i = 0; i < v.size(); ++i) { + if (v[i] == value) return i; + } + return -1; +} + +void MoveToFront(std::vector* v, int index) { + int value = (*v)[index]; + for (int i = index; i > 0; --i) { + (*v)[i] = (*v)[i - 1]; + } + (*v)[0] = value; +} + +std::vector MoveToFrontTransform(const std::vector& v) { + if (v.empty()) return v; + std::vector mtf(*std::max_element(v.begin(), v.end()) + 1); + for (int i = 0; i < mtf.size(); ++i) mtf[i] = i; + std::vector result(v.size()); + for (int i = 0; i < v.size(); ++i) { + int index = IndexOf(mtf, v[i]); + result[i] = index; + MoveToFront(&mtf, index); + } + return result; +} + +// Finds runs of zeros in v_in and replaces them with a prefix code of the run +// length plus extra bits in *v_out and *extra_bits. Non-zero values in v_in are +// shifted by *max_length_prefix. Will not create prefix codes bigger than the +// initial value of *max_run_length_prefix. The prefix code of run length L is +// simply Log2Floor(L) and the number of extra bits is the same as the prefix +// code. +void RunLengthCodeZeros(const std::vector& v_in, + int* max_run_length_prefix, + std::vector* v_out, + std::vector* extra_bits) { + int max_reps = 0; + for (int i = 0; i < v_in.size();) { + for (; i < v_in.size() && v_in[i] != 0; ++i) ; + int reps = 0; + for (; i < v_in.size() && v_in[i] == 0; ++i) { + ++reps; + } + max_reps = std::max(reps, max_reps); + } + int max_prefix = max_reps > 0 ? Log2Floor(max_reps) : 0; + *max_run_length_prefix = std::min(max_prefix, *max_run_length_prefix); + for (int i = 0; i < v_in.size();) { + if (v_in[i] != 0) { + v_out->push_back(v_in[i] + *max_run_length_prefix); + extra_bits->push_back(0); + ++i; + } else { + int reps = 1; + for (uint32_t k = i + 1; k < v_in.size() && v_in[k] == 0; ++k) { + ++reps; + } + i += reps; + while (reps) { + if (reps < (2 << *max_run_length_prefix)) { + int run_length_prefix = Log2Floor(reps); + v_out->push_back(run_length_prefix); + extra_bits->push_back(reps - (1 << run_length_prefix)); + break; + } else { + v_out->push_back(*max_run_length_prefix); + extra_bits->push_back((1 << *max_run_length_prefix) - 1); + reps -= (2 << *max_run_length_prefix) - 1; + } + } + } + } +} + +// Returns a maximum zero-run-length-prefix value such that run-length coding +// zeros in v with this maximum prefix value and then encoding the resulting +// histogram and entropy-coding v produces the least amount of bits. +int BestMaxZeroRunLengthPrefix(const std::vector& v) { + int min_cost = std::numeric_limits::max(); + int best_max_prefix = 0; + for (int max_prefix = 0; max_prefix <= 16; ++max_prefix) { + std::vector rle_symbols; + std::vector extra_bits; + int max_run_length_prefix = max_prefix; + RunLengthCodeZeros(v, &max_run_length_prefix, &rle_symbols, &extra_bits); + if (max_run_length_prefix < max_prefix) break; + HistogramContextMap histogram; + for (int i = 0; i < rle_symbols.size(); ++i) { + histogram.Add(rle_symbols[i]); + } + int bit_cost = PopulationCost(histogram); + if (max_prefix > 0) { + bit_cost += 4; + } + for (int i = 1; i <= max_prefix; ++i) { + bit_cost += histogram.data_[i] * i; // extra bits + } + if (bit_cost < min_cost) { + min_cost = bit_cost; + best_max_prefix = max_prefix; + } + } + return best_max_prefix; +} + +void EncodeContextMap(const std::vector& context_map, + int num_clusters, + int* storage_ix, uint8_t* storage) { + StoreVarLenUint8(num_clusters - 1, storage_ix, storage); + + if (num_clusters == 1) { + return; + } + + std::vector transformed_symbols = MoveToFrontTransform(context_map); + std::vector rle_symbols; + std::vector extra_bits; + int max_run_length_prefix = BestMaxZeroRunLengthPrefix(transformed_symbols); + RunLengthCodeZeros(transformed_symbols, &max_run_length_prefix, + &rle_symbols, &extra_bits); + HistogramContextMap symbol_histogram; + for (int i = 0; i < rle_symbols.size(); ++i) { + symbol_histogram.Add(rle_symbols[i]); + } + bool use_rle = max_run_length_prefix > 0; + WriteBits(1, use_rle, storage_ix, storage); + if (use_rle) { + WriteBits(4, max_run_length_prefix - 1, storage_ix, storage); + } + EntropyCodeContextMap symbol_code; + memset(symbol_code.depth_, 0, sizeof(symbol_code.depth_)); + memset(symbol_code.bits_, 0, sizeof(symbol_code.bits_)); + BuildAndStoreHuffmanTree(symbol_histogram.data_, + num_clusters + max_run_length_prefix, + symbol_code.depth_, symbol_code.bits_, + storage_ix, storage); + for (int i = 0; i < rle_symbols.size(); ++i) { + WriteBits(symbol_code.depth_[rle_symbols[i]], + symbol_code.bits_[rle_symbols[i]], + storage_ix, storage); + if (rle_symbols[i] > 0 && rle_symbols[i] <= max_run_length_prefix) { + WriteBits(rle_symbols[i], extra_bits[i], storage_ix, storage); + } + } + WriteBits(1, 1, storage_ix, storage); // use move-to-front +} + +void StoreBlockSwitch(const BlockSplitCode& code, + const int block_ix, + int* storage_ix, + uint8_t* storage) { + if (block_ix > 0) { + int typecode = code.type_code[block_ix]; + WriteBits(code.type_depths[typecode], code.type_bits[typecode], + storage_ix, storage); + } + int lencode = code.length_prefix[block_ix]; + WriteBits(code.length_depths[lencode], code.length_bits[lencode], + storage_ix, storage); + WriteBits(code.length_nextra[block_ix], code.length_extra[block_ix], + storage_ix, storage); +} + +void BuildAndStoreBlockSplitCode(const std::vector& types, + const std::vector& lengths, + const int num_types, + BlockSplitCode* code, + int* storage_ix, + uint8_t* storage) { + const int num_blocks = types.size(); + std::vector type_histo(num_types + 2); + std::vector length_histo(26); + int last_type = 1; + int second_last_type = 0; + code->type_code.resize(num_blocks); + code->length_prefix.resize(num_blocks); + code->length_nextra.resize(num_blocks); + code->length_extra.resize(num_blocks); + code->type_depths.resize(num_types + 2); + code->type_bits.resize(num_types + 2); + code->length_depths.resize(26); + code->length_bits.resize(26); + for (int i = 0; i < num_blocks; ++i) { + int type = types[i]; + int type_code = (type == last_type + 1 ? 1 : + type == second_last_type ? 0 : + type + 2); + second_last_type = last_type; + last_type = type; + code->type_code[i] = type_code; + if (i > 0) ++type_histo[type_code]; + GetBlockLengthPrefixCode(lengths[i], + &code->length_prefix[i], + &code->length_nextra[i], + &code->length_extra[i]); + ++length_histo[code->length_prefix[i]]; + } + StoreVarLenUint8(num_types - 1, storage_ix, storage); + if (num_types > 1) { + BuildAndStoreHuffmanTree(&type_histo[0], num_types + 2, + &code->type_depths[0], &code->type_bits[0], + storage_ix, storage); + BuildAndStoreHuffmanTree(&length_histo[0], 26, + &code->length_depths[0], &code->length_bits[0], + storage_ix, storage); + StoreBlockSwitch(*code, 0, storage_ix, storage); + } +} + +void StoreTrivialContextMap(int num_types, + int context_bits, + int* storage_ix, + uint8_t* storage) { + StoreVarLenUint8(num_types - 1, storage_ix, storage); + if (num_types > 1) { + int repeat_code = context_bits - 1; + int repeat_bits = (1 << repeat_code) - 1; + int alphabet_size = num_types + repeat_code; + std::vector histogram(alphabet_size); + std::vector depths(alphabet_size); + std::vector bits(alphabet_size); + // Write RLEMAX. + WriteBits(1, 1, storage_ix, storage); + WriteBits(4, repeat_code - 1, storage_ix, storage); + histogram[repeat_code] = num_types; + histogram[0] = 1; + for (int i = context_bits; i < alphabet_size; ++i) { + histogram[i] = 1; + } + BuildAndStoreHuffmanTree(&histogram[0], alphabet_size, + &depths[0], &bits[0], + storage_ix, storage); + for (int i = 0; i < num_types; ++i) { + int code = (i == 0 ? 0 : i + context_bits - 1); + WriteBits(depths[code], bits[code], storage_ix, storage); + WriteBits(depths[repeat_code], bits[repeat_code], storage_ix, storage); + WriteBits(repeat_code, repeat_bits, storage_ix, storage); + } + // Write IMTF (inverse-move-to-front) bit. + WriteBits(1, 1, storage_ix, storage); + } +} + +// Manages the encoding of one block category (literal, command or distance). +class BlockEncoder { + public: + BlockEncoder(int alphabet_size, + int num_block_types, + const std::vector& block_types, + const std::vector& block_lengths) + : alphabet_size_(alphabet_size), + num_block_types_(num_block_types), + block_types_(block_types), + block_lengths_(block_lengths), + block_ix_(0), + block_len_(block_lengths.empty() ? 0 : block_lengths[0]), + entropy_ix_(0) {} + + // Creates entropy codes of block lengths and block types and stores them + // to the bit stream. + void BuildAndStoreBlockSwitchEntropyCodes(int* storage_ix, uint8_t* storage) { + BuildAndStoreBlockSplitCode( + block_types_, block_lengths_, num_block_types_, + &block_split_code_, storage_ix, storage); + } + + // Creates entropy codes for all block types and stores them to the bit + // stream. + template + void BuildAndStoreEntropyCodes( + const std::vector >& histograms, + int* storage_ix, uint8_t* storage) { + depths_.resize(histograms.size() * alphabet_size_); + bits_.resize(histograms.size() * alphabet_size_); + for (int i = 0; i < histograms.size(); ++i) { + int ix = i * alphabet_size_; + BuildAndStoreHuffmanTree(&histograms[i].data_[0], alphabet_size_, + &depths_[ix], &bits_[ix], + storage_ix, storage); + } + } + + // Stores the next symbol with the entropy code of the current block type. + // Updates the block type and block length at block boundaries. + void StoreSymbol(int symbol, int* storage_ix, uint8_t* storage) { + if (block_len_ == 0) { + ++block_ix_; + block_len_ = block_lengths_[block_ix_]; + entropy_ix_ = block_types_[block_ix_] * alphabet_size_; + StoreBlockSwitch(block_split_code_, block_ix_, storage_ix, storage); + } + --block_len_; + int ix = entropy_ix_ + symbol; + WriteBits(depths_[ix], bits_[ix], storage_ix, storage); + } + + // Stores the next symbol with the entropy code of the current block type and + // context value. + // Updates the block type and block length at block boundaries. + template + void StoreSymbolWithContext(int symbol, int context, + const std::vector& context_map, + int* storage_ix, uint8_t* storage) { + if (block_len_ == 0) { + ++block_ix_; + block_len_ = block_lengths_[block_ix_]; + entropy_ix_ = block_types_[block_ix_] << kContextBits; + StoreBlockSwitch(block_split_code_, block_ix_, storage_ix, storage); + } + --block_len_; + int histo_ix = context_map[entropy_ix_ + context]; + int ix = histo_ix * alphabet_size_ + symbol; + WriteBits(depths_[ix], bits_[ix], storage_ix, storage); + } + + private: + const int alphabet_size_; + const int num_block_types_; + const std::vector& block_types_; + const std::vector& block_lengths_; + BlockSplitCode block_split_code_; + int block_ix_; + int block_len_; + int entropy_ix_; + std::vector depths_; + std::vector bits_; +}; + +void JumpToByteBoundary(int* storage_ix, uint8_t* storage) { + *storage_ix = (*storage_ix + 7) & ~7; + storage[*storage_ix >> 3] = 0; +} + +bool StoreMetaBlock(const uint8_t* input, + size_t start_pos, + size_t length, + size_t mask, + uint8_t prev_byte, + uint8_t prev_byte2, + bool is_last, + int num_direct_distance_codes, + int distance_postfix_bits, + int literal_context_mode, + const brotli::Command *commands, + size_t n_commands, + const MetaBlockSplit& mb, + int *storage_ix, + uint8_t *storage) { + if (!StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage)) { + return false; + } + + if (length == 0) { + // Only the last meta-block can be empty, so jump to next byte. + JumpToByteBoundary(storage_ix, storage); + return true; + } + + int num_distance_codes = + kNumDistanceShortCodes + num_direct_distance_codes + + (48 << distance_postfix_bits); + + BlockEncoder literal_enc(256, + mb.literal_split.num_types, + mb.literal_split.types, + mb.literal_split.lengths); + BlockEncoder command_enc(kNumCommandPrefixes, + mb.command_split.num_types, + mb.command_split.types, + mb.command_split.lengths); + BlockEncoder distance_enc(num_distance_codes, + mb.distance_split.num_types, + mb.distance_split.types, + mb.distance_split.lengths); + + literal_enc.BuildAndStoreBlockSwitchEntropyCodes(storage_ix, storage); + command_enc.BuildAndStoreBlockSwitchEntropyCodes(storage_ix, storage); + distance_enc.BuildAndStoreBlockSwitchEntropyCodes(storage_ix, storage); + + WriteBits(2, distance_postfix_bits, storage_ix, storage); + WriteBits(4, num_direct_distance_codes >> distance_postfix_bits, + storage_ix, storage); + for (int i = 0; i < mb.literal_split.num_types; ++i) { + WriteBits(2, literal_context_mode, storage_ix, storage); + } + + if (mb.literal_context_map.empty()) { + StoreTrivialContextMap(mb.literal_histograms.size(), kLiteralContextBits, + storage_ix, storage); + } else { + EncodeContextMap(mb.literal_context_map, mb.literal_histograms.size(), + storage_ix, storage); + } + + if (mb.distance_context_map.empty()) { + StoreTrivialContextMap(mb.distance_histograms.size(), kDistanceContextBits, + storage_ix, storage); + } else { + EncodeContextMap(mb.distance_context_map, mb.distance_histograms.size(), + storage_ix, storage); + } + + literal_enc.BuildAndStoreEntropyCodes(mb.literal_histograms, + storage_ix, storage); + command_enc.BuildAndStoreEntropyCodes(mb.command_histograms, + storage_ix, storage); + distance_enc.BuildAndStoreEntropyCodes(mb.distance_histograms, + storage_ix, storage); + + size_t pos = start_pos; + for (int i = 0; i < n_commands; ++i) { + const Command cmd = commands[i]; + int cmd_code = cmd.cmd_prefix_; + int lennumextra = cmd.cmd_extra_ >> 48; + uint64_t lenextra = cmd.cmd_extra_ & 0xffffffffffffULL; + command_enc.StoreSymbol(cmd_code, storage_ix, storage); + WriteBits(lennumextra, lenextra, storage_ix, storage); + if (mb.literal_context_map.empty()) { + for (int j = 0; j < cmd.insert_len_; j++) { + literal_enc.StoreSymbol(input[pos & mask], storage_ix, storage); + ++pos; + } + } else { + for (int j = 0; j < cmd.insert_len_; ++j) { + int context = Context(prev_byte, prev_byte2, + literal_context_mode); + int literal = input[pos & mask]; + literal_enc.StoreSymbolWithContext( + literal, context, mb.literal_context_map, storage_ix, storage); + prev_byte2 = prev_byte; + prev_byte = literal; + ++pos; + } + } + pos += cmd.copy_len_; + if (cmd.copy_len_ > 0) { + prev_byte2 = input[(pos - 2) & mask]; + prev_byte = input[(pos - 1) & mask]; + if (cmd.cmd_prefix_ >= 128) { + int dist_code = cmd.dist_prefix_; + int distnumextra = cmd.dist_extra_ >> 24; + int distextra = cmd.dist_extra_ & 0xffffff; + if (mb.distance_context_map.empty()) { + distance_enc.StoreSymbol(dist_code, storage_ix, storage); + } else { + int context = cmd.DistanceContext(); + distance_enc.StoreSymbolWithContext( + dist_code, context, mb.distance_context_map, storage_ix, storage); + } + brotli::WriteBits(distnumextra, distextra, storage_ix, storage); + } + } + } + if (is_last) { + JumpToByteBoundary(storage_ix, storage); + } + return true; +} + +// This is for storing uncompressed blocks (simple raw storage of +// bytes-as-bytes). +bool StoreUncompressedMetaBlock(bool final_block, + const uint8_t * __restrict input, + size_t position, size_t mask, + size_t len, + int * __restrict storage_ix, + uint8_t * __restrict storage) { + if (!brotli::StoreUncompressedMetaBlockHeader(len, storage_ix, storage)) { + return false; + } + JumpToByteBoundary(storage_ix, storage); + + size_t masked_pos = position & mask; + if (masked_pos + len > mask + 1) { + size_t len1 = mask + 1 - masked_pos; + memcpy(&storage[*storage_ix >> 3], &input[masked_pos], len1); + *storage_ix += len1 << 3; + len -= len1; + masked_pos = 0; + } + memcpy(&storage[*storage_ix >> 3], &input[masked_pos], len); + *storage_ix += len << 3; + + // We need to clear the next 4 bytes to continue to be + // compatible with WriteBits. + brotli::WriteBitsPrepareStorage(*storage_ix, storage); + + // Since the uncomressed block itself may not be the final block, add an empty + // one after this. + if (final_block) { + brotli::WriteBits(1, 1, storage_ix, storage); // islast + brotli::WriteBits(1, 1, storage_ix, storage); // isempty + JumpToByteBoundary(storage_ix, storage); + } + return true; +} + +void StoreSyncMetaBlock(int * __restrict storage_ix, + uint8_t * __restrict storage) { + // Empty metadata meta-block bit pattern: + // 1 bit: is_last (0) + // 2 bits: num nibbles (3) + // 1 bit: reserved (0) + // 2 bits: metadata length bytes (0) + WriteBits(6, 6, storage_ix, storage); + JumpToByteBoundary(storage_ix, storage); +} + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/brotli_bit_stream.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/brotli_bit_stream.h new file mode 100644 index 0000000..3b45fc8 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/brotli_bit_stream.h @@ -0,0 +1,137 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Functions to convert brotli-related data structures into the +// brotli bit stream. The functions here operate under +// assumption that there is enough space in the storage, i.e., there are +// no out-of-range checks anywhere. +// +// These functions do bit addressing into a byte array. The byte array +// is called "storage" and the index to the bit is called storage_ix +// in function arguments. + +#ifndef BROTLI_ENC_BROTLI_BIT_STREAM_H_ +#define BROTLI_ENC_BROTLI_BIT_STREAM_H_ + +#include +#include +#include + +#include "./metablock.h" + +namespace brotli { + +// All Store functions here will use a storage_ix, which is always the bit +// position for the current storage. + +// Stores a number between 0 and 255. +void StoreVarLenUint8(int n, int* storage_ix, uint8_t* storage); + +// Stores the compressed meta-block header. +bool StoreCompressedMetaBlockHeader(bool final_block, + size_t length, + int* storage_ix, + uint8_t* storage); + +// Stores the uncompressed meta-block header. +bool StoreUncompressedMetaBlockHeader(size_t length, + int* storage_ix, + uint8_t* storage); + +// Stores a context map where the histogram type is always the block type. +void StoreTrivialContextMap(int num_types, + int context_bits, + int* storage_ix, + uint8_t* storage); + +void StoreHuffmanTreeOfHuffmanTreeToBitMask( + const int num_codes, + const uint8_t *code_length_bitdepth, + int *storage_ix, + uint8_t *storage); + +// Builds a Huffman tree from histogram[0:length] into depth[0:length] and +// bits[0:length] and stores the encoded tree to the bit stream. +void BuildAndStoreHuffmanTree(const int *histogram, + const int length, + uint8_t* depth, + uint16_t* bits, + int* storage_ix, + uint8_t* storage); + +// Encodes the given context map to the bit stream. The number of different +// histogram ids is given by num_clusters. +void EncodeContextMap(const std::vector& context_map, + int num_clusters, + int* storage_ix, uint8_t* storage); + +// Data structure that stores everything that is needed to encode each block +// switch command. +struct BlockSplitCode { + std::vector type_code; + std::vector length_prefix; + std::vector length_nextra; + std::vector length_extra; + std::vector type_depths; + std::vector type_bits; + std::vector length_depths; + std::vector length_bits; +}; + +// Builds a BlockSplitCode data structure from the block split given by the +// vector of block types and block lengths and stores it to the bit stream. +void BuildAndStoreBlockSplitCode(const std::vector& types, + const std::vector& lengths, + const int num_types, + BlockSplitCode* code, + int* storage_ix, + uint8_t* storage); + +// Stores the block switch command with index block_ix to the bit stream. +void StoreBlockSwitch(const BlockSplitCode& code, + const int block_ix, + int* storage_ix, + uint8_t* storage); + +bool StoreMetaBlock(const uint8_t* input, + size_t start_pos, + size_t length, + size_t mask, + uint8_t prev_byte, + uint8_t prev_byte2, + bool final_block, + int num_direct_distance_codes, + int distance_postfix_bits, + int literal_context_mode, + const brotli::Command *commands, + size_t n_commands, + const MetaBlockSplit& mb, + int *storage_ix, + uint8_t *storage); + +// This is for storing uncompressed blocks (simple raw storage of +// bytes-as-bytes). +bool StoreUncompressedMetaBlock(bool final_block, + const uint8_t* input, + size_t position, size_t mask, + size_t len, + int* storage_ix, + uint8_t* storage); + +// Stores an empty metadata meta-block and syncs to a byte boundary. +void StoreSyncMetaBlock(int* storage_ix, uint8_t* storage); + +} // namespace brotli + +#endif // BROTLI_ENC_BROTLI_BIT_STREAM_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/cluster.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/cluster.h new file mode 100644 index 0000000..cd04b3a --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/cluster.h @@ -0,0 +1,305 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Functions for clustering similar histograms together. + +#ifndef BROTLI_ENC_CLUSTER_H_ +#define BROTLI_ENC_CLUSTER_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "./bit_cost.h" +#include "./entropy_encode.h" +#include "./fast_log.h" +#include "./histogram.h" + +namespace brotli { + +struct HistogramPair { + int idx1; + int idx2; + bool valid; + double cost_combo; + double cost_diff; +}; + +struct HistogramPairComparator { + bool operator()(const HistogramPair& p1, const HistogramPair& p2) const { + if (p1.cost_diff != p2.cost_diff) { + return p1.cost_diff > p2.cost_diff; + } + return abs(p1.idx1 - p1.idx2) > abs(p2.idx1 - p2.idx2); + } +}; + +// Returns entropy reduction of the context map when we combine two clusters. +inline double ClusterCostDiff(int size_a, int size_b) { + int size_c = size_a + size_b; + return size_a * FastLog2(size_a) + size_b * FastLog2(size_b) - + size_c * FastLog2(size_c); +} + +// Computes the bit cost reduction by combining out[idx1] and out[idx2] and if +// it is below a threshold, stores the pair (idx1, idx2) in the *pairs heap. +template +void CompareAndPushToHeap(const HistogramType* out, + const int* cluster_size, + int idx1, int idx2, + std::vector* pairs) { + if (idx1 == idx2) { + return; + } + if (idx2 < idx1) { + int t = idx2; + idx2 = idx1; + idx1 = t; + } + bool store_pair = false; + HistogramPair p; + p.idx1 = idx1; + p.idx2 = idx2; + p.valid = true; + p.cost_diff = 0.5 * ClusterCostDiff(cluster_size[idx1], cluster_size[idx2]); + p.cost_diff -= out[idx1].bit_cost_; + p.cost_diff -= out[idx2].bit_cost_; + + if (out[idx1].total_count_ == 0) { + p.cost_combo = out[idx2].bit_cost_; + store_pair = true; + } else if (out[idx2].total_count_ == 0) { + p.cost_combo = out[idx1].bit_cost_; + store_pair = true; + } else { + double threshold = pairs->empty() ? 1e99 : + std::max(0.0, (*pairs)[0].cost_diff); + HistogramType combo = out[idx1]; + combo.AddHistogram(out[idx2]); + double cost_combo = PopulationCost(combo); + if (cost_combo < threshold - p.cost_diff) { + p.cost_combo = cost_combo; + store_pair = true; + } + } + if (store_pair) { + p.cost_diff += p.cost_combo; + pairs->push_back(p); + std::push_heap(pairs->begin(), pairs->end(), HistogramPairComparator()); + } +} + +template +void HistogramCombine(HistogramType* out, + int* cluster_size, + int* symbols, + int symbols_size, + int max_clusters) { + double cost_diff_threshold = 0.0; + int min_cluster_size = 1; + std::set all_symbols; + std::vector clusters; + for (int i = 0; i < symbols_size; ++i) { + if (all_symbols.find(symbols[i]) == all_symbols.end()) { + all_symbols.insert(symbols[i]); + clusters.push_back(symbols[i]); + } + } + + // We maintain a heap of histogram pairs, ordered by the bit cost reduction. + std::vector pairs; + for (int idx1 = 0; idx1 < clusters.size(); ++idx1) { + for (int idx2 = idx1 + 1; idx2 < clusters.size(); ++idx2) { + CompareAndPushToHeap(out, cluster_size, clusters[idx1], clusters[idx2], + &pairs); + } + } + + while (clusters.size() > min_cluster_size) { + if (pairs[0].cost_diff >= cost_diff_threshold) { + cost_diff_threshold = 1e99; + min_cluster_size = max_clusters; + continue; + } + // Take the best pair from the top of heap. + int best_idx1 = pairs[0].idx1; + int best_idx2 = pairs[0].idx2; + out[best_idx1].AddHistogram(out[best_idx2]); + out[best_idx1].bit_cost_ = pairs[0].cost_combo; + cluster_size[best_idx1] += cluster_size[best_idx2]; + for (int i = 0; i < symbols_size; ++i) { + if (symbols[i] == best_idx2) { + symbols[i] = best_idx1; + } + } + for (int i = 0; i + 1 < clusters.size(); ++i) { + if (clusters[i] >= best_idx2) { + clusters[i] = clusters[i + 1]; + } + } + clusters.pop_back(); + // Invalidate pairs intersecting the just combined best pair. + for (int i = 0; i < pairs.size(); ++i) { + HistogramPair& p = pairs[i]; + if (p.idx1 == best_idx1 || p.idx2 == best_idx1 || + p.idx1 == best_idx2 || p.idx2 == best_idx2) { + p.valid = false; + } + } + // Pop invalid pairs from the top of the heap. + while (!pairs.empty() && !pairs[0].valid) { + std::pop_heap(pairs.begin(), pairs.end(), HistogramPairComparator()); + pairs.pop_back(); + } + // Push new pairs formed with the combined histogram to the heap. + for (int i = 0; i < clusters.size(); ++i) { + CompareAndPushToHeap(out, cluster_size, best_idx1, clusters[i], &pairs); + } + } +} + +// ----------------------------------------------------------------------------- +// Histogram refinement + +// What is the bit cost of moving histogram from cur_symbol to candidate. +template +double HistogramBitCostDistance(const HistogramType& histogram, + const HistogramType& candidate) { + if (histogram.total_count_ == 0) { + return 0.0; + } + HistogramType tmp = histogram; + tmp.AddHistogram(candidate); + return PopulationCost(tmp) - candidate.bit_cost_; +} + +// Find the best 'out' histogram for each of the 'in' histograms. +// Note: we assume that out[]->bit_cost_ is already up-to-date. +template +void HistogramRemap(const HistogramType* in, int in_size, + HistogramType* out, int* symbols) { + std::set all_symbols; + for (int i = 0; i < in_size; ++i) { + all_symbols.insert(symbols[i]); + } + for (int i = 0; i < in_size; ++i) { + int best_out = i == 0 ? symbols[0] : symbols[i - 1]; + double best_bits = HistogramBitCostDistance(in[i], out[best_out]); + for (std::set::const_iterator k = all_symbols.begin(); + k != all_symbols.end(); ++k) { + const double cur_bits = HistogramBitCostDistance(in[i], out[*k]); + if (cur_bits < best_bits) { + best_bits = cur_bits; + best_out = *k; + } + } + symbols[i] = best_out; + } + + // Recompute each out based on raw and symbols. + for (std::set::const_iterator k = all_symbols.begin(); + k != all_symbols.end(); ++k) { + out[*k].Clear(); + } + for (int i = 0; i < in_size; ++i) { + out[symbols[i]].AddHistogram(in[i]); + } +} + +// Reorder histograms in *out so that the new symbols in *symbols come in +// increasing order. +template +void HistogramReindex(std::vector* out, + std::vector* symbols) { + std::vector tmp(*out); + std::map new_index; + int next_index = 0; + for (int i = 0; i < symbols->size(); ++i) { + if (new_index.find((*symbols)[i]) == new_index.end()) { + new_index[(*symbols)[i]] = next_index; + (*out)[next_index] = tmp[(*symbols)[i]]; + ++next_index; + } + } + out->resize(next_index); + for (int i = 0; i < symbols->size(); ++i) { + (*symbols)[i] = new_index[(*symbols)[i]]; + } +} + +template +void ClusterHistogramsTrivial(const std::vector& in, + int num_contexts, int num_blocks, + int max_histograms, + std::vector* out, + std::vector* histogram_symbols) { + out->resize(num_blocks); + for (int i = 0; i < num_blocks; ++i) { + (*out)[i].Clear(); + for (int j = 0; j < num_contexts; ++j) { + (*out)[i].AddHistogram(in[i * num_contexts + j]); + histogram_symbols->push_back(i); + } + } +} + +// Clusters similar histograms in 'in' together, the selected histograms are +// placed in 'out', and for each index in 'in', *histogram_symbols will +// indicate which of the 'out' histograms is the best approximation. +template +void ClusterHistograms(const std::vector& in, + int num_contexts, int num_blocks, + int max_histograms, + std::vector* out, + std::vector* histogram_symbols) { + const int in_size = num_contexts * num_blocks; + std::vector cluster_size(in_size, 1); + out->resize(in_size); + histogram_symbols->resize(in_size); + for (int i = 0; i < in_size; ++i) { + (*out)[i] = in[i]; + (*out)[i].bit_cost_ = PopulationCost(in[i]); + (*histogram_symbols)[i] = i; + } + + // Collapse similar histograms within a block type. + if (num_contexts > 1) { + for (int i = 0; i < num_blocks; ++i) { + HistogramCombine(&(*out)[0], &cluster_size[0], + &(*histogram_symbols)[i * num_contexts], num_contexts, + max_histograms); + } + } + + // Collapse similar histograms. + HistogramCombine(&(*out)[0], &cluster_size[0], + &(*histogram_symbols)[0], in_size, + max_histograms); + + // Find the optimal map from original histograms to the final ones. + HistogramRemap(&in[0], in_size, &(*out)[0], &(*histogram_symbols)[0]); + + // Convert the context map to a canonical form. + HistogramReindex(out, histogram_symbols); +} + +} // namespace brotli + +#endif // BROTLI_ENC_CLUSTER_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/command.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/command.h new file mode 100644 index 0000000..5600455 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/command.h @@ -0,0 +1,150 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// This class models a sequence of literals and a backward reference copy. + +#ifndef BROTLI_ENC_COMMAND_H_ +#define BROTLI_ENC_COMMAND_H_ + +#include +#include "./fast_log.h" + +namespace brotli { + +static inline void GetDistCode(int distance_code, + uint16_t* code, uint32_t* extra) { + distance_code -= 1; + if (distance_code < 16) { + *code = distance_code; + *extra = 0; + } else { + distance_code -= 12; + int numextra = Log2FloorNonZero(distance_code) - 1; + int prefix = distance_code >> numextra; + *code = 12 + 2 * numextra + prefix; + *extra = (numextra << 24) | (distance_code - (prefix << numextra)); + } +} + +static int insbase[] = { 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, + 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594 }; +static int insextra[] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, + 5, 6, 7, 8, 9, 10, 12, 14, 24 }; +static int copybase[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 18, 22, 30, 38, + 54, 70, 102, 134, 198, 326, 582, 1094, 2118 }; +static int copyextra[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, + 4, 5, 5, 6, 7, 8, 9, 10, 24 }; + +static inline int GetInsertLengthCode(int insertlen) { + if (insertlen < 6) { + return insertlen; + } else if (insertlen < 130) { + insertlen -= 2; + int nbits = Log2FloorNonZero(insertlen) - 1; + return (nbits << 1) + (insertlen >> nbits) + 2; + } else if (insertlen < 2114) { + return Log2FloorNonZero(insertlen - 66) + 10; + } else if (insertlen < 6210) { + return 21; + } else if (insertlen < 22594) { + return 22; + } else { + return 23; + } +} + +static inline int GetCopyLengthCode(int copylen) { + if (copylen < 10) { + return copylen - 2; + } else if (copylen < 134) { + copylen -= 6; + int nbits = Log2FloorNonZero(copylen) - 1; + return (nbits << 1) + (copylen >> nbits) + 4; + } else if (copylen < 2118) { + return Log2FloorNonZero(copylen - 70) + 12; + } else { + return 23; + } +} + +static inline int CombineLengthCodes( + int inscode, int copycode, int distancecode) { + int bits64 = (copycode & 0x7u) | ((inscode & 0x7u) << 3); + if (distancecode == 0 && inscode < 8 && copycode < 16) { + return (copycode < 8) ? bits64 : (bits64 | 64); + } else { + // "To convert an insert-and-copy length code to an insert length code and + // a copy length code, the following table can be used" + static const int cells[9] = { 2, 3, 6, 4, 5, 8, 7, 9, 10 }; + return (cells[(copycode >> 3) + 3 * (inscode >> 3)] << 6) | bits64; + } +} + +static inline void GetLengthCode(int insertlen, int copylen, int distancecode, + uint16_t* code, uint64_t* extra) { + int inscode = GetInsertLengthCode(insertlen); + int copycode = GetCopyLengthCode(copylen); + uint64_t insnumextra = insextra[inscode]; + uint64_t numextra = insnumextra + copyextra[copycode]; + uint64_t insextraval = insertlen - insbase[inscode]; + uint64_t copyextraval = copylen - copybase[copycode]; + *code = CombineLengthCodes(inscode, copycode, distancecode); + *extra = (numextra << 48) | (copyextraval << insnumextra) | insextraval; +} + +struct Command { + Command() {} + + Command(int insertlen, int copylen, int copylen_code, int distance_code) + : insert_len_(insertlen), copy_len_(copylen) { + GetDistCode(distance_code, &dist_prefix_, &dist_extra_); + GetLengthCode(insertlen, copylen_code, dist_prefix_, + &cmd_prefix_, &cmd_extra_); + } + + Command(int insertlen) + : insert_len_(insertlen), copy_len_(0), dist_prefix_(16), dist_extra_(0) { + GetLengthCode(insertlen, 4, dist_prefix_, &cmd_prefix_, &cmd_extra_); + } + + int DistanceCode() const { + if (dist_prefix_ < 16) { + return dist_prefix_ + 1; + } + int nbits = dist_extra_ >> 24; + int extra = dist_extra_ & 0xffffff; + int prefix = dist_prefix_ - 12 - 2 * nbits; + return (prefix << nbits) + extra + 13; + } + + int DistanceContext() const { + int r = cmd_prefix_ >> 6; + int c = cmd_prefix_ & 7; + if ((r == 0 || r == 2 || r == 4 || r == 7) && (c <= 2)) { + return c; + } + return 3; + } + + int insert_len_; + int copy_len_; + uint16_t cmd_prefix_; + uint16_t dist_prefix_; + uint64_t cmd_extra_; + uint32_t dist_extra_; +}; + +} // namespace brotli + +#endif // BROTLI_ENC_COMMAND_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/context.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/context.h new file mode 100644 index 0000000..d0ffd51 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/context.h @@ -0,0 +1,185 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Functions to map previous bytes into a context id. + +#ifndef BROTLI_ENC_CONTEXT_H_ +#define BROTLI_ENC_CONTEXT_H_ + +#include + +namespace brotli { + +// Second-order context lookup table for UTF8 byte streams. +// +// If p1 and p2 are the previous two bytes, we calcualte the context as +// +// context = kUTF8ContextLookup[p1] | kUTF8ContextLookup[p2 + 256]. +// +// If the previous two bytes are ASCII characters (i.e. < 128), this will be +// equivalent to +// +// context = 4 * context1(p1) + context2(p2), +// +// where context1 is based on the previous byte in the following way: +// +// 0 : non-ASCII control +// 1 : \t, \n, \r +// 2 : space +// 3 : other punctuation +// 4 : " ' +// 5 : % +// 6 : ( < [ { +// 7 : ) > ] } +// 8 : , ; : +// 9 : . +// 10 : = +// 11 : number +// 12 : upper-case vowel +// 13 : upper-case consonant +// 14 : lower-case vowel +// 15 : lower-case consonant +// +// and context2 is based on the second last byte: +// +// 0 : control, space +// 1 : punctuation +// 2 : upper-case letter, number +// 3 : lower-case letter +// +// If the last byte is ASCII, and the second last byte is not (in a valid UTF8 +// stream it will be a continuation byte, value between 128 and 191), the +// context is the same as if the second last byte was an ASCII control or space. +// +// If the last byte is a UTF8 lead byte (value >= 192), then the next byte will +// be a continuation byte and the context id is 2 or 3 depending on the LSB of +// the last byte and to a lesser extent on the second last byte if it is ASCII. +// +// If the last byte is a UTF8 continuation byte, the second last byte can be: +// - continuation byte: the next byte is probably ASCII or lead byte (assuming +// 4-byte UTF8 characters are rare) and the context id is 0 or 1. +// - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1 +// - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3 +// +// The possible value combinations of the previous two bytes, the range of +// context ids and the type of the next byte is summarized in the table below: +// +// |--------\-----------------------------------------------------------------| +// | \ Last byte | +// | Second \---------------------------------------------------------------| +// | last byte \ ASCII | cont. byte | lead byte | +// | \ (0-127) | (128-191) | (192-) | +// |=============|===================|=====================|==================| +// | ASCII | next: ASCII/lead | not valid | next: cont. | +// | (0-127) | context: 4 - 63 | | context: 2 - 3 | +// |-------------|-------------------|---------------------|------------------| +// | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. | +// | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 | +// |-------------|-------------------|---------------------|------------------| +// | lead byte | not valid | next: ASCII/lead | not valid | +// | (192-207) | | context: 0 - 1 | | +// |-------------|-------------------|---------------------|------------------| +// | lead byte | not valid | next: cont. | not valid | +// | (208-) | | context: 2 - 3 | | +// |-------------|-------------------|---------------------|------------------| +static const uint8_t kUTF8ContextLookup[512] = { + // Last byte. + // + // ASCII range. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12, + 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, + 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12, + 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, + 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0, + // UTF8 continuation byte range. + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + // UTF8 lead byte range. + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + // Second last byte. + // + // ASCII range. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0, + // UTF8 continuation byte range. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // UTF8 lead byte range. + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +}; + +// Context lookup table for small signed integers. +static const uint8_t kSigned3BitContextLookup[] = { + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, +}; + +enum ContextType { + CONTEXT_LSB6 = 0, + CONTEXT_MSB6 = 1, + CONTEXT_UTF8 = 2, + CONTEXT_SIGNED = 3 +}; + +static inline uint8_t Context(uint8_t p1, uint8_t p2, int mode) { + switch (mode) { + case CONTEXT_LSB6: + return p1 & 0x3f; + case CONTEXT_MSB6: + return p1 >> 2; + case CONTEXT_UTF8: + return kUTF8ContextLookup[p1] | kUTF8ContextLookup[p2 + 256]; + case CONTEXT_SIGNED: + return (kSigned3BitContextLookup[p1] << 3) + kSigned3BitContextLookup[p2]; + default: + return 0; + } +} + +} // namespace brotli + +#endif // BROTLI_ENC_CONTEXT_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/dictionary.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/dictionary.h new file mode 100644 index 0000000..2c0624e --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/dictionary.h @@ -0,0 +1,9485 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Collection of static dictionary words. + +#ifndef BROTLI_ENC_DICTIONARY_H_ +#define BROTLI_ENC_DICTIONARY_H_ + +#include + +static const uint8_t kBrotliDictionary[] = { + 0x74, 0x69, 0x6d, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x66, 0x65, 0x6c, + 0x65, 0x66, 0x74, 0x62, 0x61, 0x63, 0x6b, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x61, + 0x74, 0x61, 0x73, 0x68, 0x6f, 0x77, 0x6f, 0x6e, 0x6c, 0x79, 0x73, 0x69, 0x74, + 0x65, 0x63, 0x69, 0x74, 0x79, 0x6f, 0x70, 0x65, 0x6e, 0x6a, 0x75, 0x73, 0x74, + 0x6c, 0x69, 0x6b, 0x65, 0x66, 0x72, 0x65, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x74, + 0x65, 0x78, 0x74, 0x79, 0x65, 0x61, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x62, 0x6f, + 0x64, 0x79, 0x6c, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x62, 0x6f, 0x6f, + 0x6b, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x76, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x68, 0x65, 0x6c, 0x70, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6d, + 0x6f, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x64, 0x6c, 0x6f, 0x6e, 0x67, 0x74, 0x68, + 0x65, 0x6d, 0x76, 0x69, 0x65, 0x77, 0x66, 0x69, 0x6e, 0x64, 0x70, 0x61, 0x67, + 0x65, 0x64, 0x61, 0x79, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x68, 0x65, 0x61, 0x64, + 0x74, 0x65, 0x72, 0x6d, 0x65, 0x61, 0x63, 0x68, 0x61, 0x72, 0x65, 0x61, 0x66, + 0x72, 0x6f, 0x6d, 0x74, 0x72, 0x75, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x62, + 0x6c, 0x65, 0x75, 0x70, 0x6f, 0x6e, 0x68, 0x69, 0x67, 0x68, 0x64, 0x61, 0x74, + 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x6e, 0x65, 0x77, 0x73, 0x65, 0x76, 0x65, 0x6e, + 0x6e, 0x65, 0x78, 0x74, 0x63, 0x61, 0x73, 0x65, 0x62, 0x6f, 0x74, 0x68, 0x70, + 0x6f, 0x73, 0x74, 0x75, 0x73, 0x65, 0x64, 0x6d, 0x61, 0x64, 0x65, 0x68, 0x61, + 0x6e, 0x64, 0x68, 0x65, 0x72, 0x65, 0x77, 0x68, 0x61, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x62, 0x6c, 0x6f, 0x67, 0x73, 0x69, 0x7a, 0x65, + 0x62, 0x61, 0x73, 0x65, 0x68, 0x65, 0x6c, 0x64, 0x6d, 0x61, 0x6b, 0x65, 0x6d, + 0x61, 0x69, 0x6e, 0x75, 0x73, 0x65, 0x72, 0x27, 0x29, 0x20, 0x2b, 0x68, 0x6f, + 0x6c, 0x64, 0x65, 0x6e, 0x64, 0x73, 0x77, 0x69, 0x74, 0x68, 0x4e, 0x65, 0x77, + 0x73, 0x72, 0x65, 0x61, 0x64, 0x77, 0x65, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, + 0x74, 0x61, 0x6b, 0x65, 0x68, 0x61, 0x76, 0x65, 0x67, 0x61, 0x6d, 0x65, 0x73, + 0x65, 0x65, 0x6e, 0x63, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x74, 0x68, 0x77, 0x65, + 0x6c, 0x6c, 0x70, 0x6c, 0x75, 0x73, 0x6d, 0x65, 0x6e, 0x75, 0x66, 0x69, 0x6c, + 0x6d, 0x70, 0x61, 0x72, 0x74, 0x6a, 0x6f, 0x69, 0x6e, 0x74, 0x68, 0x69, 0x73, + 0x6c, 0x69, 0x73, 0x74, 0x67, 0x6f, 0x6f, 0x64, 0x6e, 0x65, 0x65, 0x64, 0x77, + 0x61, 0x79, 0x73, 0x77, 0x65, 0x73, 0x74, 0x6a, 0x6f, 0x62, 0x73, 0x6d, 0x69, + 0x6e, 0x64, 0x61, 0x6c, 0x73, 0x6f, 0x6c, 0x6f, 0x67, 0x6f, 0x72, 0x69, 0x63, + 0x68, 0x75, 0x73, 0x65, 0x73, 0x6c, 0x61, 0x73, 0x74, 0x74, 0x65, 0x61, 0x6d, + 0x61, 0x72, 0x6d, 0x79, 0x66, 0x6f, 0x6f, 0x64, 0x6b, 0x69, 0x6e, 0x67, 0x77, + 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x77, 0x61, 0x72, 0x64, 0x62, 0x65, + 0x73, 0x74, 0x66, 0x69, 0x72, 0x65, 0x50, 0x61, 0x67, 0x65, 0x6b, 0x6e, 0x6f, + 0x77, 0x61, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x6e, 0x67, 0x6d, 0x6f, 0x76, 0x65, + 0x74, 0x68, 0x61, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x67, 0x69, 0x76, 0x65, 0x73, + 0x65, 0x6c, 0x66, 0x6e, 0x6f, 0x74, 0x65, 0x6d, 0x75, 0x63, 0x68, 0x66, 0x65, + 0x65, 0x64, 0x6d, 0x61, 0x6e, 0x79, 0x72, 0x6f, 0x63, 0x6b, 0x69, 0x63, 0x6f, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x6c, 0x6f, 0x6f, 0x6b, 0x68, 0x69, 0x64, 0x65, + 0x64, 0x69, 0x65, 0x64, 0x48, 0x6f, 0x6d, 0x65, 0x72, 0x75, 0x6c, 0x65, 0x68, + 0x6f, 0x73, 0x74, 0x61, 0x6a, 0x61, 0x78, 0x69, 0x6e, 0x66, 0x6f, 0x63, 0x6c, + 0x75, 0x62, 0x6c, 0x61, 0x77, 0x73, 0x6c, 0x65, 0x73, 0x73, 0x68, 0x61, 0x6c, + 0x66, 0x73, 0x6f, 0x6d, 0x65, 0x73, 0x75, 0x63, 0x68, 0x7a, 0x6f, 0x6e, 0x65, + 0x31, 0x30, 0x30, 0x25, 0x6f, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x72, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x61, 0x63, 0x65, 0x62, 0x6c, 0x75, 0x65, 0x66, 0x6f, + 0x75, 0x72, 0x77, 0x65, 0x65, 0x6b, 0x66, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x70, + 0x65, 0x67, 0x61, 0x76, 0x65, 0x68, 0x61, 0x72, 0x64, 0x6c, 0x6f, 0x73, 0x74, + 0x77, 0x68, 0x65, 0x6e, 0x70, 0x61, 0x72, 0x6b, 0x6b, 0x65, 0x70, 0x74, 0x70, + 0x61, 0x73, 0x73, 0x73, 0x68, 0x69, 0x70, 0x72, 0x6f, 0x6f, 0x6d, 0x48, 0x54, + 0x4d, 0x4c, 0x70, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x6f, 0x6e, + 0x65, 0x73, 0x61, 0x76, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x66, 0x6c, 0x61, 0x67, + 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x6f, 0x6c, 0x64, 0x66, 0x69, 0x76, 0x65, 0x74, + 0x6f, 0x6f, 0x6b, 0x72, 0x61, 0x74, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x6a, 0x75, + 0x6d, 0x70, 0x74, 0x68, 0x75, 0x73, 0x64, 0x61, 0x72, 0x6b, 0x63, 0x61, 0x72, + 0x64, 0x66, 0x69, 0x6c, 0x65, 0x66, 0x65, 0x61, 0x72, 0x73, 0x74, 0x61, 0x79, + 0x6b, 0x69, 0x6c, 0x6c, 0x74, 0x68, 0x61, 0x74, 0x66, 0x61, 0x6c, 0x6c, 0x61, + 0x75, 0x74, 0x6f, 0x65, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x74, 0x61, + 0x6c, 0x6b, 0x73, 0x68, 0x6f, 0x70, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x65, 0x65, + 0x70, 0x6d, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x73, 0x74, 0x74, 0x75, 0x72, 0x6e, + 0x62, 0x6f, 0x72, 0x6e, 0x62, 0x61, 0x6e, 0x64, 0x66, 0x65, 0x6c, 0x6c, 0x72, + 0x6f, 0x73, 0x65, 0x75, 0x72, 0x6c, 0x28, 0x73, 0x6b, 0x69, 0x6e, 0x72, 0x6f, + 0x6c, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x61, 0x63, 0x74, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x6d, 0x65, 0x65, 0x74, 0x67, 0x6f, 0x6c, 0x64, 0x2e, 0x6a, 0x70, 0x67, + 0x69, 0x74, 0x65, 0x6d, 0x76, 0x61, 0x72, 0x79, 0x66, 0x65, 0x6c, 0x74, 0x74, + 0x68, 0x65, 0x6e, 0x73, 0x65, 0x6e, 0x64, 0x64, 0x72, 0x6f, 0x70, 0x56, 0x69, + 0x65, 0x77, 0x63, 0x6f, 0x70, 0x79, 0x31, 0x2e, 0x30, 0x22, 0x3c, 0x2f, 0x61, + 0x3e, 0x73, 0x74, 0x6f, 0x70, 0x65, 0x6c, 0x73, 0x65, 0x6c, 0x69, 0x65, 0x73, + 0x74, 0x6f, 0x75, 0x72, 0x70, 0x61, 0x63, 0x6b, 0x2e, 0x67, 0x69, 0x66, 0x70, + 0x61, 0x73, 0x74, 0x63, 0x73, 0x73, 0x3f, 0x67, 0x72, 0x61, 0x79, 0x6d, 0x65, + 0x61, 0x6e, 0x26, 0x67, 0x74, 0x3b, 0x72, 0x69, 0x64, 0x65, 0x73, 0x68, 0x6f, + 0x74, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x61, 0x69, 0x64, 0x72, 0x6f, 0x61, 0x64, + 0x76, 0x61, 0x72, 0x20, 0x66, 0x65, 0x65, 0x6c, 0x6a, 0x6f, 0x68, 0x6e, 0x72, + 0x69, 0x63, 0x6b, 0x70, 0x6f, 0x72, 0x74, 0x66, 0x61, 0x73, 0x74, 0x27, 0x55, + 0x41, 0x2d, 0x64, 0x65, 0x61, 0x64, 0x3c, 0x2f, 0x62, 0x3e, 0x70, 0x6f, 0x6f, + 0x72, 0x62, 0x69, 0x6c, 0x6c, 0x74, 0x79, 0x70, 0x65, 0x55, 0x2e, 0x53, 0x2e, + 0x77, 0x6f, 0x6f, 0x64, 0x6d, 0x75, 0x73, 0x74, 0x32, 0x70, 0x78, 0x3b, 0x49, + 0x6e, 0x66, 0x6f, 0x72, 0x61, 0x6e, 0x6b, 0x77, 0x69, 0x64, 0x65, 0x77, 0x61, + 0x6e, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x6c, 0x65, 0x61, 0x64, 0x5b, 0x30, 0x5d, + 0x3b, 0x70, 0x61, 0x75, 0x6c, 0x77, 0x61, 0x76, 0x65, 0x73, 0x75, 0x72, 0x65, + 0x24, 0x28, 0x27, 0x23, 0x77, 0x61, 0x69, 0x74, 0x6d, 0x61, 0x73, 0x73, 0x61, + 0x72, 0x6d, 0x73, 0x67, 0x6f, 0x65, 0x73, 0x67, 0x61, 0x69, 0x6e, 0x6c, 0x61, + 0x6e, 0x67, 0x70, 0x61, 0x69, 0x64, 0x21, 0x2d, 0x2d, 0x20, 0x6c, 0x6f, 0x63, + 0x6b, 0x75, 0x6e, 0x69, 0x74, 0x72, 0x6f, 0x6f, 0x74, 0x77, 0x61, 0x6c, 0x6b, + 0x66, 0x69, 0x72, 0x6d, 0x77, 0x69, 0x66, 0x65, 0x78, 0x6d, 0x6c, 0x22, 0x73, + 0x6f, 0x6e, 0x67, 0x74, 0x65, 0x73, 0x74, 0x32, 0x30, 0x70, 0x78, 0x6b, 0x69, + 0x6e, 0x64, 0x72, 0x6f, 0x77, 0x73, 0x74, 0x6f, 0x6f, 0x6c, 0x66, 0x6f, 0x6e, + 0x74, 0x6d, 0x61, 0x69, 0x6c, 0x73, 0x61, 0x66, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x6d, 0x61, 0x70, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x61, 0x69, 0x6e, 0x66, + 0x6c, 0x6f, 0x77, 0x62, 0x61, 0x62, 0x79, 0x73, 0x70, 0x61, 0x6e, 0x73, 0x61, + 0x79, 0x73, 0x34, 0x70, 0x78, 0x3b, 0x36, 0x70, 0x78, 0x3b, 0x61, 0x72, 0x74, + 0x73, 0x66, 0x6f, 0x6f, 0x74, 0x72, 0x65, 0x61, 0x6c, 0x77, 0x69, 0x6b, 0x69, + 0x68, 0x65, 0x61, 0x74, 0x73, 0x74, 0x65, 0x70, 0x74, 0x72, 0x69, 0x70, 0x6f, + 0x72, 0x67, 0x2f, 0x6c, 0x61, 0x6b, 0x65, 0x77, 0x65, 0x61, 0x6b, 0x74, 0x6f, + 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x63, 0x61, 0x73, 0x74, 0x66, 0x61, 0x6e, + 0x73, 0x62, 0x61, 0x6e, 0x6b, 0x76, 0x65, 0x72, 0x79, 0x72, 0x75, 0x6e, 0x73, + 0x6a, 0x75, 0x6c, 0x79, 0x74, 0x61, 0x73, 0x6b, 0x31, 0x70, 0x78, 0x3b, 0x67, + 0x6f, 0x61, 0x6c, 0x67, 0x72, 0x65, 0x77, 0x73, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x67, 0x65, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x73, 0x35, 0x70, 0x78, + 0x3b, 0x2e, 0x6a, 0x73, 0x3f, 0x34, 0x30, 0x70, 0x78, 0x69, 0x66, 0x20, 0x28, + 0x73, 0x6f, 0x6f, 0x6e, 0x73, 0x65, 0x61, 0x74, 0x6e, 0x6f, 0x6e, 0x65, 0x74, + 0x75, 0x62, 0x65, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x65, + 0x65, 0x64, 0x66, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x74, 0x6f, 0x67, 0x69, 0x66, + 0x74, 0x68, 0x61, 0x72, 0x6d, 0x31, 0x38, 0x70, 0x78, 0x63, 0x61, 0x6d, 0x65, + 0x68, 0x69, 0x6c, 0x6c, 0x62, 0x6f, 0x6c, 0x64, 0x7a, 0x6f, 0x6f, 0x6d, 0x76, + 0x6f, 0x69, 0x64, 0x65, 0x61, 0x73, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x66, 0x69, + 0x6c, 0x6c, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x69, 0x74, 0x63, 0x6f, 0x73, + 0x74, 0x33, 0x70, 0x78, 0x3b, 0x6a, 0x61, 0x63, 0x6b, 0x74, 0x61, 0x67, 0x73, + 0x62, 0x69, 0x74, 0x73, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x69, 0x74, 0x6b, + 0x6e, 0x65, 0x77, 0x6e, 0x65, 0x61, 0x72, 0x3c, 0x21, 0x2d, 0x2d, 0x67, 0x72, + 0x6f, 0x77, 0x4a, 0x53, 0x4f, 0x4e, 0x64, 0x75, 0x74, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x61, 0x6c, 0x65, 0x79, 0x6f, 0x75, 0x20, 0x6c, 0x6f, 0x74, 0x73, + 0x70, 0x61, 0x69, 0x6e, 0x6a, 0x61, 0x7a, 0x7a, 0x63, 0x6f, 0x6c, 0x64, 0x65, + 0x79, 0x65, 0x73, 0x66, 0x69, 0x73, 0x68, 0x77, 0x77, 0x77, 0x2e, 0x72, 0x69, + 0x73, 0x6b, 0x74, 0x61, 0x62, 0x73, 0x70, 0x72, 0x65, 0x76, 0x31, 0x30, 0x70, + 0x78, 0x72, 0x69, 0x73, 0x65, 0x32, 0x35, 0x70, 0x78, 0x42, 0x6c, 0x75, 0x65, + 0x64, 0x69, 0x6e, 0x67, 0x33, 0x30, 0x30, 0x2c, 0x62, 0x61, 0x6c, 0x6c, 0x66, + 0x6f, 0x72, 0x64, 0x65, 0x61, 0x72, 0x6e, 0x77, 0x69, 0x6c, 0x64, 0x62, 0x6f, + 0x78, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x6c, 0x61, 0x63, 0x6b, 0x76, 0x65, 0x72, + 0x73, 0x70, 0x61, 0x69, 0x72, 0x6a, 0x75, 0x6e, 0x65, 0x74, 0x65, 0x63, 0x68, + 0x69, 0x66, 0x28, 0x21, 0x70, 0x69, 0x63, 0x6b, 0x65, 0x76, 0x69, 0x6c, 0x24, + 0x28, 0x22, 0x23, 0x77, 0x61, 0x72, 0x6d, 0x6c, 0x6f, 0x72, 0x64, 0x64, 0x6f, + 0x65, 0x73, 0x70, 0x75, 0x6c, 0x6c, 0x2c, 0x30, 0x30, 0x30, 0x69, 0x64, 0x65, + 0x61, 0x64, 0x72, 0x61, 0x77, 0x68, 0x75, 0x67, 0x65, 0x73, 0x70, 0x6f, 0x74, + 0x66, 0x75, 0x6e, 0x64, 0x62, 0x75, 0x72, 0x6e, 0x68, 0x72, 0x65, 0x66, 0x63, + 0x65, 0x6c, 0x6c, 0x6b, 0x65, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x68, 0x6f, + 0x75, 0x72, 0x6c, 0x6f, 0x73, 0x73, 0x66, 0x75, 0x65, 0x6c, 0x31, 0x32, 0x70, + 0x78, 0x73, 0x75, 0x69, 0x74, 0x64, 0x65, 0x61, 0x6c, 0x52, 0x53, 0x53, 0x22, + 0x61, 0x67, 0x65, 0x64, 0x67, 0x72, 0x65, 0x79, 0x47, 0x45, 0x54, 0x22, 0x65, + 0x61, 0x73, 0x65, 0x61, 0x69, 0x6d, 0x73, 0x67, 0x69, 0x72, 0x6c, 0x61, 0x69, + 0x64, 0x73, 0x38, 0x70, 0x78, 0x3b, 0x6e, 0x61, 0x76, 0x79, 0x67, 0x72, 0x69, + 0x64, 0x74, 0x69, 0x70, 0x73, 0x23, 0x39, 0x39, 0x39, 0x77, 0x61, 0x72, 0x73, + 0x6c, 0x61, 0x64, 0x79, 0x63, 0x61, 0x72, 0x73, 0x29, 0x3b, 0x20, 0x7d, 0x70, + 0x68, 0x70, 0x3f, 0x68, 0x65, 0x6c, 0x6c, 0x74, 0x61, 0x6c, 0x6c, 0x77, 0x68, + 0x6f, 0x6d, 0x7a, 0x68, 0x3a, 0xe5, 0x2a, 0x2f, 0x0d, 0x0a, 0x20, 0x31, 0x30, + 0x30, 0x68, 0x61, 0x6c, 0x6c, 0x2e, 0x0a, 0x0a, 0x41, 0x37, 0x70, 0x78, 0x3b, + 0x70, 0x75, 0x73, 0x68, 0x63, 0x68, 0x61, 0x74, 0x30, 0x70, 0x78, 0x3b, 0x63, + 0x72, 0x65, 0x77, 0x2a, 0x2f, 0x3c, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x37, 0x35, + 0x70, 0x78, 0x66, 0x6c, 0x61, 0x74, 0x72, 0x61, 0x72, 0x65, 0x20, 0x26, 0x26, + 0x20, 0x74, 0x65, 0x6c, 0x6c, 0x63, 0x61, 0x6d, 0x70, 0x6f, 0x6e, 0x74, 0x6f, + 0x6c, 0x61, 0x69, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x73, 0x6b, 0x69, 0x70, 0x74, + 0x65, 0x6e, 0x74, 0x66, 0x69, 0x6e, 0x65, 0x6d, 0x61, 0x6c, 0x65, 0x67, 0x65, + 0x74, 0x73, 0x70, 0x6c, 0x6f, 0x74, 0x34, 0x30, 0x30, 0x2c, 0x0d, 0x0a, 0x0d, + 0x0a, 0x63, 0x6f, 0x6f, 0x6c, 0x66, 0x65, 0x65, 0x74, 0x2e, 0x70, 0x68, 0x70, + 0x3c, 0x62, 0x72, 0x3e, 0x65, 0x72, 0x69, 0x63, 0x6d, 0x6f, 0x73, 0x74, 0x67, + 0x75, 0x69, 0x64, 0x62, 0x65, 0x6c, 0x6c, 0x64, 0x65, 0x73, 0x63, 0x68, 0x61, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x68, 0x61, 0x74, 0x6f, 0x6d, 0x2f, 0x69, 0x6d, + 0x67, 0x26, 0x23, 0x38, 0x32, 0x6c, 0x75, 0x63, 0x6b, 0x63, 0x65, 0x6e, 0x74, + 0x30, 0x30, 0x30, 0x3b, 0x74, 0x69, 0x6e, 0x79, 0x67, 0x6f, 0x6e, 0x65, 0x68, + 0x74, 0x6d, 0x6c, 0x73, 0x65, 0x6c, 0x6c, 0x64, 0x72, 0x75, 0x67, 0x46, 0x52, + 0x45, 0x45, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x69, 0x63, 0x6b, 0x3f, 0x69, 0x64, + 0x3d, 0x6c, 0x6f, 0x73, 0x65, 0x6e, 0x75, 0x6c, 0x6c, 0x76, 0x61, 0x73, 0x74, + 0x77, 0x69, 0x6e, 0x64, 0x52, 0x53, 0x53, 0x20, 0x77, 0x65, 0x61, 0x72, 0x72, + 0x65, 0x6c, 0x79, 0x62, 0x65, 0x65, 0x6e, 0x73, 0x61, 0x6d, 0x65, 0x64, 0x75, + 0x6b, 0x65, 0x6e, 0x61, 0x73, 0x61, 0x63, 0x61, 0x70, 0x65, 0x77, 0x69, 0x73, + 0x68, 0x67, 0x75, 0x6c, 0x66, 0x54, 0x32, 0x33, 0x3a, 0x68, 0x69, 0x74, 0x73, + 0x73, 0x6c, 0x6f, 0x74, 0x67, 0x61, 0x74, 0x65, 0x6b, 0x69, 0x63, 0x6b, 0x62, + 0x6c, 0x75, 0x72, 0x74, 0x68, 0x65, 0x79, 0x31, 0x35, 0x70, 0x78, 0x27, 0x27, + 0x29, 0x3b, 0x29, 0x3b, 0x22, 0x3e, 0x6d, 0x73, 0x69, 0x65, 0x77, 0x69, 0x6e, + 0x73, 0x62, 0x69, 0x72, 0x64, 0x73, 0x6f, 0x72, 0x74, 0x62, 0x65, 0x74, 0x61, + 0x73, 0x65, 0x65, 0x6b, 0x54, 0x31, 0x38, 0x3a, 0x6f, 0x72, 0x64, 0x73, 0x74, + 0x72, 0x65, 0x65, 0x6d, 0x61, 0x6c, 0x6c, 0x36, 0x30, 0x70, 0x78, 0x66, 0x61, + 0x72, 0x6d, 0xe2, 0x80, 0x99, 0x73, 0x62, 0x6f, 0x79, 0x73, 0x5b, 0x30, 0x5d, + 0x2e, 0x27, 0x29, 0x3b, 0x22, 0x50, 0x4f, 0x53, 0x54, 0x62, 0x65, 0x61, 0x72, + 0x6b, 0x69, 0x64, 0x73, 0x29, 0x3b, 0x7d, 0x7d, 0x6d, 0x61, 0x72, 0x79, 0x74, + 0x65, 0x6e, 0x64, 0x28, 0x55, 0x4b, 0x29, 0x71, 0x75, 0x61, 0x64, 0x7a, 0x68, + 0x3a, 0xe6, 0x2d, 0x73, 0x69, 0x7a, 0x2d, 0x2d, 0x2d, 0x2d, 0x70, 0x72, 0x6f, + 0x70, 0x27, 0x29, 0x3b, 0x0d, 0x6c, 0x69, 0x66, 0x74, 0x54, 0x31, 0x39, 0x3a, + 0x76, 0x69, 0x63, 0x65, 0x61, 0x6e, 0x64, 0x79, 0x64, 0x65, 0x62, 0x74, 0x3e, + 0x52, 0x53, 0x53, 0x70, 0x6f, 0x6f, 0x6c, 0x6e, 0x65, 0x63, 0x6b, 0x62, 0x6c, + 0x6f, 0x77, 0x54, 0x31, 0x36, 0x3a, 0x64, 0x6f, 0x6f, 0x72, 0x65, 0x76, 0x61, + 0x6c, 0x54, 0x31, 0x37, 0x3a, 0x6c, 0x65, 0x74, 0x73, 0x66, 0x61, 0x69, 0x6c, + 0x6f, 0x72, 0x61, 0x6c, 0x70, 0x6f, 0x6c, 0x6c, 0x6e, 0x6f, 0x76, 0x61, 0x63, + 0x6f, 0x6c, 0x73, 0x67, 0x65, 0x6e, 0x65, 0x20, 0xe2, 0x80, 0x94, 0x73, 0x6f, + 0x66, 0x74, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6c, 0x6c, 0x72, 0x6f, 0x73, + 0x73, 0x3c, 0x68, 0x33, 0x3e, 0x70, 0x6f, 0x75, 0x72, 0x66, 0x61, 0x64, 0x65, + 0x70, 0x69, 0x6e, 0x6b, 0x3c, 0x74, 0x72, 0x3e, 0x6d, 0x69, 0x6e, 0x69, 0x29, + 0x7c, 0x21, 0x28, 0x6d, 0x69, 0x6e, 0x65, 0x7a, 0x68, 0x3a, 0xe8, 0x62, 0x61, + 0x72, 0x73, 0x68, 0x65, 0x61, 0x72, 0x30, 0x30, 0x29, 0x3b, 0x6d, 0x69, 0x6c, + 0x6b, 0x20, 0x2d, 0x2d, 0x3e, 0x69, 0x72, 0x6f, 0x6e, 0x66, 0x72, 0x65, 0x64, + 0x64, 0x69, 0x73, 0x6b, 0x77, 0x65, 0x6e, 0x74, 0x73, 0x6f, 0x69, 0x6c, 0x70, + 0x75, 0x74, 0x73, 0x2f, 0x6a, 0x73, 0x2f, 0x68, 0x6f, 0x6c, 0x79, 0x54, 0x32, + 0x32, 0x3a, 0x49, 0x53, 0x42, 0x4e, 0x54, 0x32, 0x30, 0x3a, 0x61, 0x64, 0x61, + 0x6d, 0x73, 0x65, 0x65, 0x73, 0x3c, 0x68, 0x32, 0x3e, 0x6a, 0x73, 0x6f, 0x6e, + 0x27, 0x2c, 0x20, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x54, 0x32, 0x31, 0x3a, 0x20, + 0x52, 0x53, 0x53, 0x6c, 0x6f, 0x6f, 0x70, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x6f, + 0x6f, 0x6e, 0x3c, 0x2f, 0x70, 0x3e, 0x73, 0x6f, 0x75, 0x6c, 0x4c, 0x49, 0x4e, + 0x45, 0x66, 0x6f, 0x72, 0x74, 0x63, 0x61, 0x72, 0x74, 0x54, 0x31, 0x34, 0x3a, + 0x3c, 0x68, 0x31, 0x3e, 0x38, 0x30, 0x70, 0x78, 0x21, 0x2d, 0x2d, 0x3c, 0x39, + 0x70, 0x78, 0x3b, 0x54, 0x30, 0x34, 0x3a, 0x6d, 0x69, 0x6b, 0x65, 0x3a, 0x34, + 0x36, 0x5a, 0x6e, 0x69, 0x63, 0x65, 0x69, 0x6e, 0x63, 0x68, 0x59, 0x6f, 0x72, + 0x6b, 0x72, 0x69, 0x63, 0x65, 0x7a, 0x68, 0x3a, 0xe4, 0x27, 0x29, 0x29, 0x3b, + 0x70, 0x75, 0x72, 0x65, 0x6d, 0x61, 0x67, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x6f, 0x6e, 0x65, 0x62, 0x6f, 0x6e, 0x64, 0x3a, 0x33, 0x37, 0x5a, 0x5f, 0x6f, + 0x66, 0x5f, 0x27, 0x5d, 0x29, 0x3b, 0x30, 0x30, 0x30, 0x2c, 0x7a, 0x68, 0x3a, + 0xe7, 0x74, 0x61, 0x6e, 0x6b, 0x79, 0x61, 0x72, 0x64, 0x62, 0x6f, 0x77, 0x6c, + 0x62, 0x75, 0x73, 0x68, 0x3a, 0x35, 0x36, 0x5a, 0x4a, 0x61, 0x76, 0x61, 0x33, + 0x30, 0x70, 0x78, 0x0a, 0x7c, 0x7d, 0x0a, 0x25, 0x43, 0x33, 0x25, 0x3a, 0x33, + 0x34, 0x5a, 0x6a, 0x65, 0x66, 0x66, 0x45, 0x58, 0x50, 0x49, 0x63, 0x61, 0x73, + 0x68, 0x76, 0x69, 0x73, 0x61, 0x67, 0x6f, 0x6c, 0x66, 0x73, 0x6e, 0x6f, 0x77, + 0x7a, 0x68, 0x3a, 0xe9, 0x71, 0x75, 0x65, 0x72, 0x2e, 0x63, 0x73, 0x73, 0x73, + 0x69, 0x63, 0x6b, 0x6d, 0x65, 0x61, 0x74, 0x6d, 0x69, 0x6e, 0x2e, 0x62, 0x69, + 0x6e, 0x64, 0x64, 0x65, 0x6c, 0x6c, 0x68, 0x69, 0x72, 0x65, 0x70, 0x69, 0x63, + 0x73, 0x72, 0x65, 0x6e, 0x74, 0x3a, 0x33, 0x36, 0x5a, 0x48, 0x54, 0x54, 0x50, + 0x2d, 0x32, 0x30, 0x31, 0x66, 0x6f, 0x74, 0x6f, 0x77, 0x6f, 0x6c, 0x66, 0x45, + 0x4e, 0x44, 0x20, 0x78, 0x62, 0x6f, 0x78, 0x3a, 0x35, 0x34, 0x5a, 0x42, 0x4f, + 0x44, 0x59, 0x64, 0x69, 0x63, 0x6b, 0x3b, 0x0a, 0x7d, 0x0a, 0x65, 0x78, 0x69, + 0x74, 0x3a, 0x33, 0x35, 0x5a, 0x76, 0x61, 0x72, 0x73, 0x62, 0x65, 0x61, 0x74, + 0x27, 0x7d, 0x29, 0x3b, 0x64, 0x69, 0x65, 0x74, 0x39, 0x39, 0x39, 0x3b, 0x61, + 0x6e, 0x6e, 0x65, 0x7d, 0x7d, 0x3c, 0x2f, 0x5b, 0x69, 0x5d, 0x2e, 0x4c, 0x61, + 0x6e, 0x67, 0x6b, 0x6d, 0xc2, 0xb2, 0x77, 0x69, 0x72, 0x65, 0x74, 0x6f, 0x79, + 0x73, 0x61, 0x64, 0x64, 0x73, 0x73, 0x65, 0x61, 0x6c, 0x61, 0x6c, 0x65, 0x78, + 0x3b, 0x0a, 0x09, 0x7d, 0x65, 0x63, 0x68, 0x6f, 0x6e, 0x69, 0x6e, 0x65, 0x2e, + 0x6f, 0x72, 0x67, 0x30, 0x30, 0x35, 0x29, 0x74, 0x6f, 0x6e, 0x79, 0x6a, 0x65, + 0x77, 0x73, 0x73, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x67, 0x73, 0x72, 0x6f, 0x6f, + 0x66, 0x30, 0x30, 0x30, 0x29, 0x20, 0x32, 0x30, 0x30, 0x77, 0x69, 0x6e, 0x65, + 0x67, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x67, 0x73, 0x62, 0x6f, 0x6f, 0x74, 0x67, + 0x61, 0x72, 0x79, 0x63, 0x75, 0x74, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x6d, 0x6c, 0x63, 0x6f, 0x63, + 0x6b, 0x67, 0x61, 0x6e, 0x67, 0x24, 0x28, 0x27, 0x2e, 0x35, 0x30, 0x70, 0x78, + 0x50, 0x68, 0x2e, 0x44, 0x6d, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x6e, 0x6c, + 0x6f, 0x61, 0x6e, 0x64, 0x65, 0x73, 0x6b, 0x6d, 0x69, 0x6c, 0x65, 0x72, 0x79, + 0x61, 0x6e, 0x75, 0x6e, 0x69, 0x78, 0x64, 0x69, 0x73, 0x63, 0x29, 0x3b, 0x7d, + 0x0a, 0x64, 0x75, 0x73, 0x74, 0x63, 0x6c, 0x69, 0x70, 0x29, 0x2e, 0x0a, 0x0a, + 0x37, 0x30, 0x70, 0x78, 0x2d, 0x32, 0x30, 0x30, 0x44, 0x56, 0x44, 0x73, 0x37, + 0x5d, 0x3e, 0x3c, 0x74, 0x61, 0x70, 0x65, 0x64, 0x65, 0x6d, 0x6f, 0x69, 0x2b, + 0x2b, 0x29, 0x77, 0x61, 0x67, 0x65, 0x65, 0x75, 0x72, 0x6f, 0x70, 0x68, 0x69, + 0x6c, 0x6f, 0x70, 0x74, 0x73, 0x68, 0x6f, 0x6c, 0x65, 0x46, 0x41, 0x51, 0x73, + 0x61, 0x73, 0x69, 0x6e, 0x2d, 0x32, 0x36, 0x54, 0x6c, 0x61, 0x62, 0x73, 0x70, + 0x65, 0x74, 0x73, 0x55, 0x52, 0x4c, 0x20, 0x62, 0x75, 0x6c, 0x6b, 0x63, 0x6f, + 0x6f, 0x6b, 0x3b, 0x7d, 0x0d, 0x0a, 0x48, 0x45, 0x41, 0x44, 0x5b, 0x30, 0x5d, + 0x29, 0x61, 0x62, 0x62, 0x72, 0x6a, 0x75, 0x61, 0x6e, 0x28, 0x31, 0x39, 0x38, + 0x6c, 0x65, 0x73, 0x68, 0x74, 0x77, 0x69, 0x6e, 0x3c, 0x2f, 0x69, 0x3e, 0x73, + 0x6f, 0x6e, 0x79, 0x67, 0x75, 0x79, 0x73, 0x66, 0x75, 0x63, 0x6b, 0x70, 0x69, + 0x70, 0x65, 0x7c, 0x2d, 0x0a, 0x21, 0x30, 0x30, 0x32, 0x29, 0x6e, 0x64, 0x6f, + 0x77, 0x5b, 0x31, 0x5d, 0x3b, 0x5b, 0x5d, 0x3b, 0x0a, 0x4c, 0x6f, 0x67, 0x20, + 0x73, 0x61, 0x6c, 0x74, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x61, 0x6e, 0x67, 0x74, + 0x72, 0x69, 0x6d, 0x62, 0x61, 0x74, 0x68, 0x29, 0x7b, 0x0d, 0x0a, 0x30, 0x30, + 0x70, 0x78, 0x0a, 0x7d, 0x29, 0x3b, 0x6b, 0x6f, 0x3a, 0xec, 0x66, 0x65, 0x65, + 0x73, 0x61, 0x64, 0x3e, 0x0d, 0x73, 0x3a, 0x2f, 0x2f, 0x20, 0x5b, 0x5d, 0x3b, + 0x74, 0x6f, 0x6c, 0x6c, 0x70, 0x6c, 0x75, 0x67, 0x28, 0x29, 0x7b, 0x0a, 0x7b, + 0x0d, 0x0a, 0x20, 0x2e, 0x6a, 0x73, 0x27, 0x32, 0x30, 0x30, 0x70, 0x64, 0x75, + 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x74, 0x2e, 0x4a, 0x50, 0x47, 0x29, 0x3b, 0x0a, + 0x7d, 0x71, 0x75, 0x6f, 0x74, 0x29, 0x3b, 0x0a, 0x0a, 0x27, 0x29, 0x3b, 0x0a, + 0x0d, 0x0a, 0x7d, 0x0d, 0x32, 0x30, 0x31, 0x34, 0x32, 0x30, 0x31, 0x35, 0x32, + 0x30, 0x31, 0x36, 0x32, 0x30, 0x31, 0x37, 0x32, 0x30, 0x31, 0x38, 0x32, 0x30, + 0x31, 0x39, 0x32, 0x30, 0x32, 0x30, 0x32, 0x30, 0x32, 0x31, 0x32, 0x30, 0x32, + 0x32, 0x32, 0x30, 0x32, 0x33, 0x32, 0x30, 0x32, 0x34, 0x32, 0x30, 0x32, 0x35, + 0x32, 0x30, 0x32, 0x36, 0x32, 0x30, 0x32, 0x37, 0x32, 0x30, 0x32, 0x38, 0x32, + 0x30, 0x32, 0x39, 0x32, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x31, 0x32, 0x30, + 0x33, 0x32, 0x32, 0x30, 0x33, 0x33, 0x32, 0x30, 0x33, 0x34, 0x32, 0x30, 0x33, + 0x35, 0x32, 0x30, 0x33, 0x36, 0x32, 0x30, 0x33, 0x37, 0x32, 0x30, 0x31, 0x33, + 0x32, 0x30, 0x31, 0x32, 0x32, 0x30, 0x31, 0x31, 0x32, 0x30, 0x31, 0x30, 0x32, + 0x30, 0x30, 0x39, 0x32, 0x30, 0x30, 0x38, 0x32, 0x30, 0x30, 0x37, 0x32, 0x30, + 0x30, 0x36, 0x32, 0x30, 0x30, 0x35, 0x32, 0x30, 0x30, 0x34, 0x32, 0x30, 0x30, + 0x33, 0x32, 0x30, 0x30, 0x32, 0x32, 0x30, 0x30, 0x31, 0x32, 0x30, 0x30, 0x30, + 0x31, 0x39, 0x39, 0x39, 0x31, 0x39, 0x39, 0x38, 0x31, 0x39, 0x39, 0x37, 0x31, + 0x39, 0x39, 0x36, 0x31, 0x39, 0x39, 0x35, 0x31, 0x39, 0x39, 0x34, 0x31, 0x39, + 0x39, 0x33, 0x31, 0x39, 0x39, 0x32, 0x31, 0x39, 0x39, 0x31, 0x31, 0x39, 0x39, + 0x30, 0x31, 0x39, 0x38, 0x39, 0x31, 0x39, 0x38, 0x38, 0x31, 0x39, 0x38, 0x37, + 0x31, 0x39, 0x38, 0x36, 0x31, 0x39, 0x38, 0x35, 0x31, 0x39, 0x38, 0x34, 0x31, + 0x39, 0x38, 0x33, 0x31, 0x39, 0x38, 0x32, 0x31, 0x39, 0x38, 0x31, 0x31, 0x39, + 0x38, 0x30, 0x31, 0x39, 0x37, 0x39, 0x31, 0x39, 0x37, 0x38, 0x31, 0x39, 0x37, + 0x37, 0x31, 0x39, 0x37, 0x36, 0x31, 0x39, 0x37, 0x35, 0x31, 0x39, 0x37, 0x34, + 0x31, 0x39, 0x37, 0x33, 0x31, 0x39, 0x37, 0x32, 0x31, 0x39, 0x37, 0x31, 0x31, + 0x39, 0x37, 0x30, 0x31, 0x39, 0x36, 0x39, 0x31, 0x39, 0x36, 0x38, 0x31, 0x39, + 0x36, 0x37, 0x31, 0x39, 0x36, 0x36, 0x31, 0x39, 0x36, 0x35, 0x31, 0x39, 0x36, + 0x34, 0x31, 0x39, 0x36, 0x33, 0x31, 0x39, 0x36, 0x32, 0x31, 0x39, 0x36, 0x31, + 0x31, 0x39, 0x36, 0x30, 0x31, 0x39, 0x35, 0x39, 0x31, 0x39, 0x35, 0x38, 0x31, + 0x39, 0x35, 0x37, 0x31, 0x39, 0x35, 0x36, 0x31, 0x39, 0x35, 0x35, 0x31, 0x39, + 0x35, 0x34, 0x31, 0x39, 0x35, 0x33, 0x31, 0x39, 0x35, 0x32, 0x31, 0x39, 0x35, + 0x31, 0x31, 0x39, 0x35, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x34, + 0x31, 0x33, 0x39, 0x34, 0x30, 0x30, 0x30, 0x30, 0x39, 0x39, 0x39, 0x39, 0x63, + 0x6f, 0x6d, 0x6f, 0x6d, 0xc3, 0xa1, 0x73, 0x65, 0x73, 0x74, 0x65, 0x65, 0x73, + 0x74, 0x61, 0x70, 0x65, 0x72, 0x6f, 0x74, 0x6f, 0x64, 0x6f, 0x68, 0x61, 0x63, + 0x65, 0x63, 0x61, 0x64, 0x61, 0x61, 0xc3, 0xb1, 0x6f, 0x62, 0x69, 0x65, 0x6e, + 0x64, 0xc3, 0xad, 0x61, 0x61, 0x73, 0xc3, 0xad, 0x76, 0x69, 0x64, 0x61, 0x63, + 0x61, 0x73, 0x6f, 0x6f, 0x74, 0x72, 0x6f, 0x66, 0x6f, 0x72, 0x6f, 0x73, 0x6f, + 0x6c, 0x6f, 0x6f, 0x74, 0x72, 0x61, 0x63, 0x75, 0x61, 0x6c, 0x64, 0x69, 0x6a, + 0x6f, 0x73, 0x69, 0x64, 0x6f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x69, 0x70, 0x6f, + 0x74, 0x65, 0x6d, 0x61, 0x64, 0x65, 0x62, 0x65, 0x61, 0x6c, 0x67, 0x6f, 0x71, + 0x75, 0xc3, 0xa9, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x61, 0x64, 0x61, 0x74, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x63, 0x6f, 0x63, 0x61, 0x73, 0x61, 0x62, 0x61, 0x6a, + 0x6f, 0x74, 0x6f, 0x64, 0x61, 0x73, 0x69, 0x6e, 0x6f, 0x61, 0x67, 0x75, 0x61, + 0x70, 0x75, 0x65, 0x73, 0x75, 0x6e, 0x6f, 0x73, 0x61, 0x6e, 0x74, 0x65, 0x64, + 0x69, 0x63, 0x65, 0x6c, 0x75, 0x69, 0x73, 0x65, 0x6c, 0x6c, 0x61, 0x6d, 0x61, + 0x79, 0x6f, 0x7a, 0x6f, 0x6e, 0x61, 0x61, 0x6d, 0x6f, 0x72, 0x70, 0x69, 0x73, + 0x6f, 0x6f, 0x62, 0x72, 0x61, 0x63, 0x6c, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f, + 0x64, 0x69, 0x6f, 0x73, 0x68, 0x6f, 0x72, 0x61, 0x63, 0x61, 0x73, 0x69, 0xd0, + 0xb7, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x80, + 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x83, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, + 0xb5, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xb7, + 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, + 0xb6, 0xd0, 0xb5, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x85, 0xd0, 0x9d, + 0xd0, 0xb0, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xbc, 0xd1, + 0x8b, 0xd0, 0x92, 0xd1, 0x8b, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x8b, + 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0x9d, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, + 0x9f, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xa0, + 0xd0, 0xa4, 0xd0, 0x9d, 0xd0, 0xb5, 0xd0, 0x9c, 0xd1, 0x8b, 0xd1, 0x82, 0xd1, + 0x8b, 0xd0, 0x9e, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb4, 0xd0, 0xb0, + 0xd0, 0x97, 0xd0, 0xb0, 0xd0, 0x94, 0xd0, 0xb0, 0xd0, 0x9d, 0xd1, 0x83, 0xd0, + 0x9e, 0xd0, 0xb1, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0x98, 0xd0, 0xb7, 0xd0, 0xb5, + 0xd0, 0xb9, 0xd0, 0xbd, 0xd1, 0x83, 0xd0, 0xbc, 0xd0, 0xbc, 0xd0, 0xa2, 0xd1, + 0x8b, 0xd1, 0x83, 0xd0, 0xb6, 0xd9, 0x81, 0xd9, 0x8a, 0xd8, 0xa3, 0xd9, 0x86, + 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xb9, 0xd9, 0x83, 0xd9, 0x84, 0xd8, + 0xa3, 0xd9, 0x88, 0xd8, 0xb1, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x81, + 0xd9, 0x89, 0xd9, 0x87, 0xd9, 0x88, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x84, 0xd9, + 0x83, 0xd8, 0xa7, 0xd9, 0x88, 0xd9, 0x84, 0xd9, 0x87, 0xd8, 0xa8, 0xd8, 0xb3, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa5, 0xd9, 0x86, 0xd9, 0x87, 0xd9, 0x8a, 0xd8, + 0xa3, 0xd9, 0x8a, 0xd9, 0x82, 0xd8, 0xaf, 0xd9, 0x87, 0xd9, 0x84, 0xd8, 0xab, + 0xd9, 0x85, 0xd8, 0xa8, 0xd9, 0x87, 0xd9, 0x84, 0xd9, 0x88, 0xd9, 0x84, 0xd9, + 0x8a, 0xd8, 0xa8, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x8a, 0xd8, 0xa8, 0xd9, 0x83, + 0xd8, 0xb4, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xa3, 0xd9, 0x85, 0xd9, + 0x86, 0xd8, 0xaa, 0xd8, 0xa8, 0xd9, 0x8a, 0xd9, 0x84, 0xd9, 0x86, 0xd8, 0xad, + 0xd8, 0xa8, 0xd9, 0x87, 0xd9, 0x85, 0xd9, 0x85, 0xd8, 0xb4, 0xd9, 0x88, 0xd8, + 0xb4, 0x66, 0x69, 0x72, 0x73, 0x74, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x77, 0x68, 0x69, 0x74, 0x65, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6c, 0x61, + 0x63, 0x6b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x62, + 0x6f, 0x6f, 0x6b, 0x73, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x75, 0x73, 0x69, + 0x63, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x68, 0x6f, 0x75, + 0x73, 0x65, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x79, + 0x65, 0x61, 0x72, 0x73, 0x73, 0x74, 0x61, 0x74, 0x65, 0x74, 0x6f, 0x64, 0x61, + 0x79, 0x77, 0x61, 0x74, 0x65, 0x72, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x64, 0x65, 0x61, 0x74, 0x68, 0x70, 0x6f, 0x77, 0x65, 0x72, + 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x74, + 0x65, 0x72, 0x6d, 0x73, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x74, 0x6f, 0x6f, 0x6c, + 0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x77, 0x6f, 0x72, 0x64, 0x73, + 0x67, 0x61, 0x6d, 0x65, 0x73, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x67, 0x75, 0x69, 0x64, + 0x65, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x77, 0x6f, + 0x6d, 0x65, 0x6e, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x6d, 0x6f, 0x6e, 0x65, 0x79, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x79, 0x6f, 0x75, + 0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x77, 0x61, 0x74, 0x63, 0x68, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x70, 0x72, 0x69, 0x63, 0x65, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x62, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x66, 0x74, 0x65, 0x72, 0x76, 0x69, 0x73, + 0x69, 0x74, 0x69, 0x73, 0x73, 0x75, 0x65, 0x61, 0x72, 0x65, 0x61, 0x73, 0x62, + 0x65, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x70, 0x72, 0x65, 0x73, 0x73, 0x62, 0x75, 0x69, 0x6c, 0x74, + 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x73, 0x70, 0x65, 0x65, 0x64, 0x73, 0x74, 0x75, + 0x64, 0x79, 0x74, 0x72, 0x61, 0x64, 0x65, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x73, + 0x65, 0x6e, 0x73, 0x65, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x77, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x61, 0x64, + 0x64, 0x65, 0x64, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x66, 0x6c, 0x61, + 0x73, 0x68, 0x66, 0x69, 0x78, 0x65, 0x64, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x73, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x72, 0x69, 0x76, 0x65, 0x72, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x78, 0x69, 0x73, 0x74, 0x67, 0x6f, 0x69, + 0x6e, 0x67, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x74, 0x68, 0x69, 0x72, 0x64, 0x62, + 0x61, 0x73, 0x69, 0x63, 0x70, 0x65, 0x61, 0x63, 0x65, 0x73, 0x74, 0x61, 0x67, + 0x65, 0x77, 0x69, 0x64, 0x74, 0x68, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x69, 0x64, + 0x65, 0x61, 0x73, 0x77, 0x72, 0x6f, 0x74, 0x65, 0x70, 0x61, 0x67, 0x65, 0x73, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x64, 0x72, 0x69, 0x76, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x76, + 0x6f, 0x69, 0x63, 0x65, 0x73, 0x69, 0x74, 0x65, 0x73, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x77, 0x68, 0x65, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x65, 0x61, 0x72, 0x74, 0x68, 0x66, 0x6f, 0x72, 0x75, 0x6d, + 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x6c, + 0x69, 0x76, 0x65, 0x73, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x63, 0x6f, 0x75, 0x72, 0x74, + 0x79, 0x6f, 0x75, 0x72, 0x20, 0x62, 0x69, 0x72, 0x74, 0x68, 0x70, 0x6f, 0x70, + 0x75, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x65, 0x76, 0x65, 0x72, 0x79, 0x73, 0x68, + 0x6f, 0x77, 0x73, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x62, 0x65, 0x67, 0x61, 0x6e, 0x73, + 0x75, 0x70, 0x65, 0x72, 0x70, 0x61, 0x70, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x74, + 0x68, 0x6c, 0x65, 0x61, 0x72, 0x6e, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x6e, 0x61, + 0x6d, 0x65, 0x64, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x65, 0x72, 0x6d, 0x73, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x62, 0x72, 0x61, + 0x6e, 0x64, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x72, 0x65, 0x61, 0x64, 0x79, 0x61, 0x75, 0x64, 0x69, + 0x6f, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x76, 0x65, 0x64, 0x63, 0x61, 0x73, 0x65, 0x73, + 0x64, 0x61, 0x69, 0x6c, 0x79, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x67, 0x72, 0x65, + 0x61, 0x74, 0x6a, 0x75, 0x64, 0x67, 0x65, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x75, + 0x6e, 0x69, 0x74, 0x73, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x62, 0x72, 0x6f, 0x61, + 0x64, 0x63, 0x6f, 0x61, 0x73, 0x74, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x70, + 0x70, 0x6c, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x63, 0x79, 0x63, 0x6c, 0x65, + 0x73, 0x63, 0x65, 0x6e, 0x65, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x63, 0x6c, 0x69, + 0x63, 0x6b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x71, 0x75, 0x65, 0x65, 0x6e, 0x70, + 0x69, 0x65, 0x63, 0x65, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x63, 0x61, 0x63, 0x68, 0x65, 0x63, 0x69, 0x76, 0x69, 0x6c, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x74, 0x68, 0x65, + 0x6d, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x6f, 0x79, 0x61, 0x6c, 0x61, 0x73, 0x6b, 0x65, + 0x64, 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x74, + 0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x61, 0x69, 0x74, 0x68, + 0x68, 0x65, 0x61, 0x72, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x6d, + 0x69, 0x67, 0x68, 0x74, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x74, 0x68, 0x69, 0x6e, + 0x6b, 0x62, 0x6c, 0x6f, 0x6f, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x6d, 0x61, + 0x6a, 0x6f, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x63, 0x61, 0x6e, 0x6f, 0x6e, + 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x68, 0x61, 0x70, 0x70, 0x79, 0x6f, 0x63, 0x63, 0x75, + 0x72, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x66, 0x72, 0x65, 0x73, 0x68, 0x71, 0x75, + 0x69, 0x74, 0x65, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x6e, 0x65, 0x65, 0x64, 0x73, 0x75, 0x72, 0x62, 0x61, 0x6e, 0x66, 0x69, 0x67, + 0x68, 0x74, 0x62, 0x61, 0x73, 0x69, 0x73, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x61, + 0x75, 0x74, 0x6f, 0x3b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x59, 0x6f, + 0x75, 0x72, 0x20, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x62, 0x72, 0x6f, 0x77, 0x6e, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x72, 0x61, + 0x77, 0x6e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x72, 0x65, 0x61, 0x63, 0x68, 0x52, + 0x69, 0x67, 0x68, 0x74, 0x64, 0x61, 0x74, 0x65, 0x73, 0x6d, 0x61, 0x72, 0x63, + 0x68, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4c, 0x69, + 0x6e, 0x6b, 0x73, 0x64, 0x6f, 0x75, 0x62, 0x74, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x63, 0x68, 0x69, + 0x65, 0x66, 0x79, 0x6f, 0x75, 0x74, 0x68, 0x6e, 0x6f, 0x76, 0x65, 0x6c, 0x31, + 0x30, 0x70, 0x78, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x75, 0x6e, 0x74, 0x69, + 0x6c, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x71, 0x75, 0x65, 0x72, 0x79, 0x6a, 0x61, 0x6d, 0x65, 0x73, + 0x65, 0x71, 0x75, 0x61, 0x6c, 0x74, 0x77, 0x69, 0x63, 0x65, 0x30, 0x2c, 0x30, + 0x30, 0x30, 0x53, 0x74, 0x61, 0x72, 0x74, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x73, + 0x6f, 0x6e, 0x67, 0x73, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x68, 0x69, 0x66, 0x74, 0x77, 0x6f, 0x72, 0x74, 0x68, 0x70, 0x6f, + 0x73, 0x74, 0x73, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x77, 0x65, 0x65, 0x6b, 0x73, + 0x61, 0x76, 0x6f, 0x69, 0x64, 0x74, 0x68, 0x65, 0x73, 0x65, 0x6d, 0x69, 0x6c, + 0x65, 0x73, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x6d, 0x61, 0x72, 0x6b, + 0x73, 0x72, 0x61, 0x74, 0x65, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x73, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x73, 0x61, 0x6c, 0x65, 0x73, 0x74, 0x65, 0x78, 0x74, 0x73, + 0x73, 0x74, 0x61, 0x72, 0x73, 0x77, 0x72, 0x6f, 0x6e, 0x67, 0x3c, 0x2f, 0x68, + 0x33, 0x3e, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x68, 0x65, 0x61, 0x72, 0x64, 0x50, 0x6f, 0x77, 0x65, + 0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x62, 0x72, 0x69, 0x6e, 0x67, + 0x73, 0x68, 0x69, 0x70, 0x73, 0x73, 0x74, 0x61, 0x66, 0x66, 0x74, 0x72, 0x69, + 0x65, 0x64, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x66, + 0x61, 0x63, 0x74, 0x73, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x2f, 0x2f, 0x2d, 0x2d, 0x3e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x65, 0x67, + 0x79, 0x70, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x31, 0x35, 0x70, 0x78, 0x3b, + 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x72, 0x75, 0x65, 0x22, 0x63, 0x72, 0x6f, + 0x73, 0x73, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x62, 0x6c, 0x6f, 0x67, 0x73, 0x62, + 0x6f, 0x78, 0x22, 0x3e, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x6c, 0x65, 0x61, 0x76, + 0x65, 0x63, 0x68, 0x69, 0x6e, 0x61, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x67, 0x75, + 0x65, 0x73, 0x74, 0x3c, 0x2f, 0x68, 0x34, 0x3e, 0x72, 0x6f, 0x62, 0x6f, 0x74, + 0x68, 0x65, 0x61, 0x76, 0x79, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x73, 0x65, 0x76, + 0x65, 0x6e, 0x67, 0x72, 0x61, 0x6e, 0x64, 0x63, 0x72, 0x69, 0x6d, 0x65, 0x73, + 0x69, 0x67, 0x6e, 0x73, 0x61, 0x77, 0x61, 0x72, 0x65, 0x64, 0x61, 0x6e, 0x63, + 0x65, 0x70, 0x68, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x65, 0x6e, + 0x5f, 0x55, 0x53, 0x26, 0x23, 0x33, 0x39, 0x3b, 0x32, 0x30, 0x30, 0x70, 0x78, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x6a, + 0x6f, 0x79, 0x61, 0x6a, 0x61, 0x78, 0x2e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x6d, 0x69, 0x74, 0x68, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x68, 0x6f, 0x6c, 0x64, + 0x73, 0x70, 0x65, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, + 0x76, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x70, 0x72, 0x69, + 0x6f, 0x72, 0x53, 0x68, 0x61, 0x72, 0x65, 0x31, 0x39, 0x39, 0x30, 0x73, 0x72, + 0x6f, 0x6d, 0x61, 0x6e, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x6a, 0x61, 0x70, 0x61, + 0x6e, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x61, 0x67, 0x72, 0x65, 0x65, 0x3c, 0x2f, 0x68, 0x32, 0x3e, + 0x61, 0x62, 0x75, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x63, 0x61, 0x72, 0x64, 0x73, 0x68, + 0x69, 0x6c, 0x6c, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x50, 0x68, 0x6f, 0x74, + 0x6f, 0x74, 0x72, 0x75, 0x74, 0x68, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x2e, 0x70, + 0x68, 0x70, 0x3f, 0x73, 0x61, 0x69, 0x6e, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x6c, + 0x6c, 0x6f, 0x75, 0x69, 0x73, 0x6d, 0x65, 0x61, 0x6e, 0x74, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x62, 0x72, 0x69, 0x65, 0x66, 0x72, 0x6f, 0x77, 0x22, 0x3e, 0x67, + 0x65, 0x6e, 0x72, 0x65, 0x74, 0x72, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6b, + 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x6e, + 0x65, 0x74, 0x2f, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x74, 0x72, 0x79, 0x20, 0x7b, + 0x0a, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x73, 0x63, 0x6f, 0x73, + 0x74, 0x73, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x61, 0x64, 0x75, 0x6c, 0x74, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x6c, 0x61, 0x62, 0x6f, + 0x72, 0x68, 0x65, 0x6c, 0x70, 0x73, 0x63, 0x61, 0x75, 0x73, 0x65, 0x6d, 0x61, + 0x67, 0x69, 0x63, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x69, 0x72, + 0x32, 0x35, 0x30, 0x70, 0x78, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x73, 0x74, 0x65, + 0x70, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x67, + 0x6c, 0x61, 0x73, 0x73, 0x73, 0x69, 0x64, 0x65, 0x73, 0x66, 0x75, 0x6e, 0x64, + 0x73, 0x68, 0x6f, 0x74, 0x65, 0x6c, 0x61, 0x77, 0x61, 0x72, 0x64, 0x6d, 0x6f, + 0x75, 0x74, 0x68, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x70, 0x61, 0x72, 0x69, 0x73, + 0x67, 0x69, 0x76, 0x65, 0x73, 0x64, 0x75, 0x74, 0x63, 0x68, 0x74, 0x65, 0x78, + 0x61, 0x73, 0x66, 0x72, 0x75, 0x69, 0x74, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x7c, + 0x7c, 0x5b, 0x5d, 0x3b, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x0a, 0x3c, 0x21, 0x2d, + 0x2d, 0x50, 0x4f, 0x53, 0x54, 0x22, 0x6f, 0x63, 0x65, 0x61, 0x6e, 0x3c, 0x62, + 0x72, 0x2f, 0x3e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x73, 0x70, 0x65, 0x61, 0x6b, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x62, 0x61, 0x6e, + 0x6b, 0x73, 0x63, 0x61, 0x74, 0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x74, 0x32, + 0x30, 0x70, 0x78, 0x3b, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x64, 0x65, 0x61, 0x6c, + 0x73, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x75, 0x72, + 0x6c, 0x3d, 0x22, 0x70, 0x61, 0x72, 0x6b, 0x73, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x4d, 0x6f, 0x73, 0x74, 0x20, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f, 0x61, 0x6d, 0x6f, + 0x6e, 0x67, 0x62, 0x72, 0x61, 0x69, 0x6e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x62, 0x61, 0x73, 0x65, 0x64, 0x63, 0x61, 0x72, 0x72, + 0x79, 0x64, 0x72, 0x61, 0x66, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x64, 0x72, 0x65, 0x61, 0x6d, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x64, + 0x72, 0x75, 0x67, 0x73, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x61, 0x70, 0x72, 0x69, + 0x6c, 0x69, 0x64, 0x65, 0x61, 0x6c, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x65, 0x78, + 0x61, 0x63, 0x74, 0x66, 0x6f, 0x72, 0x74, 0x68, 0x63, 0x6f, 0x64, 0x65, 0x73, + 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x56, 0x69, 0x65, 0x77, 0x20, 0x73, 0x65, 0x65, + 0x6d, 0x73, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, + 0x28, 0x32, 0x30, 0x30, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e, + 0x6b, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x67, 0x72, + 0x65, 0x65, 0x6b, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x72, 0x69, 0x6e, 0x67, 0x73, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x33, 0x30, 0x70, 0x78, 0x3b, 0x77, 0x68, 0x6f, + 0x73, 0x65, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x29, 0x3b, 0x22, 0x20, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x6a, 0x6f, 0x6e, 0x65, + 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x22, 0x3e, 0x29, 0x3b, + 0x69, 0x66, 0x28, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x64, 0x61, 0x76, 0x69, 0x64, + 0x68, 0x6f, 0x72, 0x73, 0x65, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x72, 0x61, 0x69, + 0x73, 0x65, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x65, 0x6d, 0x3e, 0x62, 0x61, 0x72, 0x22, + 0x3e, 0x2e, 0x73, 0x72, 0x63, 0x3d, 0x74, 0x6f, 0x77, 0x65, 0x72, 0x61, 0x6c, + 0x74, 0x3d, 0x22, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x68, 0x65, 0x6e, 0x72, 0x79, + 0x32, 0x34, 0x70, 0x78, 0x3b, 0x73, 0x65, 0x74, 0x75, 0x70, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x73, 0x68, 0x61, 0x72, 0x70, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x74, + 0x61, 0x73, 0x74, 0x65, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x67, 0x69, + 0x72, 0x6c, 0x73, 0x2f, 0x63, 0x73, 0x73, 0x2f, 0x31, 0x30, 0x30, 0x25, 0x3b, + 0x63, 0x6c, 0x75, 0x62, 0x73, 0x73, 0x74, 0x75, 0x66, 0x66, 0x62, 0x69, 0x62, + 0x6c, 0x65, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x20, 0x31, 0x30, 0x30, 0x30, 0x6b, + 0x6f, 0x72, 0x65, 0x61, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x62, 0x61, 0x6e, 0x64, + 0x73, 0x71, 0x75, 0x65, 0x75, 0x65, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x38, 0x30, + 0x70, 0x78, 0x3b, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x7b, 0x0d, 0x0a, 0x09, 0x09, + 0x61, 0x68, 0x65, 0x61, 0x64, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x72, 0x69, + 0x73, 0x68, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x79, 0x61, 0x68, 0x6f, + 0x6f, 0x29, 0x5b, 0x30, 0x5d, 0x3b, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x66, 0x69, + 0x6e, 0x64, 0x73, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x55, 0x52, 0x4c, 0x20, 0x3d, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x70, + 0x72, 0x69, 0x6d, 0x65, 0x74, 0x65, 0x6c, 0x6c, 0x73, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x30, 0x78, 0x36, 0x30, 0x30, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x73, 0x70, + 0x61, 0x69, 0x6e, 0x62, 0x65, 0x61, 0x63, 0x68, 0x74, 0x61, 0x78, 0x65, 0x73, + 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x2d, 0x2d, 0x3e, + 0x3c, 0x2f, 0x67, 0x69, 0x66, 0x74, 0x73, 0x73, 0x74, 0x65, 0x76, 0x65, 0x2d, + 0x6c, 0x69, 0x6e, 0x6b, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x7d, 0x29, 0x3b, 0x0a, + 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x28, 0x31, 0x39, 0x39, 0x46, 0x41, + 0x51, 0x3c, 0x2f, 0x72, 0x6f, 0x67, 0x65, 0x72, 0x66, 0x72, 0x61, 0x6e, 0x6b, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x32, 0x38, 0x70, 0x78, 0x3b, 0x66, 0x65, 0x65, + 0x64, 0x73, 0x3c, 0x68, 0x31, 0x3e, 0x3c, 0x73, 0x63, 0x6f, 0x74, 0x74, 0x74, + 0x65, 0x73, 0x74, 0x73, 0x32, 0x32, 0x70, 0x78, 0x3b, 0x64, 0x72, 0x69, 0x6e, + 0x6b, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x6c, 0x65, 0x77, 0x69, 0x73, 0x73, 0x68, + 0x61, 0x6c, 0x6c, 0x23, 0x30, 0x33, 0x39, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x64, 0x77, 0x61, 0x73, 0x74, 0x65, 0x30, 0x30, 0x70, + 0x78, 0x3b, 0x6a, 0x61, 0x3a, 0xe3, 0x82, 0x73, 0x69, 0x6d, 0x6f, 0x6e, 0x3c, + 0x66, 0x6f, 0x6e, 0x74, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x6d, 0x65, 0x65, 0x74, + 0x73, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x68, 0x65, 0x61, 0x70, 0x74, 0x69, + 0x67, 0x68, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x29, 0x20, 0x21, 0x3d, 0x20, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x63, 0x6c, 0x69, 0x70, 0x73, 0x72, 0x6f, 0x6f, + 0x6d, 0x73, 0x6f, 0x6e, 0x6b, 0x65, 0x79, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x6d, + 0x61, 0x69, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x66, 0x75, 0x6e, 0x6e, 0x79, 0x74, 0x72, 0x65, 0x65, 0x73, 0x63, 0x6f, + 0x6d, 0x2f, 0x22, 0x31, 0x2e, 0x6a, 0x70, 0x67, 0x77, 0x6d, 0x6f, 0x64, 0x65, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x54, 0x41, 0x52, 0x54, 0x6c, 0x65, 0x66, + 0x74, 0x20, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x29, + 0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x76, 0x69, 0x72, 0x75, + 0x73, 0x63, 0x68, 0x61, 0x69, 0x72, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x77, 0x6f, + 0x72, 0x73, 0x74, 0x50, 0x61, 0x67, 0x65, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x3c, 0x21, 0x2d, 0x2d, 0x0a, 0x6f, 0x2d, 0x63, + 0x61, 0x63, 0x66, 0x69, 0x72, 0x6d, 0x73, 0x74, 0x6f, 0x75, 0x72, 0x73, 0x2c, + 0x30, 0x30, 0x30, 0x20, 0x61, 0x73, 0x69, 0x61, 0x6e, 0x69, 0x2b, 0x2b, 0x29, + 0x7b, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x27, 0x29, 0x5b, 0x30, 0x5d, 0x69, 0x64, + 0x3d, 0x31, 0x30, 0x62, 0x6f, 0x74, 0x68, 0x3b, 0x6d, 0x65, 0x6e, 0x75, 0x20, + 0x2e, 0x32, 0x2e, 0x6d, 0x69, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x6b, 0x65, 0x76, + 0x69, 0x6e, 0x63, 0x6f, 0x61, 0x63, 0x68, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x62, + 0x72, 0x75, 0x63, 0x65, 0x32, 0x2e, 0x6a, 0x70, 0x67, 0x55, 0x52, 0x4c, 0x29, + 0x2b, 0x2e, 0x6a, 0x70, 0x67, 0x7c, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x68, 0x61, 0x72, 0x72, 0x79, 0x31, 0x32, 0x30, 0x22, 0x20, + 0x73, 0x77, 0x65, 0x65, 0x74, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x64, 0x69, 0x65, 0x67, 0x6f, 0x70, 0x61, 0x67, 0x65, 0x20, 0x73, + 0x77, 0x69, 0x73, 0x73, 0x2d, 0x2d, 0x3e, 0x0a, 0x0a, 0x23, 0x66, 0x66, 0x66, + 0x3b, 0x22, 0x3e, 0x4c, 0x6f, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x74, 0x72, + 0x65, 0x61, 0x74, 0x73, 0x68, 0x65, 0x65, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, + 0x31, 0x34, 0x70, 0x78, 0x3b, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x64, 0x6a, 0x61, 0x3a, 0xe3, 0x83, 0x69, + 0x64, 0x3d, 0x22, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x77, 0x6f, 0x72, 0x73, + 0x65, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x73, + 0x3a, 0x34, 0x38, 0x5a, 0x3c, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x72, 0x75, 0x72, + 0x61, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x62, + 0x61, 0x6b, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x70, 0x73, 0x3d, 0x20, 0x22, 0x22, + 0x3b, 0x70, 0x68, 0x70, 0x22, 0x3e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x33, + 0x70, 0x78, 0x3b, 0x62, 0x72, 0x69, 0x61, 0x6e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, + 0x73, 0x69, 0x7a, 0x65, 0x3d, 0x6f, 0x3d, 0x25, 0x32, 0x46, 0x20, 0x6a, 0x6f, + 0x69, 0x6e, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x69, + 0x6d, 0x67, 0x22, 0x3e, 0x2c, 0x20, 0x66, 0x6a, 0x73, 0x69, 0x6d, 0x67, 0x22, + 0x20, 0x22, 0x29, 0x5b, 0x30, 0x5d, 0x4d, 0x54, 0x6f, 0x70, 0x42, 0x54, 0x79, + 0x70, 0x65, 0x22, 0x6e, 0x65, 0x77, 0x6c, 0x79, 0x44, 0x61, 0x6e, 0x73, 0x6b, + 0x63, 0x7a, 0x65, 0x63, 0x68, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x6b, 0x6e, 0x6f, + 0x77, 0x73, 0x3c, 0x2f, 0x68, 0x35, 0x3e, 0x66, 0x61, 0x71, 0x22, 0x3e, 0x7a, + 0x68, 0x2d, 0x63, 0x6e, 0x31, 0x30, 0x29, 0x3b, 0x0a, 0x2d, 0x31, 0x22, 0x29, + 0x3b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x62, 0x6c, 0x75, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x6c, 0x79, 0x64, 0x61, 0x76, 0x69, 0x73, 0x2e, 0x6a, 0x73, 0x27, 0x3b, + 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x73, 0x74, 0x65, 0x65, 0x6c, 0x20, 0x79, 0x6f, + 0x75, 0x20, 0x68, 0x32, 0x3e, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6a, + 0x65, 0x73, 0x75, 0x73, 0x31, 0x30, 0x30, 0x25, 0x20, 0x6d, 0x65, 0x6e, 0x75, + 0x2e, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x77, 0x61, 0x6c, 0x65, 0x73, 0x72, 0x69, + 0x73, 0x6b, 0x73, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x64, 0x69, 0x6e, 0x67, + 0x62, 0x2d, 0x6c, 0x69, 0x6b, 0x74, 0x65, 0x61, 0x63, 0x68, 0x67, 0x69, 0x66, + 0x22, 0x20, 0x76, 0x65, 0x67, 0x61, 0x73, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x65, + 0x65, 0x73, 0x74, 0x69, 0x73, 0x68, 0x71, 0x69, 0x70, 0x73, 0x75, 0x6f, 0x6d, + 0x69, 0x73, 0x6f, 0x62, 0x72, 0x65, 0x64, 0x65, 0x73, 0x64, 0x65, 0x65, 0x6e, + 0x74, 0x72, 0x65, 0x74, 0x6f, 0x64, 0x6f, 0x73, 0x70, 0x75, 0x65, 0x64, 0x65, + 0x61, 0xc3, 0xb1, 0x6f, 0x73, 0x65, 0x73, 0x74, 0xc3, 0xa1, 0x74, 0x69, 0x65, + 0x6e, 0x65, 0x68, 0x61, 0x73, 0x74, 0x61, 0x6f, 0x74, 0x72, 0x6f, 0x73, 0x70, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x75, 0x65, 0x76, + 0x6f, 0x68, 0x61, 0x63, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6d, 0x69, + 0x73, 0x6d, 0x6f, 0x6d, 0x65, 0x6a, 0x6f, 0x72, 0x6d, 0x75, 0x6e, 0x64, 0x6f, + 0x61, 0x71, 0x75, 0xc3, 0xad, 0x64, 0xc3, 0xad, 0x61, 0x73, 0x73, 0xc3, 0xb3, + 0x6c, 0x6f, 0x61, 0x79, 0x75, 0x64, 0x61, 0x66, 0x65, 0x63, 0x68, 0x61, 0x74, + 0x6f, 0x64, 0x61, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x65, 0x6e, 0x6f, + 0x73, 0x64, 0x61, 0x74, 0x6f, 0x73, 0x6f, 0x74, 0x72, 0x61, 0x73, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6d, 0x75, 0x63, 0x68, 0x6f, 0x61, 0x68, 0x6f, 0x72, 0x61, + 0x6c, 0x75, 0x67, 0x61, 0x72, 0x6d, 0x61, 0x79, 0x6f, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x73, 0x68, 0x6f, 0x72, 0x61, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6e, 0x74, 0x65, 0x73, 0x66, 0x6f, 0x74, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x61, + 0x73, 0x70, 0x61, 0xc3, 0xad, 0x73, 0x6e, 0x75, 0x65, 0x76, 0x61, 0x73, 0x61, + 0x6c, 0x75, 0x64, 0x66, 0x6f, 0x72, 0x6f, 0x73, 0x6d, 0x65, 0x64, 0x69, 0x6f, + 0x71, 0x75, 0x69, 0x65, 0x6e, 0x6d, 0x65, 0x73, 0x65, 0x73, 0x70, 0x6f, 0x64, + 0x65, 0x72, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x73, 0x65, 0x72, 0xc3, 0xa1, 0x76, + 0x65, 0x63, 0x65, 0x73, 0x64, 0x65, 0x63, 0x69, 0x72, 0x6a, 0x6f, 0x73, 0xc3, + 0xa9, 0x65, 0x73, 0x74, 0x61, 0x72, 0x76, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x72, + 0x75, 0x70, 0x6f, 0x68, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x6c, 0x6c, 0x6f, 0x73, + 0x74, 0x65, 0x6e, 0x67, 0x6f, 0x61, 0x6d, 0x69, 0x67, 0x6f, 0x63, 0x6f, 0x73, + 0x61, 0x73, 0x6e, 0x69, 0x76, 0x65, 0x6c, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6d, + 0x69, 0x73, 0x6d, 0x61, 0x61, 0x69, 0x72, 0x65, 0x73, 0x6a, 0x75, 0x6c, 0x69, + 0x6f, 0x74, 0x65, 0x6d, 0x61, 0x73, 0x68, 0x61, 0x63, 0x69, 0x61, 0x66, 0x61, + 0x76, 0x6f, 0x72, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x6c, 0x69, 0x62, 0x72, 0x65, + 0x70, 0x75, 0x6e, 0x74, 0x6f, 0x62, 0x75, 0x65, 0x6e, 0x6f, 0x61, 0x75, 0x74, + 0x6f, 0x72, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x62, 0x75, 0x65, 0x6e, 0x61, 0x74, + 0x65, 0x78, 0x74, 0x6f, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x73, 0x61, 0x62, 0x65, + 0x72, 0x6c, 0x69, 0x73, 0x74, 0x61, 0x6c, 0x75, 0x65, 0x67, 0x6f, 0x63, 0xc3, + 0xb3, 0x6d, 0x6f, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x6a, 0x75, 0x65, 0x67, 0x6f, + 0x70, 0x65, 0x72, 0xc3, 0xba, 0x68, 0x61, 0x62, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x79, 0x6e, 0x75, 0x6e, 0x63, 0x61, 0x6d, 0x75, 0x6a, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x6f, 0x72, 0x66, 0x75, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x62, 0x72, + 0x6f, 0x67, 0x75, 0x73, 0x74, 0x61, 0x69, 0x67, 0x75, 0x61, 0x6c, 0x76, 0x6f, + 0x74, 0x6f, 0x73, 0x63, 0x61, 0x73, 0x6f, 0x73, 0x67, 0x75, 0xc3, 0xad, 0x61, + 0x70, 0x75, 0x65, 0x64, 0x6f, 0x73, 0x6f, 0x6d, 0x6f, 0x73, 0x61, 0x76, 0x69, + 0x73, 0x6f, 0x75, 0x73, 0x74, 0x65, 0x64, 0x64, 0x65, 0x62, 0x65, 0x6e, 0x6e, + 0x6f, 0x63, 0x68, 0x65, 0x62, 0x75, 0x73, 0x63, 0x61, 0x66, 0x61, 0x6c, 0x74, + 0x61, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x72, 0x69, 0x65, 0x64, 0x69, + 0x63, 0x68, 0x6f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x63, 0x6c, 0x61, 0x76, 0x65, + 0x63, 0x61, 0x73, 0x61, 0x73, 0x6c, 0x65, 0xc3, 0xb3, 0x6e, 0x70, 0x6c, 0x61, + 0x7a, 0x6f, 0x6c, 0x61, 0x72, 0x67, 0x6f, 0x6f, 0x62, 0x72, 0x61, 0x73, 0x76, + 0x69, 0x73, 0x74, 0x61, 0x61, 0x70, 0x6f, 0x79, 0x6f, 0x6a, 0x75, 0x6e, 0x74, + 0x6f, 0x74, 0x72, 0x61, 0x74, 0x61, 0x76, 0x69, 0x73, 0x74, 0x6f, 0x63, 0x72, + 0x65, 0x61, 0x72, 0x63, 0x61, 0x6d, 0x70, 0x6f, 0x68, 0x65, 0x6d, 0x6f, 0x73, + 0x63, 0x69, 0x6e, 0x63, 0x6f, 0x63, 0x61, 0x72, 0x67, 0x6f, 0x70, 0x69, 0x73, + 0x6f, 0x73, 0x6f, 0x72, 0x64, 0x65, 0x6e, 0x68, 0x61, 0x63, 0x65, 0x6e, 0xc3, + 0xa1, 0x72, 0x65, 0x61, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x72, + 0x6f, 0x63, 0x65, 0x72, 0x63, 0x61, 0x70, 0x75, 0x65, 0x64, 0x61, 0x70, 0x61, + 0x70, 0x65, 0x6c, 0x6d, 0x65, 0x6e, 0x6f, 0x72, 0xc3, 0xba, 0x74, 0x69, 0x6c, + 0x63, 0x6c, 0x61, 0x72, 0x6f, 0x6a, 0x6f, 0x72, 0x67, 0x65, 0x63, 0x61, 0x6c, + 0x6c, 0x65, 0x70, 0x6f, 0x6e, 0x65, 0x72, 0x74, 0x61, 0x72, 0x64, 0x65, 0x6e, + 0x61, 0x64, 0x69, 0x65, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x73, 0x69, 0x67, 0x75, + 0x65, 0x65, 0x6c, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6c, 0x6f, 0x63, 0x6f, + 0x63, 0x68, 0x65, 0x6d, 0x6f, 0x74, 0x6f, 0x73, 0x6d, 0x61, 0x64, 0x72, 0x65, + 0x63, 0x6c, 0x61, 0x73, 0x65, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x69, 0xc3, + 0xb1, 0x6f, 0x71, 0x75, 0x65, 0x64, 0x61, 0x70, 0x61, 0x73, 0x61, 0x72, 0x62, + 0x61, 0x6e, 0x63, 0x6f, 0x68, 0x69, 0x6a, 0x6f, 0x73, 0x76, 0x69, 0x61, 0x6a, + 0x65, 0x70, 0x61, 0x62, 0x6c, 0x6f, 0xc3, 0xa9, 0x73, 0x74, 0x65, 0x76, 0x69, + 0x65, 0x6e, 0x65, 0x72, 0x65, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x6a, 0x61, 0x72, + 0x66, 0x6f, 0x6e, 0x64, 0x6f, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x6e, 0x6f, 0x72, + 0x74, 0x65, 0x6c, 0x65, 0x74, 0x72, 0x61, 0x63, 0x61, 0x75, 0x73, 0x61, 0x74, + 0x6f, 0x6d, 0x61, 0x72, 0x6d, 0x61, 0x6e, 0x6f, 0x73, 0x6c, 0x75, 0x6e, 0x65, + 0x73, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x61, 0x76, 0x65, + 0x6e, 0x64, 0x6f, 0x70, 0x65, 0x73, 0x61, 0x72, 0x74, 0x69, 0x70, 0x6f, 0x73, + 0x74, 0x65, 0x6e, 0x67, 0x61, 0x6d, 0x61, 0x72, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x76, 0x61, 0x70, 0x61, 0x64, 0x72, 0x65, 0x75, 0x6e, 0x69, 0x64, 0x6f, 0x76, + 0x61, 0x6d, 0x6f, 0x73, 0x7a, 0x6f, 0x6e, 0x61, 0x73, 0x61, 0x6d, 0x62, 0x6f, + 0x73, 0x62, 0x61, 0x6e, 0x64, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x61, 0x61, 0x62, + 0x75, 0x73, 0x6f, 0x6d, 0x75, 0x63, 0x68, 0x61, 0x73, 0x75, 0x62, 0x69, 0x72, + 0x72, 0x69, 0x6f, 0x6a, 0x61, 0x76, 0x69, 0x76, 0x69, 0x72, 0x67, 0x72, 0x61, + 0x64, 0x6f, 0x63, 0x68, 0x69, 0x63, 0x61, 0x61, 0x6c, 0x6c, 0xc3, 0xad, 0x6a, + 0x6f, 0x76, 0x65, 0x6e, 0x64, 0x69, 0x63, 0x68, 0x61, 0x65, 0x73, 0x74, 0x61, + 0x6e, 0x74, 0x61, 0x6c, 0x65, 0x73, 0x73, 0x61, 0x6c, 0x69, 0x72, 0x73, 0x75, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x66, 0x69, 0x6e, 0x65, 0x73, + 0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x62, 0x75, 0x73, 0x63, 0x6f, 0xc3, 0xa9, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6e, 0x65, 0x67, 0x72, 0x6f, 0x70, + 0x6c, 0x61, 0x7a, 0x61, 0x68, 0x75, 0x6d, 0x6f, 0x72, 0x70, 0x61, 0x67, 0x61, + 0x72, 0x6a, 0x75, 0x6e, 0x74, 0x61, 0x64, 0x6f, 0x62, 0x6c, 0x65, 0x69, 0x73, + 0x6c, 0x61, 0x73, 0x62, 0x6f, 0x6c, 0x73, 0x61, 0x62, 0x61, 0xc3, 0xb1, 0x6f, + 0x68, 0x61, 0x62, 0x6c, 0x61, 0x6c, 0x75, 0x63, 0x68, 0x61, 0xc3, 0x81, 0x72, + 0x65, 0x61, 0x64, 0x69, 0x63, 0x65, 0x6e, 0x6a, 0x75, 0x67, 0x61, 0x72, 0x6e, + 0x6f, 0x74, 0x61, 0x73, 0x76, 0x61, 0x6c, 0x6c, 0x65, 0x61, 0x6c, 0x6c, 0xc3, + 0xa1, 0x63, 0x61, 0x72, 0x67, 0x61, 0x64, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x62, + 0x61, 0x6a, 0x6f, 0x65, 0x73, 0x74, 0xc3, 0xa9, 0x67, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x6d, 0x61, 0x72, 0x69, 0x6f, 0x66, 0x69, 0x72, + 0x6d, 0x61, 0x63, 0x6f, 0x73, 0x74, 0x6f, 0x66, 0x69, 0x63, 0x68, 0x61, 0x70, + 0x6c, 0x61, 0x74, 0x61, 0x68, 0x6f, 0x67, 0x61, 0x72, 0x61, 0x72, 0x74, 0x65, + 0x73, 0x6c, 0x65, 0x79, 0x65, 0x73, 0x61, 0x71, 0x75, 0x65, 0x6c, 0x6d, 0x75, + 0x73, 0x65, 0x6f, 0x62, 0x61, 0x73, 0x65, 0x73, 0x70, 0x6f, 0x63, 0x6f, 0x73, + 0x6d, 0x69, 0x74, 0x61, 0x64, 0x63, 0x69, 0x65, 0x6c, 0x6f, 0x63, 0x68, 0x69, + 0x63, 0x6f, 0x6d, 0x69, 0x65, 0x64, 0x6f, 0x67, 0x61, 0x6e, 0x61, 0x72, 0x73, + 0x61, 0x6e, 0x74, 0x6f, 0x65, 0x74, 0x61, 0x70, 0x61, 0x64, 0x65, 0x62, 0x65, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x61, 0x72, 0x65, 0x64, 0x65, 0x73, 0x73, 0x69, + 0x65, 0x74, 0x65, 0x63, 0x6f, 0x72, 0x74, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x61, + 0x64, 0x75, 0x64, 0x61, 0x73, 0x64, 0x65, 0x73, 0x65, 0x6f, 0x76, 0x69, 0x65, + 0x6a, 0x6f, 0x64, 0x65, 0x73, 0x65, 0x61, 0x61, 0x67, 0x75, 0x61, 0x73, 0x26, + 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x61, 0x6e, 0x6e, 0x65, + 0x72, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x6d, + 0x65, 0x64, 0x69, 0x75, 0x6d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x73, 0x63, 0x72, 0x65, + 0x65, 0x6e, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x70, 0x72, 0x69, 0x6e, 0x67, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6d, 0x6f, + 0x62, 0x69, 0x6c, 0x65, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x70, 0x68, 0x6f, + 0x74, 0x6f, 0x73, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x73, 0x6f, 0x63, 0x69, 0x61, + 0x6c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x66, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x72, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x65, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x6c, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, + 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x70, + 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x6c, 0x65, 0x74, 0x74, 0x65, + 0x72, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x75, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x73, 0x73, 0x63, 0x68, + 0x6f, 0x6f, 0x6c, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x73, 0x68, 0x61, 0x64, + 0x6f, 0x77, 0x64, 0x65, 0x62, 0x61, 0x74, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6c, 0x65, 0x61, 0x67, 0x75, 0x65, 0x63, + 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6e, 0x6f, + 0x74, 0x69, 0x63, 0x65, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x71, 0x75, 0x61, 0x72, + 0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x77, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x46, 0x72, + 0x61, 0x6e, 0x63, 0x65, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x74, 0x72, + 0x6f, 0x6e, 0x67, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x4c, 0x6f, 0x6e, 0x64, + 0x6f, 0x6e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65, + 0x64, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x73, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x6b, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x66, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x3e, + 0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x76, + 0x61, 0x6c, 0x6c, 0x65, 0x79, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x73, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x76, 0x69, + 0x73, 0x75, 0x61, 0x6c, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x6d, 0x75, 0x73, 0x65, + 0x75, 0x6d, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6d, 0x6f, 0x73, 0x74, 0x6c, 0x79, + 0x6d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x63, 0x68, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x75, 0x72, 0x76, 0x65, 0x79, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x6d, 0x6f, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0x6d, 0x6f, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x65, + 0x78, 0x69, 0x73, 0x74, 0x73, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x45, 0x75, + 0x72, 0x6f, 0x70, 0x65, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x6c, 0x65, 0x67, + 0x61, 0x63, 0x79, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x65, 0x6e, 0x6f, 0x75, + 0x67, 0x68, 0x63, 0x61, 0x72, 0x65, 0x65, 0x72, 0x61, 0x6e, 0x73, 0x77, 0x65, + 0x72, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, + 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x74, 0x6f, + 0x70, 0x69, 0x63, 0x73, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x66, 0x61, 0x74, + 0x68, 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x6d, 0x70, + 0x6c, 0x79, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x65, 0x73, 0x63, 0x61, 0x70, + 0x65, 0x63, 0x68, 0x6f, 0x73, 0x65, 0x6e, 0x63, 0x68, 0x75, 0x72, 0x63, 0x68, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x63, + 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x65, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x73, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x73, + 0x69, 0x6c, 0x76, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x62, 0x72, 0x6f, + 0x77, 0x73, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x77, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, + 0x6e, 0x6f, 0x77, 0x72, 0x61, 0x70, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x61, + 0x66, 0x65, 0x74, 0x79, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x70, 0x69, + 0x72, 0x69, 0x74, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x70, 0x72, 0x65, + 0x61, 0x64, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6e, 0x65, 0x65, 0x64, 0x65, + 0x64, 0x72, 0x75, 0x73, 0x73, 0x69, 0x61, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x62, + 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x63, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2d, 0x62, 0x61, 0x73, + 0x65, 0x64, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x64, + 0x68, 0x65, 0x6c, 0x70, 0x65, 0x64, 0x43, 0x68, 0x75, 0x72, 0x63, 0x68, 0x69, + 0x6d, 0x70, 0x61, 0x63, 0x74, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x61, 0x6c, + 0x77, 0x61, 0x79, 0x73, 0x6c, 0x6f, 0x67, 0x6f, 0x22, 0x20, 0x62, 0x6f, 0x74, + 0x74, 0x6f, 0x6d, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x3e, 0x29, 0x7b, 0x76, 0x61, + 0x72, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6f, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, + 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x67, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x62, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x62, 0x65, 0x61, 0x75, 0x74, + 0x79, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x66, 0x6f, 0x72, 0x67, 0x6f, 0x74, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, + 0x6c, 0x6d, 0x6f, 0x73, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x62, 0x69, + 0x6c, 0x65, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x75, 0x70, 0x70, 0x6c, + 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x76, 0x69, 0x65, 0x77, 0x65, 0x64, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x63, + 0x6f, 0x75, 0x72, 0x73, 0x65, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x73, + 0x6c, 0x61, 0x6e, 0x64, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x63, 0x6f, 0x6f, + 0x6b, 0x69, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x6d, 0x61, 0x7a, + 0x6f, 0x6e, 0x6d, 0x6f, 0x64, 0x65, 0x72, 0x6e, 0x61, 0x64, 0x76, 0x69, 0x63, + 0x65, 0x69, 0x6e, 0x3c, 0x2f, 0x61, 0x3e, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x42, + 0x45, 0x47, 0x49, 0x4e, 0x20, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x73, 0x6c, 0x61, + 0x6e, 0x64, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x45, 0x6d, 0x70, 0x69, 0x72, + 0x65, 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6e, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x6d, + 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2e, 0x0a, + 0x0a, 0x4f, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x6d, 0x65, 0x6e, + 0x75, 0x22, 0x3e, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x61, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, + 0x73, 0x6b, 0x69, 0x6c, 0x6c, 0x73, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x77, 0x65, + 0x65, 0x6b, 0x6c, 0x79, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x62, 0x65, 0x68, + 0x69, 0x6e, 0x64, 0x64, 0x6f, 0x63, 0x74, 0x6f, 0x72, 0x6c, 0x6f, 0x67, 0x67, + 0x65, 0x64, 0x75, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, + 0x2f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x73, + 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x64, 0x33, 0x30, 0x30, 0x70, 0x78, 0x7c, 0x63, 0x61, + 0x6e, 0x61, 0x64, 0x61, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x72, 0x61, 0x7a, + 0x69, 0x6c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x6c, 0x6f, 0x67, 0x6f, 0x22, + 0x3e, 0x62, 0x65, 0x79, 0x6f, 0x6e, 0x64, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x6d, + 0x61, 0x72, 0x69, 0x6e, 0x65, 0x46, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x63, 0x61, + 0x6d, 0x65, 0x72, 0x61, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0a, 0x5f, 0x66, 0x6f, + 0x72, 0x6d, 0x22, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x73, 0x74, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x2e, 0x67, 0x69, 0x66, 0x22, + 0x20, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x4f, 0x78, 0x66, 0x6f, 0x72, 0x64, 0x73, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x75, 0x72, 0x76, 0x69, 0x76, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x66, 0x65, + 0x6d, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x69, 0x7a, + 0x65, 0x3d, 0x22, 0x61, 0x70, 0x70, 0x65, 0x61, 0x6c, 0x74, 0x65, 0x78, 0x74, + 0x22, 0x3e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x74, 0x68, 0x61, 0x6e, 0x6b, + 0x73, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, + 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x41, + 0x66, 0x72, 0x69, 0x63, 0x61, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x72, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x3c, 0x62, 0x72, + 0x20, 0x2f, 0x3e, 0x77, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x73, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, + 0x3b, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x77, 0x72, 0x61, 0x70, 0x22, 0x3e, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x63, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x6d, 0x69, + 0x6e, 0x75, 0x74, 0x65, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x73, 0x31, 0x35, 0x30, 0x70, 0x78, 0x7c, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x31, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x70, 0x72, + 0x69, 0x6e, 0x63, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x2e, 0x70, 0x6e, + 0x67, 0x22, 0x20, 0x66, 0x6f, 0x72, 0x75, 0x6d, 0x2e, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x73, 0x73, 0x6f, 0x75, 0x6e, 0x64, + 0x73, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x26, + 0x61, 0x6d, 0x70, 0x3b, 0x20, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2e, 0x20, + 0x57, 0x69, 0x74, 0x68, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x73, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x74, 0x6a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x61, 0x6e, 0x6e, 0x75, 0x61, + 0x6c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x62, 0x6f, 0x75, 0x67, 0x68, 0x74, + 0x66, 0x61, 0x6d, 0x6f, 0x75, 0x73, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x6c, + 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x69, 0x73, + 0x72, 0x61, 0x65, 0x6c, 0x73, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x63, + 0x69, 0x64, 0x65, 0x68, 0x6f, 0x6d, 0x65, 0x22, 0x3e, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x62, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x70, 0x69, 0x65, 0x63, 0x65, 0x73, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x64, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x3c, 0x72, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x2d, 0x2d, + 0x26, 0x67, 0x74, 0x3b, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x73, 0x65, 0x78, + 0x75, 0x61, 0x6c, 0x62, 0x75, 0x72, 0x65, 0x61, 0x75, 0x2e, 0x6a, 0x70, 0x67, + 0x22, 0x20, 0x31, 0x30, 0x2c, 0x30, 0x30, 0x30, 0x6f, 0x62, 0x74, 0x61, 0x69, + 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x73, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x63, 0x6f, 0x6d, 0x65, 0x64, 0x79, 0x6d, + 0x65, 0x6e, 0x75, 0x22, 0x20, 0x6c, 0x79, 0x72, 0x69, 0x63, 0x73, 0x74, 0x6f, + 0x64, 0x61, 0x79, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x65, 0x64, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x46, 0x61, 0x6d, 0x69, + 0x6c, 0x79, 0x6c, 0x6f, 0x6f, 0x6b, 0x65, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x74, 0x75, 0x72, 0x6b, 0x65, 0x79, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x66, + 0x6f, 0x72, 0x65, 0x73, 0x74, 0x67, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x65, 0x6c, + 0x73, 0x65, 0x7b, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x67, + 0x3c, 0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x2e, 0x66, 0x61, 0x73, 0x74, 0x65, 0x72, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x31, 0x30, 0x70, 0x78, 0x20, 0x30, 0x70, + 0x72, 0x61, 0x67, 0x6d, 0x61, 0x66, 0x72, 0x69, 0x64, 0x61, 0x79, 0x6a, 0x75, + 0x6e, 0x69, 0x6f, 0x72, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x64, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x35, 0x2c, 0x30, 0x30, 0x30, 0x20, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x3e, 0x62, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x66, 0x6f, 0x72, 0x75, 0x6d, 0x73, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x66, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x72, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x28, 0x61, 0x70, 0x70, 0x65, 0x61, + 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e, + 0x62, 0x6f, 0x64, 0x79, 0x22, 0x3e, 0x0a, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x54, + 0x68, 0x6f, 0x75, 0x67, 0x68, 0x73, 0x65, 0x65, 0x69, 0x6e, 0x67, 0x6a, 0x65, + 0x72, 0x73, 0x65, 0x79, 0x4e, 0x65, 0x77, 0x73, 0x3c, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x65, 0x78, 0x70, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6a, 0x75, + 0x72, 0x79, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x43, 0x6f, 0x6f, 0x6b, 0x69, + 0x65, 0x53, 0x54, 0x41, 0x52, 0x54, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x6e, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x70, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x62, 0x6f, + 0x78, 0x22, 0x3e, 0x0a, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x44, 0x61, + 0x76, 0x69, 0x64, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x70, 0x72, 0x69, 0x6c, + 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x6d, 0x6f, 0x72, 0x65, 0x22, 0x3e, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x73, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x63, 0x61, + 0x6d, 0x70, 0x75, 0x73, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x7c, 0x7c, 0x20, + 0x5b, 0x5d, 0x3b, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x2e, 0x67, 0x75, 0x69, 0x74, + 0x61, 0x72, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x73, 0x68, 0x6f, 0x77, 0x65, 0x64, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x2e, 0x70, 0x68, 0x70, 0x22, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x73, 0x77, 0x69, 0x6c, 0x73, 0x6f, 0x6e, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x73, 0x72, 0x65, 0x6c, 0x69, 0x65, 0x66, 0x73, 0x77, 0x65, + 0x64, 0x65, 0x6e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x61, 0x73, 0x69, + 0x6c, 0x79, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x0a, 0x0a, 0x57, 0x68, 0x69, 0x6c, 0x74, 0x61, 0x79, 0x6c, 0x6f, 0x72, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x72, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x66, + 0x72, 0x65, 0x6e, 0x63, 0x68, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x22, 0x29, + 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x62, 0x75, 0x79, + 0x69, 0x6e, 0x67, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x6f, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x35, 0x70, 0x78, 0x3b, 0x22, 0x3e, + 0x76, 0x73, 0x70, 0x61, 0x63, 0x65, 0x70, 0x6f, 0x73, 0x74, 0x65, 0x72, 0x6d, + 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x66, 0x66, 0x65, 0x65, 0x6d, 0x61, + 0x72, 0x74, 0x69, 0x6e, 0x6d, 0x61, 0x74, 0x75, 0x72, 0x65, 0x68, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x61, 0x76, 0x3e, 0x6b, 0x61, 0x6e, 0x73, + 0x61, 0x73, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3e, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x30, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x20, + 0x0a, 0x0a, 0x49, 0x6e, 0x20, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x73, 0x6b, 0x69, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x6a, 0x6f, 0x72, + 0x64, 0x61, 0x6e, 0x42, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x20, 0x2d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0x6e, 0x65, 0x77, 0x73, 0x22, 0x3e, 0x30, 0x31, 0x2e, 0x6a, 0x70, 0x67, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6d, + 0x69, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x65, 0x6e, 0x69, 0x6f, 0x72, 0x49, 0x53, + 0x42, 0x4e, 0x20, 0x30, 0x30, 0x2c, 0x30, 0x30, 0x30, 0x20, 0x67, 0x75, 0x69, + 0x64, 0x65, 0x73, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x2e, 0x78, 0x6d, 0x6c, 0x22, + 0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x68, 0x74, 0x6d, 0x6c, + 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x72, 0x65, 0x67, 0x45, 0x78, 0x70, 0x3a, + 0x68, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x76, 0x69, + 0x72, 0x67, 0x69, 0x6e, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x73, 0x3c, 0x2f, 0x74, + 0x72, 0x3e, 0x0d, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x0a, 0x09, 0x76, 0x61, + 0x72, 0x20, 0x3e, 0x27, 0x29, 0x3b, 0x0a, 0x09, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x62, 0x61, 0x68, 0x61, 0x73, 0x61, + 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x67, 0x61, 0x6c, 0x65, 0x67, 0x6f, 0x6d, + 0x61, 0x67, 0x79, 0x61, 0x72, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x73, 0x72, + 0x70, 0x73, 0x6b, 0x69, 0xd8, 0xb1, 0xd8, 0xaf, 0xd9, 0x88, 0xe4, 0xb8, 0xad, + 0xe6, 0x96, 0x87, 0xe7, 0xae, 0x80, 0xe4, 0xbd, 0x93, 0xe7, 0xb9, 0x81, 0xe9, + 0xab, 0x94, 0xe4, 0xbf, 0xa1, 0xe6, 0x81, 0xaf, 0xe4, 0xb8, 0xad, 0xe5, 0x9b, + 0xbd, 0xe6, 0x88, 0x91, 0xe4, 0xbb, 0xac, 0xe4, 0xb8, 0x80, 0xe4, 0xb8, 0xaa, + 0xe5, 0x85, 0xac, 0xe5, 0x8f, 0xb8, 0xe7, 0xae, 0xa1, 0xe7, 0x90, 0x86, 0xe8, + 0xae, 0xba, 0xe5, 0x9d, 0x9b, 0xe5, 0x8f, 0xaf, 0xe4, 0xbb, 0xa5, 0xe6, 0x9c, + 0x8d, 0xe5, 0x8a, 0xa1, 0xe6, 0x97, 0xb6, 0xe9, 0x97, 0xb4, 0xe4, 0xb8, 0xaa, + 0xe4, 0xba, 0xba, 0xe4, 0xba, 0xa7, 0xe5, 0x93, 0x81, 0xe8, 0x87, 0xaa, 0xe5, + 0xb7, 0xb1, 0xe4, 0xbc, 0x81, 0xe4, 0xb8, 0x9a, 0xe6, 0x9f, 0xa5, 0xe7, 0x9c, + 0x8b, 0xe5, 0xb7, 0xa5, 0xe4, 0xbd, 0x9c, 0xe8, 0x81, 0x94, 0xe7, 0xb3, 0xbb, + 0xe6, 0xb2, 0xa1, 0xe6, 0x9c, 0x89, 0xe7, 0xbd, 0x91, 0xe7, 0xab, 0x99, 0xe6, + 0x89, 0x80, 0xe6, 0x9c, 0x89, 0xe8, 0xaf, 0x84, 0xe8, 0xae, 0xba, 0xe4, 0xb8, + 0xad, 0xe5, 0xbf, 0x83, 0xe6, 0x96, 0x87, 0xe7, 0xab, 0xa0, 0xe7, 0x94, 0xa8, + 0xe6, 0x88, 0xb7, 0xe9, 0xa6, 0x96, 0xe9, 0xa1, 0xb5, 0xe4, 0xbd, 0x9c, 0xe8, + 0x80, 0x85, 0xe6, 0x8a, 0x80, 0xe6, 0x9c, 0xaf, 0xe9, 0x97, 0xae, 0xe9, 0xa2, + 0x98, 0xe7, 0x9b, 0xb8, 0xe5, 0x85, 0xb3, 0xe4, 0xb8, 0x8b, 0xe8, 0xbd, 0xbd, + 0xe6, 0x90, 0x9c, 0xe7, 0xb4, 0xa2, 0xe4, 0xbd, 0xbf, 0xe7, 0x94, 0xa8, 0xe8, + 0xbd, 0xaf, 0xe4, 0xbb, 0xb6, 0xe5, 0x9c, 0xa8, 0xe7, 0xba, 0xbf, 0xe4, 0xb8, + 0xbb, 0xe9, 0xa2, 0x98, 0xe8, 0xb5, 0x84, 0xe6, 0x96, 0x99, 0xe8, 0xa7, 0x86, + 0xe9, 0xa2, 0x91, 0xe5, 0x9b, 0x9e, 0xe5, 0xa4, 0x8d, 0xe6, 0xb3, 0xa8, 0xe5, + 0x86, 0x8c, 0xe7, 0xbd, 0x91, 0xe7, 0xbb, 0x9c, 0xe6, 0x94, 0xb6, 0xe8, 0x97, + 0x8f, 0xe5, 0x86, 0x85, 0xe5, 0xae, 0xb9, 0xe6, 0x8e, 0xa8, 0xe8, 0x8d, 0x90, + 0xe5, 0xb8, 0x82, 0xe5, 0x9c, 0xba, 0xe6, 0xb6, 0x88, 0xe6, 0x81, 0xaf, 0xe7, + 0xa9, 0xba, 0xe9, 0x97, 0xb4, 0xe5, 0x8f, 0x91, 0xe5, 0xb8, 0x83, 0xe4, 0xbb, + 0x80, 0xe4, 0xb9, 0x88, 0xe5, 0xa5, 0xbd, 0xe5, 0x8f, 0x8b, 0xe7, 0x94, 0x9f, + 0xe6, 0xb4, 0xbb, 0xe5, 0x9b, 0xbe, 0xe7, 0x89, 0x87, 0xe5, 0x8f, 0x91, 0xe5, + 0xb1, 0x95, 0xe5, 0xa6, 0x82, 0xe6, 0x9e, 0x9c, 0xe6, 0x89, 0x8b, 0xe6, 0x9c, + 0xba, 0xe6, 0x96, 0xb0, 0xe9, 0x97, 0xbb, 0xe6, 0x9c, 0x80, 0xe6, 0x96, 0xb0, + 0xe6, 0x96, 0xb9, 0xe5, 0xbc, 0x8f, 0xe5, 0x8c, 0x97, 0xe4, 0xba, 0xac, 0xe6, + 0x8f, 0x90, 0xe4, 0xbe, 0x9b, 0xe5, 0x85, 0xb3, 0xe4, 0xba, 0x8e, 0xe6, 0x9b, + 0xb4, 0xe5, 0xa4, 0x9a, 0xe8, 0xbf, 0x99, 0xe4, 0xb8, 0xaa, 0xe7, 0xb3, 0xbb, + 0xe7, 0xbb, 0x9f, 0xe7, 0x9f, 0xa5, 0xe9, 0x81, 0x93, 0xe6, 0xb8, 0xb8, 0xe6, + 0x88, 0x8f, 0xe5, 0xb9, 0xbf, 0xe5, 0x91, 0x8a, 0xe5, 0x85, 0xb6, 0xe4, 0xbb, + 0x96, 0xe5, 0x8f, 0x91, 0xe8, 0xa1, 0xa8, 0xe5, 0xae, 0x89, 0xe5, 0x85, 0xa8, + 0xe7, 0xac, 0xac, 0xe4, 0xb8, 0x80, 0xe4, 0xbc, 0x9a, 0xe5, 0x91, 0x98, 0xe8, + 0xbf, 0x9b, 0xe8, 0xa1, 0x8c, 0xe7, 0x82, 0xb9, 0xe5, 0x87, 0xbb, 0xe7, 0x89, + 0x88, 0xe6, 0x9d, 0x83, 0xe7, 0x94, 0xb5, 0xe5, 0xad, 0x90, 0xe4, 0xb8, 0x96, + 0xe7, 0x95, 0x8c, 0xe8, 0xae, 0xbe, 0xe8, 0xae, 0xa1, 0xe5, 0x85, 0x8d, 0xe8, + 0xb4, 0xb9, 0xe6, 0x95, 0x99, 0xe8, 0x82, 0xb2, 0xe5, 0x8a, 0xa0, 0xe5, 0x85, + 0xa5, 0xe6, 0xb4, 0xbb, 0xe5, 0x8a, 0xa8, 0xe4, 0xbb, 0x96, 0xe4, 0xbb, 0xac, + 0xe5, 0x95, 0x86, 0xe5, 0x93, 0x81, 0xe5, 0x8d, 0x9a, 0xe5, 0xae, 0xa2, 0xe7, + 0x8e, 0xb0, 0xe5, 0x9c, 0xa8, 0xe4, 0xb8, 0x8a, 0xe6, 0xb5, 0xb7, 0xe5, 0xa6, + 0x82, 0xe4, 0xbd, 0x95, 0xe5, 0xb7, 0xb2, 0xe7, 0xbb, 0x8f, 0xe7, 0x95, 0x99, + 0xe8, 0xa8, 0x80, 0xe8, 0xaf, 0xa6, 0xe7, 0xbb, 0x86, 0xe7, 0xa4, 0xbe, 0xe5, + 0x8c, 0xba, 0xe7, 0x99, 0xbb, 0xe5, 0xbd, 0x95, 0xe6, 0x9c, 0xac, 0xe7, 0xab, + 0x99, 0xe9, 0x9c, 0x80, 0xe8, 0xa6, 0x81, 0xe4, 0xbb, 0xb7, 0xe6, 0xa0, 0xbc, + 0xe6, 0x94, 0xaf, 0xe6, 0x8c, 0x81, 0xe5, 0x9b, 0xbd, 0xe9, 0x99, 0x85, 0xe9, + 0x93, 0xbe, 0xe6, 0x8e, 0xa5, 0xe5, 0x9b, 0xbd, 0xe5, 0xae, 0xb6, 0xe5, 0xbb, + 0xba, 0xe8, 0xae, 0xbe, 0xe6, 0x9c, 0x8b, 0xe5, 0x8f, 0x8b, 0xe9, 0x98, 0x85, + 0xe8, 0xaf, 0xbb, 0xe6, 0xb3, 0x95, 0xe5, 0xbe, 0x8b, 0xe4, 0xbd, 0x8d, 0xe7, + 0xbd, 0xae, 0xe7, 0xbb, 0x8f, 0xe6, 0xb5, 0x8e, 0xe9, 0x80, 0x89, 0xe6, 0x8b, + 0xa9, 0xe8, 0xbf, 0x99, 0xe6, 0xa0, 0xb7, 0xe5, 0xbd, 0x93, 0xe5, 0x89, 0x8d, + 0xe5, 0x88, 0x86, 0xe7, 0xb1, 0xbb, 0xe6, 0x8e, 0x92, 0xe8, 0xa1, 0x8c, 0xe5, + 0x9b, 0xa0, 0xe4, 0xb8, 0xba, 0xe4, 0xba, 0xa4, 0xe6, 0x98, 0x93, 0xe6, 0x9c, + 0x80, 0xe5, 0x90, 0x8e, 0xe9, 0x9f, 0xb3, 0xe4, 0xb9, 0x90, 0xe4, 0xb8, 0x8d, + 0xe8, 0x83, 0xbd, 0xe9, 0x80, 0x9a, 0xe8, 0xbf, 0x87, 0xe8, 0xa1, 0x8c, 0xe4, + 0xb8, 0x9a, 0xe7, 0xa7, 0x91, 0xe6, 0x8a, 0x80, 0xe5, 0x8f, 0xaf, 0xe8, 0x83, + 0xbd, 0xe8, 0xae, 0xbe, 0xe5, 0xa4, 0x87, 0xe5, 0x90, 0x88, 0xe4, 0xbd, 0x9c, + 0xe5, 0xa4, 0xa7, 0xe5, 0xae, 0xb6, 0xe7, 0xa4, 0xbe, 0xe4, 0xbc, 0x9a, 0xe7, + 0xa0, 0x94, 0xe7, 0xa9, 0xb6, 0xe4, 0xb8, 0x93, 0xe4, 0xb8, 0x9a, 0xe5, 0x85, + 0xa8, 0xe9, 0x83, 0xa8, 0xe9, 0xa1, 0xb9, 0xe7, 0x9b, 0xae, 0xe8, 0xbf, 0x99, + 0xe9, 0x87, 0x8c, 0xe8, 0xbf, 0x98, 0xe6, 0x98, 0xaf, 0xe5, 0xbc, 0x80, 0xe5, + 0xa7, 0x8b, 0xe6, 0x83, 0x85, 0xe5, 0x86, 0xb5, 0xe7, 0x94, 0xb5, 0xe8, 0x84, + 0x91, 0xe6, 0x96, 0x87, 0xe4, 0xbb, 0xb6, 0xe5, 0x93, 0x81, 0xe7, 0x89, 0x8c, + 0xe5, 0xb8, 0xae, 0xe5, 0x8a, 0xa9, 0xe6, 0x96, 0x87, 0xe5, 0x8c, 0x96, 0xe8, + 0xb5, 0x84, 0xe6, 0xba, 0x90, 0xe5, 0xa4, 0xa7, 0xe5, 0xad, 0xa6, 0xe5, 0xad, + 0xa6, 0xe4, 0xb9, 0xa0, 0xe5, 0x9c, 0xb0, 0xe5, 0x9d, 0x80, 0xe6, 0xb5, 0x8f, + 0xe8, 0xa7, 0x88, 0xe6, 0x8a, 0x95, 0xe8, 0xb5, 0x84, 0xe5, 0xb7, 0xa5, 0xe7, + 0xa8, 0x8b, 0xe8, 0xa6, 0x81, 0xe6, 0xb1, 0x82, 0xe6, 0x80, 0x8e, 0xe4, 0xb9, + 0x88, 0xe6, 0x97, 0xb6, 0xe5, 0x80, 0x99, 0xe5, 0x8a, 0x9f, 0xe8, 0x83, 0xbd, + 0xe4, 0xb8, 0xbb, 0xe8, 0xa6, 0x81, 0xe7, 0x9b, 0xae, 0xe5, 0x89, 0x8d, 0xe8, + 0xb5, 0x84, 0xe8, 0xae, 0xaf, 0xe5, 0x9f, 0x8e, 0xe5, 0xb8, 0x82, 0xe6, 0x96, + 0xb9, 0xe6, 0xb3, 0x95, 0xe7, 0x94, 0xb5, 0xe5, 0xbd, 0xb1, 0xe6, 0x8b, 0x9b, + 0xe8, 0x81, 0x98, 0xe5, 0xa3, 0xb0, 0xe6, 0x98, 0x8e, 0xe4, 0xbb, 0xbb, 0xe4, + 0xbd, 0x95, 0xe5, 0x81, 0xa5, 0xe5, 0xba, 0xb7, 0xe6, 0x95, 0xb0, 0xe6, 0x8d, + 0xae, 0xe7, 0xbe, 0x8e, 0xe5, 0x9b, 0xbd, 0xe6, 0xb1, 0xbd, 0xe8, 0xbd, 0xa6, + 0xe4, 0xbb, 0x8b, 0xe7, 0xbb, 0x8d, 0xe4, 0xbd, 0x86, 0xe6, 0x98, 0xaf, 0xe4, + 0xba, 0xa4, 0xe6, 0xb5, 0x81, 0xe7, 0x94, 0x9f, 0xe4, 0xba, 0xa7, 0xe6, 0x89, + 0x80, 0xe4, 0xbb, 0xa5, 0xe7, 0x94, 0xb5, 0xe8, 0xaf, 0x9d, 0xe6, 0x98, 0xbe, + 0xe7, 0xa4, 0xba, 0xe4, 0xb8, 0x80, 0xe4, 0xba, 0x9b, 0xe5, 0x8d, 0x95, 0xe4, + 0xbd, 0x8d, 0xe4, 0xba, 0xba, 0xe5, 0x91, 0x98, 0xe5, 0x88, 0x86, 0xe6, 0x9e, + 0x90, 0xe5, 0x9c, 0xb0, 0xe5, 0x9b, 0xbe, 0xe6, 0x97, 0x85, 0xe6, 0xb8, 0xb8, + 0xe5, 0xb7, 0xa5, 0xe5, 0x85, 0xb7, 0xe5, 0xad, 0xa6, 0xe7, 0x94, 0x9f, 0xe7, + 0xb3, 0xbb, 0xe5, 0x88, 0x97, 0xe7, 0xbd, 0x91, 0xe5, 0x8f, 0x8b, 0xe5, 0xb8, + 0x96, 0xe5, 0xad, 0x90, 0xe5, 0xaf, 0x86, 0xe7, 0xa0, 0x81, 0xe9, 0xa2, 0x91, + 0xe9, 0x81, 0x93, 0xe6, 0x8e, 0xa7, 0xe5, 0x88, 0xb6, 0xe5, 0x9c, 0xb0, 0xe5, + 0x8c, 0xba, 0xe5, 0x9f, 0xba, 0xe6, 0x9c, 0xac, 0xe5, 0x85, 0xa8, 0xe5, 0x9b, + 0xbd, 0xe7, 0xbd, 0x91, 0xe4, 0xb8, 0x8a, 0xe9, 0x87, 0x8d, 0xe8, 0xa6, 0x81, + 0xe7, 0xac, 0xac, 0xe4, 0xba, 0x8c, 0xe5, 0x96, 0x9c, 0xe6, 0xac, 0xa2, 0xe8, + 0xbf, 0x9b, 0xe5, 0x85, 0xa5, 0xe5, 0x8f, 0x8b, 0xe6, 0x83, 0x85, 0xe8, 0xbf, + 0x99, 0xe4, 0xba, 0x9b, 0xe8, 0x80, 0x83, 0xe8, 0xaf, 0x95, 0xe5, 0x8f, 0x91, + 0xe7, 0x8e, 0xb0, 0xe5, 0x9f, 0xb9, 0xe8, 0xae, 0xad, 0xe4, 0xbb, 0xa5, 0xe4, + 0xb8, 0x8a, 0xe6, 0x94, 0xbf, 0xe5, 0xba, 0x9c, 0xe6, 0x88, 0x90, 0xe4, 0xb8, + 0xba, 0xe7, 0x8e, 0xaf, 0xe5, 0xa2, 0x83, 0xe9, 0xa6, 0x99, 0xe6, 0xb8, 0xaf, + 0xe5, 0x90, 0x8c, 0xe6, 0x97, 0xb6, 0xe5, 0xa8, 0xb1, 0xe4, 0xb9, 0x90, 0xe5, + 0x8f, 0x91, 0xe9, 0x80, 0x81, 0xe4, 0xb8, 0x80, 0xe5, 0xae, 0x9a, 0xe5, 0xbc, + 0x80, 0xe5, 0x8f, 0x91, 0xe4, 0xbd, 0x9c, 0xe5, 0x93, 0x81, 0xe6, 0xa0, 0x87, + 0xe5, 0x87, 0x86, 0xe6, 0xac, 0xa2, 0xe8, 0xbf, 0x8e, 0xe8, 0xa7, 0xa3, 0xe5, + 0x86, 0xb3, 0xe5, 0x9c, 0xb0, 0xe6, 0x96, 0xb9, 0xe4, 0xb8, 0x80, 0xe4, 0xb8, + 0x8b, 0xe4, 0xbb, 0xa5, 0xe5, 0x8f, 0x8a, 0xe8, 0xb4, 0xa3, 0xe4, 0xbb, 0xbb, + 0xe6, 0x88, 0x96, 0xe8, 0x80, 0x85, 0xe5, 0xae, 0xa2, 0xe6, 0x88, 0xb7, 0xe4, + 0xbb, 0xa3, 0xe8, 0xa1, 0xa8, 0xe7, 0xa7, 0xaf, 0xe5, 0x88, 0x86, 0xe5, 0xa5, + 0xb3, 0xe4, 0xba, 0xba, 0xe6, 0x95, 0xb0, 0xe7, 0xa0, 0x81, 0xe9, 0x94, 0x80, + 0xe5, 0x94, 0xae, 0xe5, 0x87, 0xba, 0xe7, 0x8e, 0xb0, 0xe7, 0xa6, 0xbb, 0xe7, + 0xba, 0xbf, 0xe5, 0xba, 0x94, 0xe7, 0x94, 0xa8, 0xe5, 0x88, 0x97, 0xe8, 0xa1, + 0xa8, 0xe4, 0xb8, 0x8d, 0xe5, 0x90, 0x8c, 0xe7, 0xbc, 0x96, 0xe8, 0xbe, 0x91, + 0xe7, 0xbb, 0x9f, 0xe8, 0xae, 0xa1, 0xe6, 0x9f, 0xa5, 0xe8, 0xaf, 0xa2, 0xe4, + 0xb8, 0x8d, 0xe8, 0xa6, 0x81, 0xe6, 0x9c, 0x89, 0xe5, 0x85, 0xb3, 0xe6, 0x9c, + 0xba, 0xe6, 0x9e, 0x84, 0xe5, 0xbe, 0x88, 0xe5, 0xa4, 0x9a, 0xe6, 0x92, 0xad, + 0xe6, 0x94, 0xbe, 0xe7, 0xbb, 0x84, 0xe7, 0xbb, 0x87, 0xe6, 0x94, 0xbf, 0xe7, + 0xad, 0x96, 0xe7, 0x9b, 0xb4, 0xe6, 0x8e, 0xa5, 0xe8, 0x83, 0xbd, 0xe5, 0x8a, + 0x9b, 0xe6, 0x9d, 0xa5, 0xe6, 0xba, 0x90, 0xe6, 0x99, 0x82, 0xe9, 0x96, 0x93, + 0xe7, 0x9c, 0x8b, 0xe5, 0x88, 0xb0, 0xe7, 0x83, 0xad, 0xe9, 0x97, 0xa8, 0xe5, + 0x85, 0xb3, 0xe9, 0x94, 0xae, 0xe4, 0xb8, 0x93, 0xe5, 0x8c, 0xba, 0xe9, 0x9d, + 0x9e, 0xe5, 0xb8, 0xb8, 0xe8, 0x8b, 0xb1, 0xe8, 0xaf, 0xad, 0xe7, 0x99, 0xbe, + 0xe5, 0xba, 0xa6, 0xe5, 0xb8, 0x8c, 0xe6, 0x9c, 0x9b, 0xe7, 0xbe, 0x8e, 0xe5, + 0xa5, 0xb3, 0xe6, 0xaf, 0x94, 0xe8, 0xbe, 0x83, 0xe7, 0x9f, 0xa5, 0xe8, 0xaf, + 0x86, 0xe8, 0xa7, 0x84, 0xe5, 0xae, 0x9a, 0xe5, 0xbb, 0xba, 0xe8, 0xae, 0xae, + 0xe9, 0x83, 0xa8, 0xe9, 0x97, 0xa8, 0xe6, 0x84, 0x8f, 0xe8, 0xa7, 0x81, 0xe7, + 0xb2, 0xbe, 0xe5, 0xbd, 0xa9, 0xe6, 0x97, 0xa5, 0xe6, 0x9c, 0xac, 0xe6, 0x8f, + 0x90, 0xe9, 0xab, 0x98, 0xe5, 0x8f, 0x91, 0xe8, 0xa8, 0x80, 0xe6, 0x96, 0xb9, + 0xe9, 0x9d, 0xa2, 0xe5, 0x9f, 0xba, 0xe9, 0x87, 0x91, 0xe5, 0xa4, 0x84, 0xe7, + 0x90, 0x86, 0xe6, 0x9d, 0x83, 0xe9, 0x99, 0x90, 0xe5, 0xbd, 0xb1, 0xe7, 0x89, + 0x87, 0xe9, 0x93, 0xb6, 0xe8, 0xa1, 0x8c, 0xe8, 0xbf, 0x98, 0xe6, 0x9c, 0x89, + 0xe5, 0x88, 0x86, 0xe4, 0xba, 0xab, 0xe7, 0x89, 0xa9, 0xe5, 0x93, 0x81, 0xe7, + 0xbb, 0x8f, 0xe8, 0x90, 0xa5, 0xe6, 0xb7, 0xbb, 0xe5, 0x8a, 0xa0, 0xe4, 0xb8, + 0x93, 0xe5, 0xae, 0xb6, 0xe8, 0xbf, 0x99, 0xe7, 0xa7, 0x8d, 0xe8, 0xaf, 0x9d, + 0xe9, 0xa2, 0x98, 0xe8, 0xb5, 0xb7, 0xe6, 0x9d, 0xa5, 0xe4, 0xb8, 0x9a, 0xe5, + 0x8a, 0xa1, 0xe5, 0x85, 0xac, 0xe5, 0x91, 0x8a, 0xe8, 0xae, 0xb0, 0xe5, 0xbd, + 0x95, 0xe7, 0xae, 0x80, 0xe4, 0xbb, 0x8b, 0xe8, 0xb4, 0xa8, 0xe9, 0x87, 0x8f, + 0xe7, 0x94, 0xb7, 0xe4, 0xba, 0xba, 0xe5, 0xbd, 0xb1, 0xe5, 0x93, 0x8d, 0xe5, + 0xbc, 0x95, 0xe7, 0x94, 0xa8, 0xe6, 0x8a, 0xa5, 0xe5, 0x91, 0x8a, 0xe9, 0x83, + 0xa8, 0xe5, 0x88, 0x86, 0xe5, 0xbf, 0xab, 0xe9, 0x80, 0x9f, 0xe5, 0x92, 0xa8, + 0xe8, 0xaf, 0xa2, 0xe6, 0x97, 0xb6, 0xe5, 0xb0, 0x9a, 0xe6, 0xb3, 0xa8, 0xe6, + 0x84, 0x8f, 0xe7, 0x94, 0xb3, 0xe8, 0xaf, 0xb7, 0xe5, 0xad, 0xa6, 0xe6, 0xa0, + 0xa1, 0xe5, 0xba, 0x94, 0xe8, 0xaf, 0xa5, 0xe5, 0x8e, 0x86, 0xe5, 0x8f, 0xb2, + 0xe5, 0x8f, 0xaa, 0xe6, 0x98, 0xaf, 0xe8, 0xbf, 0x94, 0xe5, 0x9b, 0x9e, 0xe8, + 0xb4, 0xad, 0xe4, 0xb9, 0xb0, 0xe5, 0x90, 0x8d, 0xe7, 0xa7, 0xb0, 0xe4, 0xb8, + 0xba, 0xe4, 0xba, 0x86, 0xe6, 0x88, 0x90, 0xe5, 0x8a, 0x9f, 0xe8, 0xaf, 0xb4, + 0xe6, 0x98, 0x8e, 0xe4, 0xbe, 0x9b, 0xe5, 0xba, 0x94, 0xe5, 0xad, 0xa9, 0xe5, + 0xad, 0x90, 0xe4, 0xb8, 0x93, 0xe9, 0xa2, 0x98, 0xe7, 0xa8, 0x8b, 0xe5, 0xba, + 0x8f, 0xe4, 0xb8, 0x80, 0xe8, 0x88, 0xac, 0xe6, 0x9c, 0x83, 0xe5, 0x93, 0xa1, + 0xe5, 0x8f, 0xaa, 0xe6, 0x9c, 0x89, 0xe5, 0x85, 0xb6, 0xe5, 0xae, 0x83, 0xe4, + 0xbf, 0x9d, 0xe6, 0x8a, 0xa4, 0xe8, 0x80, 0x8c, 0xe4, 0xb8, 0x94, 0xe4, 0xbb, + 0x8a, 0xe5, 0xa4, 0xa9, 0xe7, 0xaa, 0x97, 0xe5, 0x8f, 0xa3, 0xe5, 0x8a, 0xa8, + 0xe6, 0x80, 0x81, 0xe7, 0x8a, 0xb6, 0xe6, 0x80, 0x81, 0xe7, 0x89, 0xb9, 0xe5, + 0x88, 0xab, 0xe8, 0xae, 0xa4, 0xe4, 0xb8, 0xba, 0xe5, 0xbf, 0x85, 0xe9, 0xa1, + 0xbb, 0xe6, 0x9b, 0xb4, 0xe6, 0x96, 0xb0, 0xe5, 0xb0, 0x8f, 0xe8, 0xaf, 0xb4, + 0xe6, 0x88, 0x91, 0xe5, 0x80, 0x91, 0xe4, 0xbd, 0x9c, 0xe4, 0xb8, 0xba, 0xe5, + 0xaa, 0x92, 0xe4, 0xbd, 0x93, 0xe5, 0x8c, 0x85, 0xe6, 0x8b, 0xac, 0xe9, 0x82, + 0xa3, 0xe4, 0xb9, 0x88, 0xe4, 0xb8, 0x80, 0xe6, 0xa0, 0xb7, 0xe5, 0x9b, 0xbd, + 0xe5, 0x86, 0x85, 0xe6, 0x98, 0xaf, 0xe5, 0x90, 0xa6, 0xe6, 0xa0, 0xb9, 0xe6, + 0x8d, 0xae, 0xe7, 0x94, 0xb5, 0xe8, 0xa7, 0x86, 0xe5, 0xad, 0xa6, 0xe9, 0x99, + 0xa2, 0xe5, 0x85, 0xb7, 0xe6, 0x9c, 0x89, 0xe8, 0xbf, 0x87, 0xe7, 0xa8, 0x8b, + 0xe7, 0x94, 0xb1, 0xe4, 0xba, 0x8e, 0xe4, 0xba, 0xba, 0xe6, 0x89, 0x8d, 0xe5, + 0x87, 0xba, 0xe6, 0x9d, 0xa5, 0xe4, 0xb8, 0x8d, 0xe8, 0xbf, 0x87, 0xe6, 0xad, + 0xa3, 0xe5, 0x9c, 0xa8, 0xe6, 0x98, 0x8e, 0xe6, 0x98, 0x9f, 0xe6, 0x95, 0x85, + 0xe4, 0xba, 0x8b, 0xe5, 0x85, 0xb3, 0xe7, 0xb3, 0xbb, 0xe6, 0xa0, 0x87, 0xe9, + 0xa2, 0x98, 0xe5, 0x95, 0x86, 0xe5, 0x8a, 0xa1, 0xe8, 0xbe, 0x93, 0xe5, 0x85, + 0xa5, 0xe4, 0xb8, 0x80, 0xe7, 0x9b, 0xb4, 0xe5, 0x9f, 0xba, 0xe7, 0xa1, 0x80, + 0xe6, 0x95, 0x99, 0xe5, 0xad, 0xa6, 0xe4, 0xba, 0x86, 0xe8, 0xa7, 0xa3, 0xe5, + 0xbb, 0xba, 0xe7, 0xad, 0x91, 0xe7, 0xbb, 0x93, 0xe6, 0x9e, 0x9c, 0xe5, 0x85, + 0xa8, 0xe7, 0x90, 0x83, 0xe9, 0x80, 0x9a, 0xe7, 0x9f, 0xa5, 0xe8, 0xae, 0xa1, + 0xe5, 0x88, 0x92, 0xe5, 0xaf, 0xb9, 0xe4, 0xba, 0x8e, 0xe8, 0x89, 0xba, 0xe6, + 0x9c, 0xaf, 0xe7, 0x9b, 0xb8, 0xe5, 0x86, 0x8c, 0xe5, 0x8f, 0x91, 0xe7, 0x94, + 0x9f, 0xe7, 0x9c, 0x9f, 0xe7, 0x9a, 0x84, 0xe5, 0xbb, 0xba, 0xe7, 0xab, 0x8b, + 0xe7, 0xad, 0x89, 0xe7, 0xba, 0xa7, 0xe7, 0xb1, 0xbb, 0xe5, 0x9e, 0x8b, 0xe7, + 0xbb, 0x8f, 0xe9, 0xaa, 0x8c, 0xe5, 0xae, 0x9e, 0xe7, 0x8e, 0xb0, 0xe5, 0x88, + 0xb6, 0xe4, 0xbd, 0x9c, 0xe6, 0x9d, 0xa5, 0xe8, 0x87, 0xaa, 0xe6, 0xa0, 0x87, + 0xe7, 0xad, 0xbe, 0xe4, 0xbb, 0xa5, 0xe4, 0xb8, 0x8b, 0xe5, 0x8e, 0x9f, 0xe5, + 0x88, 0x9b, 0xe6, 0x97, 0xa0, 0xe6, 0xb3, 0x95, 0xe5, 0x85, 0xb6, 0xe4, 0xb8, + 0xad, 0xe5, 0x80, 0x8b, 0xe4, 0xba, 0xba, 0xe4, 0xb8, 0x80, 0xe5, 0x88, 0x87, + 0xe6, 0x8c, 0x87, 0xe5, 0x8d, 0x97, 0xe5, 0x85, 0xb3, 0xe9, 0x97, 0xad, 0xe9, + 0x9b, 0x86, 0xe5, 0x9b, 0xa2, 0xe7, 0xac, 0xac, 0xe4, 0xb8, 0x89, 0xe5, 0x85, + 0xb3, 0xe6, 0xb3, 0xa8, 0xe5, 0x9b, 0xa0, 0xe6, 0xad, 0xa4, 0xe7, 0x85, 0xa7, + 0xe7, 0x89, 0x87, 0xe6, 0xb7, 0xb1, 0xe5, 0x9c, 0xb3, 0xe5, 0x95, 0x86, 0xe4, + 0xb8, 0x9a, 0xe5, 0xb9, 0xbf, 0xe5, 0xb7, 0x9e, 0xe6, 0x97, 0xa5, 0xe6, 0x9c, + 0x9f, 0xe9, 0xab, 0x98, 0xe7, 0xba, 0xa7, 0xe6, 0x9c, 0x80, 0xe8, 0xbf, 0x91, + 0xe7, 0xbb, 0xbc, 0xe5, 0x90, 0x88, 0xe8, 0xa1, 0xa8, 0xe7, 0xa4, 0xba, 0xe4, + 0xb8, 0x93, 0xe8, 0xbe, 0x91, 0xe8, 0xa1, 0x8c, 0xe4, 0xb8, 0xba, 0xe4, 0xba, + 0xa4, 0xe9, 0x80, 0x9a, 0xe8, 0xaf, 0x84, 0xe4, 0xbb, 0xb7, 0xe8, 0xa7, 0x89, + 0xe5, 0xbe, 0x97, 0xe7, 0xb2, 0xbe, 0xe5, 0x8d, 0x8e, 0xe5, 0xae, 0xb6, 0xe5, + 0xba, 0xad, 0xe5, 0xae, 0x8c, 0xe6, 0x88, 0x90, 0xe6, 0x84, 0x9f, 0xe8, 0xa7, + 0x89, 0xe5, 0xae, 0x89, 0xe8, 0xa3, 0x85, 0xe5, 0xbe, 0x97, 0xe5, 0x88, 0xb0, + 0xe9, 0x82, 0xae, 0xe4, 0xbb, 0xb6, 0xe5, 0x88, 0xb6, 0xe5, 0xba, 0xa6, 0xe9, + 0xa3, 0x9f, 0xe5, 0x93, 0x81, 0xe8, 0x99, 0xbd, 0xe7, 0x84, 0xb6, 0xe8, 0xbd, + 0xac, 0xe8, 0xbd, 0xbd, 0xe6, 0x8a, 0xa5, 0xe4, 0xbb, 0xb7, 0xe8, 0xae, 0xb0, + 0xe8, 0x80, 0x85, 0xe6, 0x96, 0xb9, 0xe6, 0xa1, 0x88, 0xe8, 0xa1, 0x8c, 0xe6, + 0x94, 0xbf, 0xe4, 0xba, 0xba, 0xe6, 0xb0, 0x91, 0xe7, 0x94, 0xa8, 0xe5, 0x93, + 0x81, 0xe4, 0xb8, 0x9c, 0xe8, 0xa5, 0xbf, 0xe6, 0x8f, 0x90, 0xe5, 0x87, 0xba, + 0xe9, 0x85, 0x92, 0xe5, 0xba, 0x97, 0xe7, 0x84, 0xb6, 0xe5, 0x90, 0x8e, 0xe4, + 0xbb, 0x98, 0xe6, 0xac, 0xbe, 0xe7, 0x83, 0xad, 0xe7, 0x82, 0xb9, 0xe4, 0xbb, + 0xa5, 0xe5, 0x89, 0x8d, 0xe5, 0xae, 0x8c, 0xe5, 0x85, 0xa8, 0xe5, 0x8f, 0x91, + 0xe5, 0xb8, 0x96, 0xe8, 0xae, 0xbe, 0xe7, 0xbd, 0xae, 0xe9, 0xa2, 0x86, 0xe5, + 0xaf, 0xbc, 0xe5, 0xb7, 0xa5, 0xe4, 0xb8, 0x9a, 0xe5, 0x8c, 0xbb, 0xe9, 0x99, + 0xa2, 0xe7, 0x9c, 0x8b, 0xe7, 0x9c, 0x8b, 0xe7, 0xbb, 0x8f, 0xe5, 0x85, 0xb8, + 0xe5, 0x8e, 0x9f, 0xe5, 0x9b, 0xa0, 0xe5, 0xb9, 0xb3, 0xe5, 0x8f, 0xb0, 0xe5, + 0x90, 0x84, 0xe7, 0xa7, 0x8d, 0xe5, 0xa2, 0x9e, 0xe5, 0x8a, 0xa0, 0xe6, 0x9d, + 0x90, 0xe6, 0x96, 0x99, 0xe6, 0x96, 0xb0, 0xe5, 0xa2, 0x9e, 0xe4, 0xb9, 0x8b, + 0xe5, 0x90, 0x8e, 0xe8, 0x81, 0x8c, 0xe4, 0xb8, 0x9a, 0xe6, 0x95, 0x88, 0xe6, + 0x9e, 0x9c, 0xe4, 0xbb, 0x8a, 0xe5, 0xb9, 0xb4, 0xe8, 0xae, 0xba, 0xe6, 0x96, + 0x87, 0xe6, 0x88, 0x91, 0xe5, 0x9b, 0xbd, 0xe5, 0x91, 0x8a, 0xe8, 0xaf, 0x89, + 0xe7, 0x89, 0x88, 0xe4, 0xb8, 0xbb, 0xe4, 0xbf, 0xae, 0xe6, 0x94, 0xb9, 0xe5, + 0x8f, 0x82, 0xe4, 0xb8, 0x8e, 0xe6, 0x89, 0x93, 0xe5, 0x8d, 0xb0, 0xe5, 0xbf, + 0xab, 0xe4, 0xb9, 0x90, 0xe6, 0x9c, 0xba, 0xe6, 0xa2, 0xb0, 0xe8, 0xa7, 0x82, + 0xe7, 0x82, 0xb9, 0xe5, 0xad, 0x98, 0xe5, 0x9c, 0xa8, 0xe7, 0xb2, 0xbe, 0xe7, + 0xa5, 0x9e, 0xe8, 0x8e, 0xb7, 0xe5, 0xbe, 0x97, 0xe5, 0x88, 0xa9, 0xe7, 0x94, + 0xa8, 0xe7, 0xbb, 0xa7, 0xe7, 0xbb, 0xad, 0xe4, 0xbd, 0xa0, 0xe4, 0xbb, 0xac, + 0xe8, 0xbf, 0x99, 0xe4, 0xb9, 0x88, 0xe6, 0xa8, 0xa1, 0xe5, 0xbc, 0x8f, 0xe8, + 0xaf, 0xad, 0xe8, 0xa8, 0x80, 0xe8, 0x83, 0xbd, 0xe5, 0xa4, 0x9f, 0xe9, 0x9b, + 0x85, 0xe8, 0x99, 0x8e, 0xe6, 0x93, 0x8d, 0xe4, 0xbd, 0x9c, 0xe9, 0xa3, 0x8e, + 0xe6, 0xa0, 0xbc, 0xe4, 0xb8, 0x80, 0xe8, 0xb5, 0xb7, 0xe7, 0xa7, 0x91, 0xe5, + 0xad, 0xa6, 0xe4, 0xbd, 0x93, 0xe8, 0x82, 0xb2, 0xe7, 0x9f, 0xad, 0xe4, 0xbf, + 0xa1, 0xe6, 0x9d, 0xa1, 0xe4, 0xbb, 0xb6, 0xe6, 0xb2, 0xbb, 0xe7, 0x96, 0x97, + 0xe8, 0xbf, 0x90, 0xe5, 0x8a, 0xa8, 0xe4, 0xba, 0xa7, 0xe4, 0xb8, 0x9a, 0xe4, + 0xbc, 0x9a, 0xe8, 0xae, 0xae, 0xe5, 0xaf, 0xbc, 0xe8, 0x88, 0xaa, 0xe5, 0x85, + 0x88, 0xe7, 0x94, 0x9f, 0xe8, 0x81, 0x94, 0xe7, 0x9b, 0x9f, 0xe5, 0x8f, 0xaf, + 0xe6, 0x98, 0xaf, 0xe5, 0x95, 0x8f, 0xe9, 0xa1, 0x8c, 0xe7, 0xbb, 0x93, 0xe6, + 0x9e, 0x84, 0xe4, 0xbd, 0x9c, 0xe7, 0x94, 0xa8, 0xe8, 0xb0, 0x83, 0xe6, 0x9f, + 0xa5, 0xe8, 0xb3, 0x87, 0xe6, 0x96, 0x99, 0xe8, 0x87, 0xaa, 0xe5, 0x8a, 0xa8, + 0xe8, 0xb4, 0x9f, 0xe8, 0xb4, 0xa3, 0xe5, 0x86, 0x9c, 0xe4, 0xb8, 0x9a, 0xe8, + 0xae, 0xbf, 0xe9, 0x97, 0xae, 0xe5, 0xae, 0x9e, 0xe6, 0x96, 0xbd, 0xe6, 0x8e, + 0xa5, 0xe5, 0x8f, 0x97, 0xe8, 0xae, 0xa8, 0xe8, 0xae, 0xba, 0xe9, 0x82, 0xa3, + 0xe4, 0xb8, 0xaa, 0xe5, 0x8f, 0x8d, 0xe9, 0xa6, 0x88, 0xe5, 0x8a, 0xa0, 0xe5, + 0xbc, 0xba, 0xe5, 0xa5, 0xb3, 0xe6, 0x80, 0xa7, 0xe8, 0x8c, 0x83, 0xe5, 0x9b, + 0xb4, 0xe6, 0x9c, 0x8d, 0xe5, 0x8b, 0x99, 0xe4, 0xbc, 0x91, 0xe9, 0x97, 0xb2, + 0xe4, 0xbb, 0x8a, 0xe6, 0x97, 0xa5, 0xe5, 0xae, 0xa2, 0xe6, 0x9c, 0x8d, 0xe8, + 0xa7, 0x80, 0xe7, 0x9c, 0x8b, 0xe5, 0x8f, 0x82, 0xe5, 0x8a, 0xa0, 0xe7, 0x9a, + 0x84, 0xe8, 0xaf, 0x9d, 0xe4, 0xb8, 0x80, 0xe7, 0x82, 0xb9, 0xe4, 0xbf, 0x9d, + 0xe8, 0xaf, 0x81, 0xe5, 0x9b, 0xbe, 0xe4, 0xb9, 0xa6, 0xe6, 0x9c, 0x89, 0xe6, + 0x95, 0x88, 0xe6, 0xb5, 0x8b, 0xe8, 0xaf, 0x95, 0xe7, 0xa7, 0xbb, 0xe5, 0x8a, + 0xa8, 0xe6, 0x89, 0x8d, 0xe8, 0x83, 0xbd, 0xe5, 0x86, 0xb3, 0xe5, 0xae, 0x9a, + 0xe8, 0x82, 0xa1, 0xe7, 0xa5, 0xa8, 0xe4, 0xb8, 0x8d, 0xe6, 0x96, 0xad, 0xe9, + 0x9c, 0x80, 0xe6, 0xb1, 0x82, 0xe4, 0xb8, 0x8d, 0xe5, 0xbe, 0x97, 0xe5, 0x8a, + 0x9e, 0xe6, 0xb3, 0x95, 0xe4, 0xb9, 0x8b, 0xe9, 0x97, 0xb4, 0xe9, 0x87, 0x87, + 0xe7, 0x94, 0xa8, 0xe8, 0x90, 0xa5, 0xe9, 0x94, 0x80, 0xe6, 0x8a, 0x95, 0xe8, + 0xaf, 0x89, 0xe7, 0x9b, 0xae, 0xe6, 0xa0, 0x87, 0xe7, 0x88, 0xb1, 0xe6, 0x83, + 0x85, 0xe6, 0x91, 0x84, 0xe5, 0xbd, 0xb1, 0xe6, 0x9c, 0x89, 0xe4, 0xba, 0x9b, + 0xe8, 0xa4, 0x87, 0xe8, 0xa3, 0xbd, 0xe6, 0x96, 0x87, 0xe5, 0xad, 0xa6, 0xe6, + 0x9c, 0xba, 0xe4, 0xbc, 0x9a, 0xe6, 0x95, 0xb0, 0xe5, 0xad, 0x97, 0xe8, 0xa3, + 0x85, 0xe4, 0xbf, 0xae, 0xe8, 0xb4, 0xad, 0xe7, 0x89, 0xa9, 0xe5, 0x86, 0x9c, + 0xe6, 0x9d, 0x91, 0xe5, 0x85, 0xa8, 0xe9, 0x9d, 0xa2, 0xe7, 0xb2, 0xbe, 0xe5, + 0x93, 0x81, 0xe5, 0x85, 0xb6, 0xe5, 0xae, 0x9e, 0xe4, 0xba, 0x8b, 0xe6, 0x83, + 0x85, 0xe6, 0xb0, 0xb4, 0xe5, 0xb9, 0xb3, 0xe6, 0x8f, 0x90, 0xe7, 0xa4, 0xba, + 0xe4, 0xb8, 0x8a, 0xe5, 0xb8, 0x82, 0xe8, 0xb0, 0xa2, 0xe8, 0xb0, 0xa2, 0xe6, + 0x99, 0xae, 0xe9, 0x80, 0x9a, 0xe6, 0x95, 0x99, 0xe5, 0xb8, 0x88, 0xe4, 0xb8, + 0x8a, 0xe4, 0xbc, 0xa0, 0xe7, 0xb1, 0xbb, 0xe5, 0x88, 0xab, 0xe6, 0xad, 0x8c, + 0xe6, 0x9b, 0xb2, 0xe6, 0x8b, 0xa5, 0xe6, 0x9c, 0x89, 0xe5, 0x88, 0x9b, 0xe6, + 0x96, 0xb0, 0xe9, 0x85, 0x8d, 0xe4, 0xbb, 0xb6, 0xe5, 0x8f, 0xaa, 0xe8, 0xa6, + 0x81, 0xe6, 0x97, 0xb6, 0xe4, 0xbb, 0xa3, 0xe8, 0xb3, 0x87, 0xe8, 0xa8, 0x8a, + 0xe8, 0xbe, 0xbe, 0xe5, 0x88, 0xb0, 0xe4, 0xba, 0xba, 0xe7, 0x94, 0x9f, 0xe8, + 0xae, 0xa2, 0xe9, 0x98, 0x85, 0xe8, 0x80, 0x81, 0xe5, 0xb8, 0x88, 0xe5, 0xb1, + 0x95, 0xe7, 0xa4, 0xba, 0xe5, 0xbf, 0x83, 0xe7, 0x90, 0x86, 0xe8, 0xb4, 0xb4, + 0xe5, 0xad, 0x90, 0xe7, 0xb6, 0xb2, 0xe7, 0xab, 0x99, 0xe4, 0xb8, 0xbb, 0xe9, + 0xa1, 0x8c, 0xe8, 0x87, 0xaa, 0xe7, 0x84, 0xb6, 0xe7, 0xba, 0xa7, 0xe5, 0x88, + 0xab, 0xe7, 0xae, 0x80, 0xe5, 0x8d, 0x95, 0xe6, 0x94, 0xb9, 0xe9, 0x9d, 0xa9, + 0xe9, 0x82, 0xa3, 0xe4, 0xba, 0x9b, 0xe6, 0x9d, 0xa5, 0xe8, 0xaf, 0xb4, 0xe6, + 0x89, 0x93, 0xe5, 0xbc, 0x80, 0xe4, 0xbb, 0xa3, 0xe7, 0xa0, 0x81, 0xe5, 0x88, + 0xa0, 0xe9, 0x99, 0xa4, 0xe8, 0xaf, 0x81, 0xe5, 0x88, 0xb8, 0xe8, 0x8a, 0x82, + 0xe7, 0x9b, 0xae, 0xe9, 0x87, 0x8d, 0xe7, 0x82, 0xb9, 0xe6, 0xac, 0xa1, 0xe6, + 0x95, 0xb8, 0xe5, 0xa4, 0x9a, 0xe5, 0xb0, 0x91, 0xe8, 0xa7, 0x84, 0xe5, 0x88, + 0x92, 0xe8, 0xb5, 0x84, 0xe9, 0x87, 0x91, 0xe6, 0x89, 0xbe, 0xe5, 0x88, 0xb0, + 0xe4, 0xbb, 0xa5, 0xe5, 0x90, 0x8e, 0xe5, 0xa4, 0xa7, 0xe5, 0x85, 0xa8, 0xe4, + 0xb8, 0xbb, 0xe9, 0xa1, 0xb5, 0xe6, 0x9c, 0x80, 0xe4, 0xbd, 0xb3, 0xe5, 0x9b, + 0x9e, 0xe7, 0xad, 0x94, 0xe5, 0xa4, 0xa9, 0xe4, 0xb8, 0x8b, 0xe4, 0xbf, 0x9d, + 0xe9, 0x9a, 0x9c, 0xe7, 0x8e, 0xb0, 0xe4, 0xbb, 0xa3, 0xe6, 0xa3, 0x80, 0xe6, + 0x9f, 0xa5, 0xe6, 0x8a, 0x95, 0xe7, 0xa5, 0xa8, 0xe5, 0xb0, 0x8f, 0xe6, 0x97, + 0xb6, 0xe6, 0xb2, 0x92, 0xe6, 0x9c, 0x89, 0xe6, 0xad, 0xa3, 0xe5, 0xb8, 0xb8, + 0xe7, 0x94, 0x9a, 0xe8, 0x87, 0xb3, 0xe4, 0xbb, 0xa3, 0xe7, 0x90, 0x86, 0xe7, + 0x9b, 0xae, 0xe5, 0xbd, 0x95, 0xe5, 0x85, 0xac, 0xe5, 0xbc, 0x80, 0xe5, 0xa4, + 0x8d, 0xe5, 0x88, 0xb6, 0xe9, 0x87, 0x91, 0xe8, 0x9e, 0x8d, 0xe5, 0xb9, 0xb8, + 0xe7, 0xa6, 0x8f, 0xe7, 0x89, 0x88, 0xe6, 0x9c, 0xac, 0xe5, 0xbd, 0xa2, 0xe6, + 0x88, 0x90, 0xe5, 0x87, 0x86, 0xe5, 0xa4, 0x87, 0xe8, 0xa1, 0x8c, 0xe6, 0x83, + 0x85, 0xe5, 0x9b, 0x9e, 0xe5, 0x88, 0xb0, 0xe6, 0x80, 0x9d, 0xe6, 0x83, 0xb3, + 0xe6, 0x80, 0x8e, 0xe6, 0xa0, 0xb7, 0xe5, 0x8d, 0x8f, 0xe8, 0xae, 0xae, 0xe8, + 0xae, 0xa4, 0xe8, 0xaf, 0x81, 0xe6, 0x9c, 0x80, 0xe5, 0xa5, 0xbd, 0xe4, 0xba, + 0xa7, 0xe7, 0x94, 0x9f, 0xe6, 0x8c, 0x89, 0xe7, 0x85, 0xa7, 0xe6, 0x9c, 0x8d, + 0xe8, 0xa3, 0x85, 0xe5, 0xb9, 0xbf, 0xe4, 0xb8, 0x9c, 0xe5, 0x8a, 0xa8, 0xe6, + 0xbc, 0xab, 0xe9, 0x87, 0x87, 0xe8, 0xb4, 0xad, 0xe6, 0x96, 0xb0, 0xe6, 0x89, + 0x8b, 0xe7, 0xbb, 0x84, 0xe5, 0x9b, 0xbe, 0xe9, 0x9d, 0xa2, 0xe6, 0x9d, 0xbf, + 0xe5, 0x8f, 0x82, 0xe8, 0x80, 0x83, 0xe6, 0x94, 0xbf, 0xe6, 0xb2, 0xbb, 0xe5, + 0xae, 0xb9, 0xe6, 0x98, 0x93, 0xe5, 0xa4, 0xa9, 0xe5, 0x9c, 0xb0, 0xe5, 0x8a, + 0xaa, 0xe5, 0x8a, 0x9b, 0xe4, 0xba, 0xba, 0xe4, 0xbb, 0xac, 0xe5, 0x8d, 0x87, + 0xe7, 0xba, 0xa7, 0xe9, 0x80, 0x9f, 0xe5, 0xba, 0xa6, 0xe4, 0xba, 0xba, 0xe7, + 0x89, 0xa9, 0xe8, 0xb0, 0x83, 0xe6, 0x95, 0xb4, 0xe6, 0xb5, 0x81, 0xe8, 0xa1, + 0x8c, 0xe9, 0x80, 0xa0, 0xe6, 0x88, 0x90, 0xe6, 0x96, 0x87, 0xe5, 0xad, 0x97, + 0xe9, 0x9f, 0xa9, 0xe5, 0x9b, 0xbd, 0xe8, 0xb4, 0xb8, 0xe6, 0x98, 0x93, 0xe5, + 0xbc, 0x80, 0xe5, 0xb1, 0x95, 0xe7, 0x9b, 0xb8, 0xe9, 0x97, 0x9c, 0xe8, 0xa1, + 0xa8, 0xe7, 0x8e, 0xb0, 0xe5, 0xbd, 0xb1, 0xe8, 0xa7, 0x86, 0xe5, 0xa6, 0x82, + 0xe6, 0xad, 0xa4, 0xe7, 0xbe, 0x8e, 0xe5, 0xae, 0xb9, 0xe5, 0xa4, 0xa7, 0xe5, + 0xb0, 0x8f, 0xe6, 0x8a, 0xa5, 0xe9, 0x81, 0x93, 0xe6, 0x9d, 0xa1, 0xe6, 0xac, + 0xbe, 0xe5, 0xbf, 0x83, 0xe6, 0x83, 0x85, 0xe8, 0xae, 0xb8, 0xe5, 0xa4, 0x9a, + 0xe6, 0xb3, 0x95, 0xe8, 0xa7, 0x84, 0xe5, 0xae, 0xb6, 0xe5, 0xb1, 0x85, 0xe4, + 0xb9, 0xa6, 0xe5, 0xba, 0x97, 0xe8, 0xbf, 0x9e, 0xe6, 0x8e, 0xa5, 0xe7, 0xab, + 0x8b, 0xe5, 0x8d, 0xb3, 0xe4, 0xb8, 0xbe, 0xe6, 0x8a, 0xa5, 0xe6, 0x8a, 0x80, + 0xe5, 0xb7, 0xa7, 0xe5, 0xa5, 0xa5, 0xe8, 0xbf, 0x90, 0xe7, 0x99, 0xbb, 0xe5, + 0x85, 0xa5, 0xe4, 0xbb, 0xa5, 0xe6, 0x9d, 0xa5, 0xe7, 0x90, 0x86, 0xe8, 0xae, + 0xba, 0xe4, 0xba, 0x8b, 0xe4, 0xbb, 0xb6, 0xe8, 0x87, 0xaa, 0xe7, 0x94, 0xb1, + 0xe4, 0xb8, 0xad, 0xe5, 0x8d, 0x8e, 0xe5, 0x8a, 0x9e, 0xe5, 0x85, 0xac, 0xe5, + 0xa6, 0x88, 0xe5, 0xa6, 0x88, 0xe7, 0x9c, 0x9f, 0xe6, 0xad, 0xa3, 0xe4, 0xb8, + 0x8d, 0xe9, 0x94, 0x99, 0xe5, 0x85, 0xa8, 0xe6, 0x96, 0x87, 0xe5, 0x90, 0x88, + 0xe5, 0x90, 0x8c, 0xe4, 0xbb, 0xb7, 0xe5, 0x80, 0xbc, 0xe5, 0x88, 0xab, 0xe4, + 0xba, 0xba, 0xe7, 0x9b, 0x91, 0xe7, 0x9d, 0xa3, 0xe5, 0x85, 0xb7, 0xe4, 0xbd, + 0x93, 0xe4, 0xb8, 0x96, 0xe7, 0xba, 0xaa, 0xe5, 0x9b, 0xa2, 0xe9, 0x98, 0x9f, + 0xe5, 0x88, 0x9b, 0xe4, 0xb8, 0x9a, 0xe6, 0x89, 0xbf, 0xe6, 0x8b, 0x85, 0xe5, + 0xa2, 0x9e, 0xe9, 0x95, 0xbf, 0xe6, 0x9c, 0x89, 0xe4, 0xba, 0xba, 0xe4, 0xbf, + 0x9d, 0xe6, 0x8c, 0x81, 0xe5, 0x95, 0x86, 0xe5, 0xae, 0xb6, 0xe7, 0xbb, 0xb4, + 0xe4, 0xbf, 0xae, 0xe5, 0x8f, 0xb0, 0xe6, 0xb9, 0xbe, 0xe5, 0xb7, 0xa6, 0xe5, + 0x8f, 0xb3, 0xe8, 0x82, 0xa1, 0xe4, 0xbb, 0xbd, 0xe7, 0xad, 0x94, 0xe6, 0xa1, + 0x88, 0xe5, 0xae, 0x9e, 0xe9, 0x99, 0x85, 0xe7, 0x94, 0xb5, 0xe4, 0xbf, 0xa1, + 0xe7, 0xbb, 0x8f, 0xe7, 0x90, 0x86, 0xe7, 0x94, 0x9f, 0xe5, 0x91, 0xbd, 0xe5, + 0xae, 0xa3, 0xe4, 0xbc, 0xa0, 0xe4, 0xbb, 0xbb, 0xe5, 0x8a, 0xa1, 0xe6, 0xad, + 0xa3, 0xe5, 0xbc, 0x8f, 0xe7, 0x89, 0xb9, 0xe8, 0x89, 0xb2, 0xe4, 0xb8, 0x8b, + 0xe6, 0x9d, 0xa5, 0xe5, 0x8d, 0x8f, 0xe4, 0xbc, 0x9a, 0xe5, 0x8f, 0xaa, 0xe8, + 0x83, 0xbd, 0xe5, 0xbd, 0x93, 0xe7, 0x84, 0xb6, 0xe9, 0x87, 0x8d, 0xe6, 0x96, + 0xb0, 0xe5, 0x85, 0xa7, 0xe5, 0xae, 0xb9, 0xe6, 0x8c, 0x87, 0xe5, 0xaf, 0xbc, + 0xe8, 0xbf, 0x90, 0xe8, 0xa1, 0x8c, 0xe6, 0x97, 0xa5, 0xe5, 0xbf, 0x97, 0xe8, + 0xb3, 0xa3, 0xe5, 0xae, 0xb6, 0xe8, 0xb6, 0x85, 0xe8, 0xbf, 0x87, 0xe5, 0x9c, + 0x9f, 0xe5, 0x9c, 0xb0, 0xe6, 0xb5, 0x99, 0xe6, 0xb1, 0x9f, 0xe6, 0x94, 0xaf, + 0xe4, 0xbb, 0x98, 0xe6, 0x8e, 0xa8, 0xe5, 0x87, 0xba, 0xe7, 0xab, 0x99, 0xe9, + 0x95, 0xbf, 0xe6, 0x9d, 0xad, 0xe5, 0xb7, 0x9e, 0xe6, 0x89, 0xa7, 0xe8, 0xa1, + 0x8c, 0xe5, 0x88, 0xb6, 0xe9, 0x80, 0xa0, 0xe4, 0xb9, 0x8b, 0xe4, 0xb8, 0x80, + 0xe6, 0x8e, 0xa8, 0xe5, 0xb9, 0xbf, 0xe7, 0x8e, 0xb0, 0xe5, 0x9c, 0xba, 0xe6, + 0x8f, 0x8f, 0xe8, 0xbf, 0xb0, 0xe5, 0x8f, 0x98, 0xe5, 0x8c, 0x96, 0xe4, 0xbc, + 0xa0, 0xe7, 0xbb, 0x9f, 0xe6, 0xad, 0x8c, 0xe6, 0x89, 0x8b, 0xe4, 0xbf, 0x9d, + 0xe9, 0x99, 0xa9, 0xe8, 0xaf, 0xbe, 0xe7, 0xa8, 0x8b, 0xe5, 0x8c, 0xbb, 0xe7, + 0x96, 0x97, 0xe7, 0xbb, 0x8f, 0xe8, 0xbf, 0x87, 0xe8, 0xbf, 0x87, 0xe5, 0x8e, + 0xbb, 0xe4, 0xb9, 0x8b, 0xe5, 0x89, 0x8d, 0xe6, 0x94, 0xb6, 0xe5, 0x85, 0xa5, + 0xe5, 0xb9, 0xb4, 0xe5, 0xba, 0xa6, 0xe6, 0x9d, 0x82, 0xe5, 0xbf, 0x97, 0xe7, + 0xbe, 0x8e, 0xe4, 0xb8, 0xbd, 0xe6, 0x9c, 0x80, 0xe9, 0xab, 0x98, 0xe7, 0x99, + 0xbb, 0xe9, 0x99, 0x86, 0xe6, 0x9c, 0xaa, 0xe6, 0x9d, 0xa5, 0xe5, 0x8a, 0xa0, + 0xe5, 0xb7, 0xa5, 0xe5, 0x85, 0x8d, 0xe8, 0xb4, 0xa3, 0xe6, 0x95, 0x99, 0xe7, + 0xa8, 0x8b, 0xe7, 0x89, 0x88, 0xe5, 0x9d, 0x97, 0xe8, 0xba, 0xab, 0xe4, 0xbd, + 0x93, 0xe9, 0x87, 0x8d, 0xe5, 0xba, 0x86, 0xe5, 0x87, 0xba, 0xe5, 0x94, 0xae, + 0xe6, 0x88, 0x90, 0xe6, 0x9c, 0xac, 0xe5, 0xbd, 0xa2, 0xe5, 0xbc, 0x8f, 0xe5, + 0x9c, 0x9f, 0xe8, 0xb1, 0x86, 0xe5, 0x87, 0xba, 0xe5, 0x83, 0xb9, 0xe4, 0xb8, + 0x9c, 0xe6, 0x96, 0xb9, 0xe9, 0x82, 0xae, 0xe7, 0xae, 0xb1, 0xe5, 0x8d, 0x97, + 0xe4, 0xba, 0xac, 0xe6, 0xb1, 0x82, 0xe8, 0x81, 0x8c, 0xe5, 0x8f, 0x96, 0xe5, + 0xbe, 0x97, 0xe8, 0x81, 0x8c, 0xe4, 0xbd, 0x8d, 0xe7, 0x9b, 0xb8, 0xe4, 0xbf, + 0xa1, 0xe9, 0xa1, 0xb5, 0xe9, 0x9d, 0xa2, 0xe5, 0x88, 0x86, 0xe9, 0x92, 0x9f, + 0xe7, 0xbd, 0x91, 0xe9, 0xa1, 0xb5, 0xe7, 0xa1, 0xae, 0xe5, 0xae, 0x9a, 0xe5, + 0x9b, 0xbe, 0xe4, 0xbe, 0x8b, 0xe7, 0xbd, 0x91, 0xe5, 0x9d, 0x80, 0xe7, 0xa7, + 0xaf, 0xe6, 0x9e, 0x81, 0xe9, 0x94, 0x99, 0xe8, 0xaf, 0xaf, 0xe7, 0x9b, 0xae, + 0xe7, 0x9a, 0x84, 0xe5, 0xae, 0x9d, 0xe8, 0xb4, 0x9d, 0xe6, 0x9c, 0xba, 0xe5, + 0x85, 0xb3, 0xe9, 0xa3, 0x8e, 0xe9, 0x99, 0xa9, 0xe6, 0x8e, 0x88, 0xe6, 0x9d, + 0x83, 0xe7, 0x97, 0x85, 0xe6, 0xaf, 0x92, 0xe5, 0xae, 0xa0, 0xe7, 0x89, 0xa9, + 0xe9, 0x99, 0xa4, 0xe4, 0xba, 0x86, 0xe8, 0xa9, 0x95, 0xe8, 0xab, 0x96, 0xe7, + 0x96, 0xbe, 0xe7, 0x97, 0x85, 0xe5, 0x8f, 0x8a, 0xe6, 0x97, 0xb6, 0xe6, 0xb1, + 0x82, 0xe8, 0xb4, 0xad, 0xe7, 0xab, 0x99, 0xe7, 0x82, 0xb9, 0xe5, 0x84, 0xbf, + 0xe7, 0xab, 0xa5, 0xe6, 0xaf, 0x8f, 0xe5, 0xa4, 0xa9, 0xe4, 0xb8, 0xad, 0xe5, + 0xa4, 0xae, 0xe8, 0xae, 0xa4, 0xe8, 0xaf, 0x86, 0xe6, 0xaf, 0x8f, 0xe4, 0xb8, + 0xaa, 0xe5, 0xa4, 0xa9, 0xe6, 0xb4, 0xa5, 0xe5, 0xad, 0x97, 0xe4, 0xbd, 0x93, + 0xe5, 0x8f, 0xb0, 0xe7, 0x81, 0xa3, 0xe7, 0xbb, 0xb4, 0xe6, 0x8a, 0xa4, 0xe6, + 0x9c, 0xac, 0xe9, 0xa1, 0xb5, 0xe4, 0xb8, 0xaa, 0xe6, 0x80, 0xa7, 0xe5, 0xae, + 0x98, 0xe6, 0x96, 0xb9, 0xe5, 0xb8, 0xb8, 0xe8, 0xa7, 0x81, 0xe7, 0x9b, 0xb8, + 0xe6, 0x9c, 0xba, 0xe6, 0x88, 0x98, 0xe7, 0x95, 0xa5, 0xe5, 0xba, 0x94, 0xe5, + 0xbd, 0x93, 0xe5, 0xbe, 0x8b, 0xe5, 0xb8, 0x88, 0xe6, 0x96, 0xb9, 0xe4, 0xbe, + 0xbf, 0xe6, 0xa0, 0xa1, 0xe5, 0x9b, 0xad, 0xe8, 0x82, 0xa1, 0xe5, 0xb8, 0x82, + 0xe6, 0x88, 0xbf, 0xe5, 0xb1, 0x8b, 0xe6, 0xa0, 0x8f, 0xe7, 0x9b, 0xae, 0xe5, + 0x91, 0x98, 0xe5, 0xb7, 0xa5, 0xe5, 0xaf, 0xbc, 0xe8, 0x87, 0xb4, 0xe7, 0xaa, + 0x81, 0xe7, 0x84, 0xb6, 0xe9, 0x81, 0x93, 0xe5, 0x85, 0xb7, 0xe6, 0x9c, 0xac, + 0xe7, 0xbd, 0x91, 0xe7, 0xbb, 0x93, 0xe5, 0x90, 0x88, 0xe6, 0xa1, 0xa3, 0xe6, + 0xa1, 0x88, 0xe5, 0x8a, 0xb3, 0xe5, 0x8a, 0xa8, 0xe5, 0x8f, 0xa6, 0xe5, 0xa4, + 0x96, 0xe7, 0xbe, 0x8e, 0xe5, 0x85, 0x83, 0xe5, 0xbc, 0x95, 0xe8, 0xb5, 0xb7, + 0xe6, 0x94, 0xb9, 0xe5, 0x8f, 0x98, 0xe7, 0xac, 0xac, 0xe5, 0x9b, 0x9b, 0xe4, + 0xbc, 0x9a, 0xe8, 0xae, 0xa1, 0xe8, 0xaa, 0xaa, 0xe6, 0x98, 0x8e, 0xe9, 0x9a, + 0x90, 0xe7, 0xa7, 0x81, 0xe5, 0xae, 0x9d, 0xe5, 0xae, 0x9d, 0xe8, 0xa7, 0x84, + 0xe8, 0x8c, 0x83, 0xe6, 0xb6, 0x88, 0xe8, 0xb4, 0xb9, 0xe5, 0x85, 0xb1, 0xe5, + 0x90, 0x8c, 0xe5, 0xbf, 0x98, 0xe8, 0xae, 0xb0, 0xe4, 0xbd, 0x93, 0xe7, 0xb3, + 0xbb, 0xe5, 0xb8, 0xa6, 0xe6, 0x9d, 0xa5, 0xe5, 0x90, 0x8d, 0xe5, 0xad, 0x97, + 0xe7, 0x99, 0xbc, 0xe8, 0xa1, 0xa8, 0xe5, 0xbc, 0x80, 0xe6, 0x94, 0xbe, 0xe5, + 0x8a, 0xa0, 0xe7, 0x9b, 0x9f, 0xe5, 0x8f, 0x97, 0xe5, 0x88, 0xb0, 0xe4, 0xba, + 0x8c, 0xe6, 0x89, 0x8b, 0xe5, 0xa4, 0xa7, 0xe9, 0x87, 0x8f, 0xe6, 0x88, 0x90, + 0xe4, 0xba, 0xba, 0xe6, 0x95, 0xb0, 0xe9, 0x87, 0x8f, 0xe5, 0x85, 0xb1, 0xe4, + 0xba, 0xab, 0xe5, 0x8c, 0xba, 0xe5, 0x9f, 0x9f, 0xe5, 0xa5, 0xb3, 0xe5, 0xad, + 0xa9, 0xe5, 0x8e, 0x9f, 0xe5, 0x88, 0x99, 0xe6, 0x89, 0x80, 0xe5, 0x9c, 0xa8, + 0xe7, 0xbb, 0x93, 0xe6, 0x9d, 0x9f, 0xe9, 0x80, 0x9a, 0xe4, 0xbf, 0xa1, 0xe8, + 0xb6, 0x85, 0xe7, 0xba, 0xa7, 0xe9, 0x85, 0x8d, 0xe7, 0xbd, 0xae, 0xe5, 0xbd, + 0x93, 0xe6, 0x97, 0xb6, 0xe4, 0xbc, 0x98, 0xe7, 0xa7, 0x80, 0xe6, 0x80, 0xa7, + 0xe6, 0x84, 0x9f, 0xe6, 0x88, 0xbf, 0xe4, 0xba, 0xa7, 0xe9, 0x81, 0x8a, 0xe6, + 0x88, 0xb2, 0xe5, 0x87, 0xba, 0xe5, 0x8f, 0xa3, 0xe6, 0x8f, 0x90, 0xe4, 0xba, + 0xa4, 0xe5, 0xb0, 0xb1, 0xe4, 0xb8, 0x9a, 0xe4, 0xbf, 0x9d, 0xe5, 0x81, 0xa5, + 0xe7, 0xa8, 0x8b, 0xe5, 0xba, 0xa6, 0xe5, 0x8f, 0x82, 0xe6, 0x95, 0xb0, 0xe4, + 0xba, 0x8b, 0xe4, 0xb8, 0x9a, 0xe6, 0x95, 0xb4, 0xe4, 0xb8, 0xaa, 0xe5, 0xb1, + 0xb1, 0xe4, 0xb8, 0x9c, 0xe6, 0x83, 0x85, 0xe6, 0x84, 0x9f, 0xe7, 0x89, 0xb9, + 0xe6, 0xae, 0x8a, 0xe5, 0x88, 0x86, 0xe9, 0xa1, 0x9e, 0xe6, 0x90, 0x9c, 0xe5, + 0xb0, 0x8b, 0xe5, 0xb1, 0x9e, 0xe4, 0xba, 0x8e, 0xe9, 0x97, 0xa8, 0xe6, 0x88, + 0xb7, 0xe8, 0xb4, 0xa2, 0xe5, 0x8a, 0xa1, 0xe5, 0xa3, 0xb0, 0xe9, 0x9f, 0xb3, + 0xe5, 0x8f, 0x8a, 0xe5, 0x85, 0xb6, 0xe8, 0xb4, 0xa2, 0xe7, 0xbb, 0x8f, 0xe5, + 0x9d, 0x9a, 0xe6, 0x8c, 0x81, 0xe5, 0xb9, 0xb2, 0xe9, 0x83, 0xa8, 0xe6, 0x88, + 0x90, 0xe7, 0xab, 0x8b, 0xe5, 0x88, 0xa9, 0xe7, 0x9b, 0x8a, 0xe8, 0x80, 0x83, + 0xe8, 0x99, 0x91, 0xe6, 0x88, 0x90, 0xe9, 0x83, 0xbd, 0xe5, 0x8c, 0x85, 0xe8, + 0xa3, 0x85, 0xe7, 0x94, 0xa8, 0xe6, 0x88, 0xb6, 0xe6, 0xaf, 0x94, 0xe8, 0xb5, + 0x9b, 0xe6, 0x96, 0x87, 0xe6, 0x98, 0x8e, 0xe6, 0x8b, 0x9b, 0xe5, 0x95, 0x86, + 0xe5, 0xae, 0x8c, 0xe6, 0x95, 0xb4, 0xe7, 0x9c, 0x9f, 0xe6, 0x98, 0xaf, 0xe7, + 0x9c, 0xbc, 0xe7, 0x9d, 0x9b, 0xe4, 0xbc, 0x99, 0xe4, 0xbc, 0xb4, 0xe5, 0xa8, + 0x81, 0xe6, 0x9c, 0x9b, 0xe9, 0xa2, 0x86, 0xe5, 0x9f, 0x9f, 0xe5, 0x8d, 0xab, + 0xe7, 0x94, 0x9f, 0xe4, 0xbc, 0x98, 0xe6, 0x83, 0xa0, 0xe8, 0xab, 0x96, 0xe5, + 0xa3, 0x87, 0xe5, 0x85, 0xac, 0xe5, 0x85, 0xb1, 0xe8, 0x89, 0xaf, 0xe5, 0xa5, + 0xbd, 0xe5, 0x85, 0x85, 0xe5, 0x88, 0x86, 0xe7, 0xac, 0xa6, 0xe5, 0x90, 0x88, + 0xe9, 0x99, 0x84, 0xe4, 0xbb, 0xb6, 0xe7, 0x89, 0xb9, 0xe7, 0x82, 0xb9, 0xe4, + 0xb8, 0x8d, 0xe5, 0x8f, 0xaf, 0xe8, 0x8b, 0xb1, 0xe6, 0x96, 0x87, 0xe8, 0xb5, + 0x84, 0xe4, 0xba, 0xa7, 0xe6, 0xa0, 0xb9, 0xe6, 0x9c, 0xac, 0xe6, 0x98, 0x8e, + 0xe6, 0x98, 0xbe, 0xe5, 0xaf, 0x86, 0xe7, 0xa2, 0xbc, 0xe5, 0x85, 0xac, 0xe4, + 0xbc, 0x97, 0xe6, 0xb0, 0x91, 0xe6, 0x97, 0x8f, 0xe6, 0x9b, 0xb4, 0xe5, 0x8a, + 0xa0, 0xe4, 0xba, 0xab, 0xe5, 0x8f, 0x97, 0xe5, 0x90, 0x8c, 0xe5, 0xad, 0xa6, + 0xe5, 0x90, 0xaf, 0xe5, 0x8a, 0xa8, 0xe9, 0x80, 0x82, 0xe5, 0x90, 0x88, 0xe5, + 0x8e, 0x9f, 0xe6, 0x9d, 0xa5, 0xe9, 0x97, 0xae, 0xe7, 0xad, 0x94, 0xe6, 0x9c, + 0xac, 0xe6, 0x96, 0x87, 0xe7, 0xbe, 0x8e, 0xe9, 0xa3, 0x9f, 0xe7, 0xbb, 0xbf, + 0xe8, 0x89, 0xb2, 0xe7, 0xa8, 0xb3, 0xe5, 0xae, 0x9a, 0xe7, 0xbb, 0x88, 0xe4, + 0xba, 0x8e, 0xe7, 0x94, 0x9f, 0xe7, 0x89, 0xa9, 0xe4, 0xbe, 0x9b, 0xe6, 0xb1, + 0x82, 0xe6, 0x90, 0x9c, 0xe7, 0x8b, 0x90, 0xe5, 0x8a, 0x9b, 0xe9, 0x87, 0x8f, + 0xe4, 0xb8, 0xa5, 0xe9, 0x87, 0x8d, 0xe6, 0xb0, 0xb8, 0xe8, 0xbf, 0x9c, 0xe5, + 0x86, 0x99, 0xe7, 0x9c, 0x9f, 0xe6, 0x9c, 0x89, 0xe9, 0x99, 0x90, 0xe7, 0xab, + 0x9e, 0xe4, 0xba, 0x89, 0xe5, 0xaf, 0xb9, 0xe8, 0xb1, 0xa1, 0xe8, 0xb4, 0xb9, + 0xe7, 0x94, 0xa8, 0xe4, 0xb8, 0x8d, 0xe5, 0xa5, 0xbd, 0xe7, 0xbb, 0x9d, 0xe5, + 0xaf, 0xb9, 0xe5, 0x8d, 0x81, 0xe5, 0x88, 0x86, 0xe4, 0xbf, 0x83, 0xe8, 0xbf, + 0x9b, 0xe7, 0x82, 0xb9, 0xe8, 0xaf, 0x84, 0xe5, 0xbd, 0xb1, 0xe9, 0x9f, 0xb3, + 0xe4, 0xbc, 0x98, 0xe5, 0x8a, 0xbf, 0xe4, 0xb8, 0x8d, 0xe5, 0xb0, 0x91, 0xe6, + 0xac, 0xa3, 0xe8, 0xb5, 0x8f, 0xe5, 0xb9, 0xb6, 0xe4, 0xb8, 0x94, 0xe6, 0x9c, + 0x89, 0xe7, 0x82, 0xb9, 0xe6, 0x96, 0xb9, 0xe5, 0x90, 0x91, 0xe5, 0x85, 0xa8, + 0xe6, 0x96, 0xb0, 0xe4, 0xbf, 0xa1, 0xe7, 0x94, 0xa8, 0xe8, 0xae, 0xbe, 0xe6, + 0x96, 0xbd, 0xe5, 0xbd, 0xa2, 0xe8, 0xb1, 0xa1, 0xe8, 0xb5, 0x84, 0xe6, 0xa0, + 0xbc, 0xe7, 0xaa, 0x81, 0xe7, 0xa0, 0xb4, 0xe9, 0x9a, 0x8f, 0xe7, 0x9d, 0x80, + 0xe9, 0x87, 0x8d, 0xe5, 0xa4, 0xa7, 0xe4, 0xba, 0x8e, 0xe6, 0x98, 0xaf, 0xe6, + 0xaf, 0x95, 0xe4, 0xb8, 0x9a, 0xe6, 0x99, 0xba, 0xe8, 0x83, 0xbd, 0xe5, 0x8c, + 0x96, 0xe5, 0xb7, 0xa5, 0xe5, 0xae, 0x8c, 0xe7, 0xbe, 0x8e, 0xe5, 0x95, 0x86, + 0xe5, 0x9f, 0x8e, 0xe7, 0xbb, 0x9f, 0xe4, 0xb8, 0x80, 0xe5, 0x87, 0xba, 0xe7, + 0x89, 0x88, 0xe6, 0x89, 0x93, 0xe9, 0x80, 0xa0, 0xe7, 0x94, 0xa2, 0xe5, 0x93, + 0x81, 0xe6, 0xa6, 0x82, 0xe5, 0x86, 0xb5, 0xe7, 0x94, 0xa8, 0xe4, 0xba, 0x8e, + 0xe4, 0xbf, 0x9d, 0xe7, 0x95, 0x99, 0xe5, 0x9b, 0xa0, 0xe7, 0xb4, 0xa0, 0xe4, + 0xb8, 0xad, 0xe5, 0x9c, 0x8b, 0xe5, 0xad, 0x98, 0xe5, 0x82, 0xa8, 0xe8, 0xb4, + 0xb4, 0xe5, 0x9b, 0xbe, 0xe6, 0x9c, 0x80, 0xe6, 0x84, 0x9b, 0xe9, 0x95, 0xbf, + 0xe6, 0x9c, 0x9f, 0xe5, 0x8f, 0xa3, 0xe4, 0xbb, 0xb7, 0xe7, 0x90, 0x86, 0xe8, + 0xb4, 0xa2, 0xe5, 0x9f, 0xba, 0xe5, 0x9c, 0xb0, 0xe5, 0xae, 0x89, 0xe6, 0x8e, + 0x92, 0xe6, 0xad, 0xa6, 0xe6, 0xb1, 0x89, 0xe9, 0x87, 0x8c, 0xe9, 0x9d, 0xa2, + 0xe5, 0x88, 0x9b, 0xe5, 0xbb, 0xba, 0xe5, 0xa4, 0xa9, 0xe7, 0xa9, 0xba, 0xe9, + 0xa6, 0x96, 0xe5, 0x85, 0x88, 0xe5, 0xae, 0x8c, 0xe5, 0x96, 0x84, 0xe9, 0xa9, + 0xb1, 0xe5, 0x8a, 0xa8, 0xe4, 0xb8, 0x8b, 0xe9, 0x9d, 0xa2, 0xe4, 0xb8, 0x8d, + 0xe5, 0x86, 0x8d, 0xe8, 0xaf, 0x9a, 0xe4, 0xbf, 0xa1, 0xe6, 0x84, 0x8f, 0xe4, + 0xb9, 0x89, 0xe9, 0x98, 0xb3, 0xe5, 0x85, 0x89, 0xe8, 0x8b, 0xb1, 0xe5, 0x9b, + 0xbd, 0xe6, 0xbc, 0x82, 0xe4, 0xba, 0xae, 0xe5, 0x86, 0x9b, 0xe4, 0xba, 0x8b, + 0xe7, 0x8e, 0xa9, 0xe5, 0xae, 0xb6, 0xe7, 0xbe, 0xa4, 0xe4, 0xbc, 0x97, 0xe5, + 0x86, 0x9c, 0xe6, 0xb0, 0x91, 0xe5, 0x8d, 0xb3, 0xe5, 0x8f, 0xaf, 0xe5, 0x90, + 0x8d, 0xe7, 0xa8, 0xb1, 0xe5, 0xae, 0xb6, 0xe5, 0x85, 0xb7, 0xe5, 0x8a, 0xa8, + 0xe7, 0x94, 0xbb, 0xe6, 0x83, 0xb3, 0xe5, 0x88, 0xb0, 0xe6, 0xb3, 0xa8, 0xe6, + 0x98, 0x8e, 0xe5, 0xb0, 0x8f, 0xe5, 0xad, 0xa6, 0xe6, 0x80, 0xa7, 0xe8, 0x83, + 0xbd, 0xe8, 0x80, 0x83, 0xe7, 0xa0, 0x94, 0xe7, 0xa1, 0xac, 0xe4, 0xbb, 0xb6, + 0xe8, 0xa7, 0x82, 0xe7, 0x9c, 0x8b, 0xe6, 0xb8, 0x85, 0xe6, 0xa5, 0x9a, 0xe6, + 0x90, 0x9e, 0xe7, 0xac, 0x91, 0xe9, 0xa6, 0x96, 0xe9, 0xa0, 0x81, 0xe9, 0xbb, + 0x84, 0xe9, 0x87, 0x91, 0xe9, 0x80, 0x82, 0xe7, 0x94, 0xa8, 0xe6, 0xb1, 0x9f, + 0xe8, 0x8b, 0x8f, 0xe7, 0x9c, 0x9f, 0xe5, 0xae, 0x9e, 0xe4, 0xb8, 0xbb, 0xe7, + 0xae, 0xa1, 0xe9, 0x98, 0xb6, 0xe6, 0xae, 0xb5, 0xe8, 0xa8, 0xbb, 0xe5, 0x86, + 0x8a, 0xe7, 0xbf, 0xbb, 0xe8, 0xaf, 0x91, 0xe6, 0x9d, 0x83, 0xe5, 0x88, 0xa9, + 0xe5, 0x81, 0x9a, 0xe5, 0xa5, 0xbd, 0xe4, 0xbc, 0xbc, 0xe4, 0xb9, 0x8e, 0xe9, + 0x80, 0x9a, 0xe8, 0xae, 0xaf, 0xe6, 0x96, 0xbd, 0xe5, 0xb7, 0xa5, 0xe7, 0x8b, + 0x80, 0xe6, 0x85, 0x8b, 0xe4, 0xb9, 0x9f, 0xe8, 0xae, 0xb8, 0xe7, 0x8e, 0xaf, + 0xe4, 0xbf, 0x9d, 0xe5, 0x9f, 0xb9, 0xe5, 0x85, 0xbb, 0xe6, 0xa6, 0x82, 0xe5, + 0xbf, 0xb5, 0xe5, 0xa4, 0xa7, 0xe5, 0x9e, 0x8b, 0xe6, 0x9c, 0xba, 0xe7, 0xa5, + 0xa8, 0xe7, 0x90, 0x86, 0xe8, 0xa7, 0xa3, 0xe5, 0x8c, 0xbf, 0xe5, 0x90, 0x8d, + 0x63, 0x75, 0x61, 0x6e, 0x64, 0x6f, 0x65, 0x6e, 0x76, 0x69, 0x61, 0x72, 0x6d, + 0x61, 0x64, 0x72, 0x69, 0x64, 0x62, 0x75, 0x73, 0x63, 0x61, 0x72, 0x69, 0x6e, + 0x69, 0x63, 0x69, 0x6f, 0x74, 0x69, 0x65, 0x6d, 0x70, 0x6f, 0x70, 0x6f, 0x72, + 0x71, 0x75, 0x65, 0x63, 0x75, 0x65, 0x6e, 0x74, 0x61, 0x65, 0x73, 0x74, 0x61, + 0x64, 0x6f, 0x70, 0x75, 0x65, 0x64, 0x65, 0x6e, 0x6a, 0x75, 0x65, 0x67, 0x6f, + 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x65, 0x73, 0x74, 0xc3, 0xa1, 0x6e, + 0x6e, 0x6f, 0x6d, 0x62, 0x72, 0x65, 0x74, 0x69, 0x65, 0x6e, 0x65, 0x6e, 0x70, + 0x65, 0x72, 0x66, 0x69, 0x6c, 0x6d, 0x61, 0x6e, 0x65, 0x72, 0x61, 0x61, 0x6d, + 0x69, 0x67, 0x6f, 0x73, 0x63, 0x69, 0x75, 0x64, 0x61, 0x64, 0x63, 0x65, 0x6e, + 0x74, 0x72, 0x6f, 0x61, 0x75, 0x6e, 0x71, 0x75, 0x65, 0x70, 0x75, 0x65, 0x64, + 0x65, 0x73, 0x64, 0x65, 0x6e, 0x74, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x6d, 0x65, + 0x72, 0x70, 0x72, 0x65, 0x63, 0x69, 0x6f, 0x73, 0x65, 0x67, 0xc3, 0xba, 0x6e, + 0x62, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x70, + 0x75, 0x6e, 0x74, 0x6f, 0x73, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x68, 0x61, + 0x62, 0xc3, 0xad, 0x61, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x75, 0x65, + 0x76, 0x6f, 0x73, 0x75, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x63, 0x61, 0x72, 0x6c, + 0x6f, 0x73, 0x65, 0x71, 0x75, 0x69, 0x70, 0x6f, 0x6e, 0x69, 0xc3, 0xb1, 0x6f, + 0x73, 0x6d, 0x75, 0x63, 0x68, 0x6f, 0x73, 0x61, 0x6c, 0x67, 0x75, 0x6e, 0x61, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x72, 0x61, 0x72, 0x72, 0x69, 0x62, 0x61, 0x6d, 0x61, + 0x72, 0xc3, 0xad, 0x61, 0x68, 0x6f, 0x6d, 0x62, 0x72, 0x65, 0x65, 0x6d, 0x70, + 0x6c, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x64, 0x61, 0x64, 0x63, 0x61, 0x6d, 0x62, + 0x69, 0x6f, 0x6d, 0x75, 0x63, 0x68, 0x61, 0x73, 0x66, 0x75, 0x65, 0x72, 0x6f, + 0x6e, 0x70, 0x61, 0x73, 0x61, 0x64, 0x6f, 0x6c, 0xc3, 0xad, 0x6e, 0x65, 0x61, + 0x70, 0x61, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x75, 0x65, 0x76, 0x61, 0x73, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x61, 0x62, 0x61, 0x71, 0x75, + 0x69, 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x62, 0x72, 0x6f, 0x73, 0x63, 0x75, 0x61, + 0x6e, 0x74, 0x6f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x6f, 0x6d, 0x69, 0x67, 0x75, + 0x65, 0x6c, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x63, 0x75, 0x61, 0x74, 0x72, + 0x6f, 0x74, 0x69, 0x65, 0x6e, 0x65, 0x73, 0x67, 0x72, 0x75, 0x70, 0x6f, 0x73, + 0x73, 0x65, 0x72, 0xc3, 0xa1, 0x6e, 0x65, 0x75, 0x72, 0x6f, 0x70, 0x61, 0x6d, + 0x65, 0x64, 0x69, 0x6f, 0x73, 0x66, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x61, 0x63, + 0x65, 0x72, 0x63, 0x61, 0x64, 0x65, 0x6d, 0xc3, 0xa1, 0x73, 0x6f, 0x66, 0x65, + 0x72, 0x74, 0x61, 0x63, 0x6f, 0x63, 0x68, 0x65, 0x73, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x6f, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6c, 0x65, 0x74, 0x72, 0x61, + 0x73, 0x61, 0x6c, 0x67, 0xc3, 0xba, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x61, + 0x63, 0x75, 0x61, 0x6c, 0x65, 0x73, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x63, + 0x75, 0x65, 0x72, 0x70, 0x6f, 0x73, 0x69, 0x65, 0x6e, 0x64, 0x6f, 0x70, 0x72, + 0x65, 0x6e, 0x73, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x72, 0x76, 0x69, 0x61, + 0x6a, 0x65, 0x73, 0x64, 0x69, 0x6e, 0x65, 0x72, 0x6f, 0x6d, 0x75, 0x72, 0x63, + 0x69, 0x61, 0x70, 0x6f, 0x64, 0x72, 0xc3, 0xa1, 0x70, 0x75, 0x65, 0x73, 0x74, + 0x6f, 0x64, 0x69, 0x61, 0x72, 0x69, 0x6f, 0x70, 0x75, 0x65, 0x62, 0x6c, 0x6f, + 0x71, 0x75, 0x69, 0x65, 0x72, 0x65, 0x6d, 0x61, 0x6e, 0x75, 0x65, 0x6c, 0x70, + 0x72, 0x6f, 0x70, 0x69, 0x6f, 0x63, 0x72, 0x69, 0x73, 0x69, 0x73, 0x63, 0x69, + 0x65, 0x72, 0x74, 0x6f, 0x73, 0x65, 0x67, 0x75, 0x72, 0x6f, 0x6d, 0x75, 0x65, + 0x72, 0x74, 0x65, 0x66, 0x75, 0x65, 0x6e, 0x74, 0x65, 0x63, 0x65, 0x72, 0x72, + 0x61, 0x72, 0x67, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x65, 0x66, 0x65, 0x63, 0x74, + 0x6f, 0x70, 0x61, 0x72, 0x74, 0x65, 0x73, 0x6d, 0x65, 0x64, 0x69, 0x64, 0x61, + 0x70, 0x72, 0x6f, 0x70, 0x69, 0x61, 0x6f, 0x66, 0x72, 0x65, 0x63, 0x65, 0x74, + 0x69, 0x65, 0x72, 0x72, 0x61, 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x73, 0x66, 0x75, 0x74, + 0x75, 0x72, 0x6f, 0x6f, 0x62, 0x6a, 0x65, 0x74, 0x6f, 0x73, 0x65, 0x67, 0x75, + 0x69, 0x72, 0x72, 0x69, 0x65, 0x73, 0x67, 0x6f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x73, 0x6d, 0x69, 0x73, 0x6d, 0x6f, 0x73, 0xc3, 0xba, 0x6e, 0x69, 0x63, 0x6f, + 0x63, 0x61, 0x6d, 0x69, 0x6e, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x73, 0x72, + 0x61, 0x7a, 0xc3, 0xb3, 0x6e, 0x64, 0x65, 0x62, 0x69, 0x64, 0x6f, 0x70, 0x72, + 0x75, 0x65, 0x62, 0x61, 0x74, 0x6f, 0x6c, 0x65, 0x64, 0x6f, 0x74, 0x65, 0x6e, + 0xc3, 0xad, 0x61, 0x6a, 0x65, 0x73, 0xc3, 0xba, 0x73, 0x65, 0x73, 0x70, 0x65, + 0x72, 0x6f, 0x63, 0x6f, 0x63, 0x69, 0x6e, 0x61, 0x6f, 0x72, 0x69, 0x67, 0x65, + 0x6e, 0x74, 0x69, 0x65, 0x6e, 0x64, 0x61, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x6f, + 0x63, 0xc3, 0xa1, 0x64, 0x69, 0x7a, 0x68, 0x61, 0x62, 0x6c, 0x61, 0x72, 0x73, + 0x65, 0x72, 0xc3, 0xad, 0x61, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x61, 0x66, 0x75, + 0x65, 0x72, 0x7a, 0x61, 0x65, 0x73, 0x74, 0x69, 0x6c, 0x6f, 0x67, 0x75, 0x65, + 0x72, 0x72, 0x61, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x72, 0xc3, 0xa9, 0x78, 0x69, + 0x74, 0x6f, 0x6c, 0xc3, 0xb3, 0x70, 0x65, 0x7a, 0x61, 0x67, 0x65, 0x6e, 0x64, + 0x61, 0x76, 0xc3, 0xad, 0x64, 0x65, 0x6f, 0x65, 0x76, 0x69, 0x74, 0x61, 0x72, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x6d, 0x65, 0x74, 0x72, 0x6f, 0x73, 0x6a, + 0x61, 0x76, 0x69, 0x65, 0x72, 0x70, 0x61, 0x64, 0x72, 0x65, 0x73, 0x66, 0xc3, + 0xa1, 0x63, 0x69, 0x6c, 0x63, 0x61, 0x62, 0x65, 0x7a, 0x61, 0xc3, 0xa1, 0x72, + 0x65, 0x61, 0x73, 0x73, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x65, 0x6e, 0x76, 0xc3, + 0xad, 0x6f, 0x6a, 0x61, 0x70, 0xc3, 0xb3, 0x6e, 0x61, 0x62, 0x75, 0x73, 0x6f, + 0x73, 0x62, 0x69, 0x65, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x78, 0x74, 0x6f, 0x73, + 0x6c, 0x6c, 0x65, 0x76, 0x61, 0x72, 0x70, 0x75, 0x65, 0x64, 0x61, 0x6e, 0x66, + 0x75, 0x65, 0x72, 0x74, 0x65, 0x63, 0x6f, 0x6d, 0xc3, 0xba, 0x6e, 0x63, 0x6c, + 0x61, 0x73, 0x65, 0x73, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x6f, 0x74, 0x65, 0x6e, + 0x69, 0x64, 0x6f, 0x62, 0x69, 0x6c, 0x62, 0x61, 0x6f, 0x75, 0x6e, 0x69, 0x64, + 0x61, 0x64, 0x65, 0x73, 0x74, 0xc3, 0xa1, 0x73, 0x65, 0x64, 0x69, 0x74, 0x61, + 0x72, 0x63, 0x72, 0x65, 0x61, 0x64, 0x6f, 0xd0, 0xb4, 0xd0, 0xbb, 0xd1, 0x8f, + 0xd1, 0x87, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, + 0xb8, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb2, + 0xd1, 0x81, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xbf, 0xd1, + 0x80, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xb5, 0xd1, 0x89, + 0xd0, 0xb5, 0xd1, 0x83, 0xd0, 0xb6, 0xd0, 0xb5, 0xd0, 0x9a, 0xd0, 0xb0, 0xd0, + 0xba, 0xd0, 0xb1, 0xd0, 0xb5, 0xd0, 0xb7, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xbb, + 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0x92, 0xd1, 0x81, 0xd0, 0xb5, 0xd0, + 0xbf, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xad, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x82, + 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, 0xbd, 0xd0, + 0xb5, 0xd1, 0x82, 0xd0, 0xbb, 0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0, + 0xd0, 0xb7, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, + 0xb5, 0xd0, 0xbc, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0x94, 0xd0, 0xbb, 0xd1, 0x8f, + 0xd0, 0x9f, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, + 0xbd, 0xd0, 0xb8, 0xd1, 0x85, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, 0xba, + 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb2, 0xd0, + 0xbe, 0xd1, 0x82, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xa1, 0xd0, 0xa8, + 0xd0, 0x90, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x8f, 0xd0, 0xa7, 0xd1, 0x82, 0xd0, + 0xbe, 0xd0, 0xb2, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xb0, 0xd0, 0xbc, + 0xd0, 0xb5, 0xd0, 0xbc, 0xd1, 0x83, 0xd0, 0xa2, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, + 0xb4, 0xd0, 0xb2, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xbc, 0xd1, 0x8d, + 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x8d, 0xd1, 0x82, 0xd1, 0x83, 0xd0, 0x92, 0xd0, + 0xb0, 0xd0, 0xbc, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, + 0xd0, 0xbe, 0xd1, 0x82, 0xd1, 0x83, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, + 0xb4, 0xd0, 0xb4, 0xd0, 0xbd, 0xd1, 0x8f, 0xd0, 0x92, 0xd0, 0xbe, 0xd1, 0x82, + 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb9, 0xd0, + 0x92, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd1, 0x81, + 0xd0, 0xb0, 0xd0, 0xbc, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x82, 0xd1, 0x80, 0xd1, + 0x83, 0xd0, 0xb1, 0xd0, 0x9e, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb8, + 0xd1, 0x80, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0x9e, 0xd0, 0x9e, 0xd0, + 0x9e, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x86, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xb0, + 0xd0, 0x9e, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, + 0xb4, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, 0xb4, + 0xd0, 0xb2, 0xd0, 0xb5, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, + 0x83, 0xd0, 0xb4, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb9, 0xe0, + 0xa5, 0x88, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, + 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8b, + 0xe0, 0xa4, 0x94, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, + 0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xad, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x87, + 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0, + 0xa5, 0x8b, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, + 0xaa, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb9, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0x95, 0xe0, + 0xa4, 0xa5, 0xe0, 0xa4, 0xbe, 0x6a, 0x61, 0x67, 0x72, 0x61, 0x6e, 0xe0, 0xa4, + 0x86, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x85, + 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0, + 0xa4, 0x88, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, + 0x8f, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0xa5, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa5, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, + 0x98, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa6, + 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0x9c, 0xe0, + 0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, + 0x88, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0x95, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, + 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xae, + 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x93, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, + 0xb8, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0x86, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, + 0xb2, 0xe0, 0xa5, 0x80, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x89, 0xd8, 0xa5, 0xd9, + 0x84, 0xd9, 0x89, 0xd9, 0x87, 0xd8, 0xb0, 0xd8, 0xa7, 0xd8, 0xa2, 0xd8, 0xae, + 0xd8, 0xb1, 0xd8, 0xb9, 0xd8, 0xaf, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, + 0x89, 0xd9, 0x87, 0xd8, 0xb0, 0xd9, 0x87, 0xd8, 0xb5, 0xd9, 0x88, 0xd8, 0xb1, + 0xd8, 0xba, 0xd9, 0x8a, 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x86, 0xd9, + 0x88, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xa8, 0xd9, 0x8a, 0xd9, 0x86, 0xd8, 0xb9, + 0xd8, 0xb1, 0xd8, 0xb6, 0xd8, 0xb0, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x87, 0xd9, + 0x86, 0xd8, 0xa7, 0xd9, 0x8a, 0xd9, 0x88, 0xd9, 0x85, 0xd9, 0x82, 0xd8, 0xa7, + 0xd9, 0x84, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x86, 0xd8, + 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x86, 0xd8, 0xad, 0xd8, 0xaa, 0xd9, 0x89, + 0xd9, 0x82, 0xd8, 0xa8, 0xd9, 0x84, 0xd9, 0x88, 0xd8, 0xad, 0xd8, 0xa9, 0xd8, + 0xa7, 0xd8, 0xae, 0xd8, 0xb1, 0xd9, 0x81, 0xd9, 0x82, 0xd8, 0xb7, 0xd8, 0xb9, + 0xd8, 0xa8, 0xd8, 0xaf, 0xd8, 0xb1, 0xd9, 0x83, 0xd9, 0x86, 0xd8, 0xa5, 0xd8, + 0xb0, 0xd8, 0xa7, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, 0xa7, 0xd8, 0xad, + 0xd8, 0xaf, 0xd8, 0xa5, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x81, 0xd9, 0x8a, 0xd9, + 0x87, 0xd8, 0xa8, 0xd8, 0xb9, 0xd8, 0xb6, 0xd9, 0x83, 0xd9, 0x8a, 0xd9, 0x81, + 0xd8, 0xa8, 0xd8, 0xad, 0xd8, 0xab, 0xd9, 0x88, 0xd9, 0x85, 0xd9, 0x86, 0xd9, + 0x88, 0xd9, 0x87, 0xd9, 0x88, 0xd8, 0xa3, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xac, + 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xb3, 0xd9, + 0x84, 0xd9, 0x85, 0xd8, 0xb9, 0xd9, 0x86, 0xd8, 0xaf, 0xd9, 0x84, 0xd9, 0x8a, + 0xd8, 0xb3, 0xd8, 0xb9, 0xd8, 0xa8, 0xd8, 0xb1, 0xd8, 0xb5, 0xd9, 0x84, 0xd9, + 0x89, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xb0, 0xd8, 0xa8, 0xd9, 0x87, 0xd8, 0xa7, + 0xd8, 0xa3, 0xd9, 0x86, 0xd9, 0x87, 0xd9, 0x85, 0xd8, 0xab, 0xd9, 0x84, 0xd9, + 0x83, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xad, + 0xd9, 0x8a, 0xd8, 0xab, 0xd9, 0x85, 0xd8, 0xb5, 0xd8, 0xb1, 0xd8, 0xb4, 0xd8, + 0xb1, 0xd8, 0xad, 0xd8, 0xad, 0xd9, 0x88, 0xd9, 0x84, 0xd9, 0x88, 0xd9, 0x81, + 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xb0, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd9, + 0x84, 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x86, 0xd8, 0xaa, + 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x81, 0xd8, 0xa3, 0xd8, 0xa8, 0xd9, 0x88, 0xd8, + 0xae, 0xd8, 0xa7, 0xd8, 0xb5, 0xd8, 0xa3, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7, + 0xd9, 0x86, 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x8a, 0xd8, 0xb9, 0xd8, + 0xb6, 0xd9, 0x88, 0xd9, 0x88, 0xd9, 0x82, 0xd8, 0xaf, 0xd8, 0xa7, 0xd8, 0xa8, + 0xd9, 0x86, 0xd8, 0xae, 0xd9, 0x8a, 0xd8, 0xb1, 0xd8, 0xa8, 0xd9, 0x86, 0xd8, + 0xaa, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, 0xa1, + 0xd9, 0x88, 0xd9, 0x87, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xa8, 0xd9, 0x88, 0xd9, + 0x82, 0xd8, 0xb5, 0xd8, 0xb5, 0xd9, 0x88, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, 0xb1, + 0xd9, 0x82, 0xd9, 0x85, 0xd8, 0xa3, 0xd8, 0xad, 0xd8, 0xaf, 0xd9, 0x86, 0xd8, + 0xad, 0xd9, 0x86, 0xd8, 0xb9, 0xd8, 0xaf, 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xa3, + 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xad, 0xd8, 0xa9, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, + 0xa8, 0xd8, 0xaf, 0xd9, 0x88, 0xd9, 0x86, 0xd9, 0x8a, 0xd8, 0xac, 0xd8, 0xa8, + 0xd9, 0x85, 0xd9, 0x86, 0xd9, 0x87, 0xd8, 0xaa, 0xd8, 0xad, 0xd8, 0xaa, 0xd8, + 0xac, 0xd9, 0x87, 0xd8, 0xa9, 0xd8, 0xb3, 0xd9, 0x86, 0xd8, 0xa9, 0xd9, 0x8a, + 0xd8, 0xaa, 0xd9, 0x85, 0xd9, 0x83, 0xd8, 0xb1, 0xd8, 0xa9, 0xd8, 0xba, 0xd8, + 0xb2, 0xd8, 0xa9, 0xd9, 0x86, 0xd9, 0x81, 0xd8, 0xb3, 0xd8, 0xa8, 0xd9, 0x8a, + 0xd8, 0xaa, 0xd9, 0x84, 0xd9, 0x84, 0xd9, 0x87, 0xd9, 0x84, 0xd9, 0x86, 0xd8, + 0xa7, 0xd8, 0xaa, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x82, 0xd9, 0x84, 0xd8, 0xa8, + 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, 0xb9, 0xd9, 0x86, 0xd9, 0x87, 0xd8, + 0xa3, 0xd9, 0x88, 0xd9, 0x84, 0xd8, 0xb4, 0xd9, 0x8a, 0xd8, 0xa1, 0xd9, 0x86, + 0xd9, 0x88, 0xd8, 0xb1, 0xd8, 0xa3, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x81, 0xd9, + 0x8a, 0xd9, 0x83, 0xd8, 0xa8, 0xd9, 0x83, 0xd9, 0x84, 0xd8, 0xb0, 0xd8, 0xa7, + 0xd8, 0xaa, 0xd8, 0xb1, 0xd8, 0xaa, 0xd8, 0xa8, 0xd8, 0xa8, 0xd8, 0xa3, 0xd9, + 0x86, 0xd9, 0x87, 0xd9, 0x85, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, 0x86, 0xd9, 0x83, + 0xd8, 0xa8, 0xd9, 0x8a, 0xd8, 0xb9, 0xd9, 0x81, 0xd9, 0x82, 0xd8, 0xaf, 0xd8, + 0xad, 0xd8, 0xb3, 0xd9, 0x86, 0xd9, 0x84, 0xd9, 0x87, 0xd9, 0x85, 0xd8, 0xb4, + 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa3, 0xd9, 0x87, 0xd9, 0x84, 0xd8, 0xb4, 0xd9, + 0x87, 0xd8, 0xb1, 0xd9, 0x82, 0xd8, 0xb7, 0xd8, 0xb1, 0xd8, 0xb7, 0xd9, 0x84, + 0xd8, 0xa8, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x68, 0x69, 0x6d, + 0x73, 0x65, 0x6c, 0x66, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x61, 0x73, 0x68, 0x69, 0x6f, + 0x6e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x77, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x64, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x63, 0x79, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x73, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x77, 0x6f, 0x72, 0x6b, + 0x69, 0x6e, 0x67, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x6d, 0x69, 0x6c, + 0x6c, 0x69, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x76, + 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x77, 0x65, 0x61, 0x74, 0x68, 0x65, 0x72, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x66, 0x6f, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x6c, + 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, + 0x72, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x73, 0x6f, 0x63, 0x69, 0x65, 0x74, 0x79, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x61, 0x72, 0x74, 0x6e, + 0x65, 0x72, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x70, 0x65, 0x72, 0x66, + 0x65, 0x63, 0x74, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x73, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x63, 0x75, + 0x6c, 0x74, 0x75, 0x72, 0x65, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, 0x6a, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x73, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x6e, 0x67, 0x6c, + 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x70, + 0x69, 0x6e, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x61, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x76, 0x69, 0x6c, 0x6c, 0x61, 0x67, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x69, 0x73, + 0x68, 0x67, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x79, 0x64, 0x65, 0x63, 0x6c, 0x69, + 0x6e, 0x65, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x71, 0x75, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, + 0x72, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x73, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x73, + 0x70, 0x75, 0x74, 0x65, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x72, 0x65, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x64, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x70, + 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x6d, 0x61, 0x72, 0x72, 0x69, 0x65, 0x64, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x76, 0x69, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x73, 0x73, 0x74, 0x75, 0x64, 0x69, 0x65, 0x73, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x73, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, + 0x79, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x69, + 0x6e, 0x67, 0x67, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x6f, 0x62, 0x76, 0x69, + 0x6f, 0x75, 0x73, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, + 0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x61, + 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, + 0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x64, 0x65, 0x73, 0x6b, 0x74, + 0x6f, 0x70, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x75, 0x6e, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x44, 0x69, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x64, + 0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x64, 0x65, 0x63, 0x61, 0x64, 0x65, + 0x73, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x26, 0x61, 0x6d, 0x70, + 0x3b, 0x20, 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x67, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x6e, 0x6f, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x63, + 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x73, + 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x3d, 0x31, 0x26, 0x61, + 0x6d, 0x70, 0x3b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x67, 0x65, 0x74, 0x6f, 0x6f, 0x6c, 0x62, + 0x61, 0x72, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x62, 0x65, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x65, 0x75, + 0x74, 0x73, 0x63, 0x68, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x73, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x6c, 0x79, 0x62, + 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x73, 0x65, 0x61, 0x73, + 0x65, 0x53, 0x6f, 0x63, 0x69, 0x65, 0x74, 0x79, 0x77, 0x65, 0x61, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x26, 0x6c, 0x74, 0x3b, + 0x21, 0x2d, 0x2d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x65, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x6f, 0x75, + 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, + 0x22, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x73, 0x68, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x49, 0x74, 0x61, 0x6c, + 0x69, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x68, 0x65, 0x61, + 0x76, 0x69, 0x6c, 0x79, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x2d, 0x31, + 0x27, 0x5d, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, + 0x67, 0x64, 0x72, 0x61, 0x77, 0x69, 0x6e, 0x67, 0x62, 0x69, 0x6c, 0x6c, 0x69, + 0x6f, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x47, 0x65, 0x72, 0x6d, + 0x61, 0x6e, 0x79, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x3c, 0x2f, 0x66, + 0x6f, 0x72, 0x6d, 0x3e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x77, 0x68, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x53, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, + 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x73, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x75, 0x6e, 0x69, 0x66, 0x6f, + 0x72, 0x6d, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x73, 0x69, 0x64, 0x65, + 0x62, 0x61, 0x72, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x68, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x70, 0x61, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x61, + 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x66, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67, + 0x61, 0x72, 0x72, 0x69, 0x76, 0x65, 0x64, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x72, 0x6f, 0x75, 0x67, 0x68, + 0x6c, 0x79, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, + 0x6e, 0x6f, 0x74, 0x64, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x42, 0x72, 0x69, + 0x74, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x65, 0x6c, 0x61, + 0x63, 0x6b, 0x20, 0x6f, 0x66, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x49, + 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x4c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x68, 0x75, 0x73, 0x62, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x20, 0x66, + 0x61, 0x63, 0x74, 0x61, 0x66, 0x66, 0x61, 0x69, 0x72, 0x73, 0x43, 0x68, 0x61, + 0x72, 0x6c, 0x65, 0x73, 0x72, 0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x62, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x74, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x6c, + 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x70, 0x72, 0x65, 0x6d, 0x69, + 0x75, 0x6d, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x6e, 0x65, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, + 0x65, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x2d, 0x6d, 0x6f, 0x62, 0x69, + 0x6c, 0x65, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x77, 0x61, 0x6e, 0x74, + 0x20, 0x74, 0x6f, 0x6b, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x46, 0x69, 0x72, + 0x65, 0x66, 0x6f, 0x78, 0x79, 0x6f, 0x75, 0x20, 0x61, 0x72, 0x65, 0x73, 0x69, + 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x73, 0x74, 0x75, 0x64, 0x69, 0x65, 0x64, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x72, 0x61, 0x70, 0x69, 0x64, 0x6c, 0x79, 0x63, 0x6c, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x6b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x65, 0x6d, 0x65, 0x72, 0x67, + 0x65, 0x64, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x65, 0x64, 0x70, 0x69, 0x6f, 0x6e, 0x65, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x75, 0x6c, 0x61, 0x64, 0x79, 0x6e, 0x61, 0x73, 0x74, 0x79, 0x68, 0x6f, + 0x77, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x72, + 0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x62, 0x72, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x73, 0x6f, 0x6c, 0x64, 0x69, 0x65, 0x72, 0x6c, 0x61, 0x72, 0x67, 0x65, + 0x6c, 0x79, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x26, 0x71, 0x75, + 0x6f, 0x74, 0x3b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x64, 0x77, + 0x61, 0x72, 0x64, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, + 0x62, 0x65, 0x72, 0x74, 0x20, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x73, 0x50, + 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, + 0x75, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x41, 0x6e, 0x67, 0x65, 0x6c, + 0x65, 0x73, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x61, 0x63, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x6d, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x65, 0x64, 0x3a, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x74, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x62, 0x69, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x64, 0x72, 0x69, 0x76, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x75, 0x64, 0x69, 0x65, 0x73, 0x6d, 0x69, 0x6e, 0x69, 0x6d, + 0x75, 0x6d, 0x70, 0x65, 0x72, 0x68, 0x61, 0x70, 0x73, 0x6d, 0x6f, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x73, 0x65, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x73, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x68, 0x69, 0x65, 0x76, 0x65, + 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, + 0x74, 0x73, 0x6f, 0x6d, 0x65, 0x6f, 0x6e, 0x65, 0x65, 0x78, 0x74, 0x72, 0x65, + 0x6d, 0x65, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x3a, 0x65, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x61, 0x6c, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x70, 0x65, 0x6e, + 0x67, 0x6c, 0x69, 0x73, 0x68, 0x77, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x20, + 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x73, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x69, 0x6e, + 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x7d, 0x29, 0x28, 0x29, + 0x3b, 0x0d, 0x0a, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x74, 0x72, 0x6f, + 0x75, 0x62, 0x6c, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, + 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x27, 0x27, 0x54, 0x68, 0x65, + 0x20, 0x77, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x65, 0x78, 0x70, 0x6c, 0x6f, + 0x72, 0x65, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65, 0x64, 0x47, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x79, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x63, 0x61, + 0x72, 0x65, 0x65, 0x72, 0x73, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, + 0x61, 0x6e, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, + 0x64, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x73, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x6e, + 0x65, 0x75, 0x74, 0x72, 0x61, 0x6c, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, + 0x67, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x73, 0x65, 0x74, 0x74, 0x6c, + 0x65, 0x64, 0x77, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x63, 0x61, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x65, 0x64, 0x4a, 0x75, 0x73, 0x74, 0x69, 0x63, 0x65, 0x63, 0x68, + 0x61, 0x70, 0x74, 0x65, 0x72, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x73, 0x54, + 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x20, 0x6d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c, 0x61, + 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x75, 0x74, 0x73, 0x69, + 0x64, 0x65, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x68, 0x75, 0x6e, 0x64, + 0x72, 0x65, 0x64, 0x4f, 0x6c, 0x79, 0x6d, 0x70, 0x69, 0x63, 0x5f, 0x62, 0x75, + 0x74, 0x74, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x72, 0x65, + 0x61, 0x63, 0x68, 0x65, 0x64, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x64, + 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x61, 0x64, 0x6f, 0x70, 0x74, 0x65, + 0x64, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x65, 0x69, 0x74, 0x68, + 0x65, 0x72, 0x67, 0x72, 0x65, 0x61, 0x74, 0x6c, 0x79, 0x67, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x77, + 0x6f, 0x72, 0x73, 0x68, 0x69, 0x70, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x75, 0x74, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x43, 0x75, 0x6c, 0x74, + 0x75, 0x72, 0x65, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6c, 0x65, + 0x61, 0x72, 0x6c, 0x79, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x72, + 0x6f, 0x77, 0x73, 0x65, 0x72, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x6c, 0x7d, + 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x68, 0x69, 0x64, 0x65, 0x28, 0x29, + 0x3b, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x61, 0x6e, 0x73, 0x77, 0x65, + 0x72, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6d, 0x70, 0x65, + 0x72, 0x6f, 0x72, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x65, 0x72, + 0x69, 0x6f, 0x75, 0x73, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x53, 0x65, + 0x76, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x46, + 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x21, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x76, 0x6f, 0x69, 0x64, 0x28, + 0x30, 0x29, 0x2f, 0x61, 0x6c, 0x6c, 0x2e, 0x6a, 0x73, 0x70, 0x72, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x65, + 0x70, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x6f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0d, 0x0a, 0x4d, + 0x6f, 0x64, 0x65, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x2e, 0x0a, 0x0a, 0x46, 0x6f, 0x72, 0x20, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, + 0x79, 0x20, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x73, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x65, 0x64, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x66, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x6d, 0x65, + 0x64, 0x69, 0x63, 0x61, 0x6c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x6f, + 0x70, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x63, 0x69, 0x6c, + 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x63, + 0x65, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x65, 0x20, 0x42, 0x65, 0x6c, 0x67, 0x69, + 0x75, 0x6d, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f, 0x61, 0x3e, 0x74, 0x77, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x79, 0x77, 0x61, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x77, 0x61, 0x72, 0x66, 0x61, 0x72, 0x65, 0x20, 0x4f, + 0x74, 0x68, 0x65, 0x72, 0x20, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x70, + 0x68, 0x72, 0x61, 0x73, 0x65, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x73, 0x63, 0x68, 0x6f, 0x6c, 0x61, + 0x72, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x6c, 0x6f, 0x73, 0x73, + 0x20, 0x6f, 0x66, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x73, 0x47, 0x65, 0x6f, + 0x72, 0x67, 0x69, 0x61, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x31, + 0x27, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x69, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, + 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x63, 0x61, 0x72, 0x72, 0x69, + 0x65, 0x64, 0x31, 0x30, 0x30, 0x2c, 0x30, 0x30, 0x30, 0x3c, 0x2f, 0x68, 0x33, + 0x3e, 0x0a, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x62, 0x65, 0x63, + 0x6f, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x77, 0x65, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x30, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x6d, + 0x6f, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x74, 0x65, 0x61, 0x63, 0x68, 0x65, 0x72, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x79, + 0x20, 0x62, 0x69, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x6c, 0x69, 0x66, 0x65, 0x20, + 0x6f, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x72, 0x69, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x26, 0x72, 0x61, 0x71, 0x75, 0x6f, 0x3b, 0x70, 0x6c, 0x75, + 0x73, 0x6f, 0x6e, 0x65, 0x68, 0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x28, 0x74, + 0x68, 0x6f, 0x75, 0x67, 0x68, 0x44, 0x6f, 0x75, 0x67, 0x6c, 0x61, 0x73, 0x6a, + 0x6f, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x73, + 0x46, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x41, 0x6e, 0x63, 0x69, 0x65, 0x6e, + 0x74, 0x56, 0x69, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x76, 0x65, 0x68, 0x69, 0x63, + 0x6c, 0x65, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x63, 0x72, 0x79, 0x73, + 0x74, 0x61, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x73, 0x65, 0x6e, 0x6a, 0x6f, 0x79, 0x65, 0x64, 0x61, 0x20, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x3c, + 0x61, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, + 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, + 0x65, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x72, 0x65, 0x74, 0x69, 0x72, + 0x65, 0x64, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x68, 0x69, 0x64, 0x64, + 0x65, 0x6e, 0x3b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x65, + 0x6b, 0x69, 0x6e, 0x67, 0x63, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x77, 0x61, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x61, 0x74, 0x63, + 0x6f, 0x6e, 0x64, 0x75, 0x63, 0x74, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x73, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x61, 0x3a, 0x68, 0x6f, 0x76, + 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x46, 0x72, 0x65, 0x6e, + 0x63, 0x68, 0x20, 0x6c, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x74, 0x79, 0x70, + 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x6e, + 0x65, 0x6d, 0x69, 0x65, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x66, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x64, 0x65, 0x63, 0x69, 0x64, 0x65, 0x64, + 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x66, 0x73, 0x2d, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x3a, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x3e, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x74, 0x76, 0x69, 0x6f, 0x6c, 0x65, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x66, 0x69, 0x72, 0x73, 0x74, 0x22, 0x3e, 0x63, + 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64, + 0x63, 0x68, 0x65, 0x6d, 0x69, 0x73, 0x74, 0x73, 0x68, 0x65, 0x20, 0x77, 0x61, + 0x73, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x22, 0x3e, 0x61, 0x73, 0x20, 0x73, 0x75, + 0x63, 0x68, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x6f, 0x66, 0x61, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x79, + 0x73, 0x74, 0x65, 0x72, 0x79, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x66, + 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x72, 0x61, 0x69, 0x6c, 0x77, 0x61, 0x79, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x67, + 0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x72, 0x64, 0x65, 0x73, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6e, 0x75, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x4a, 0x65, 0x77, 0x69, 0x73, 0x68, 0x20, 0x70, 0x72, 0x6f, + 0x74, 0x65, 0x73, 0x74, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x66, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x72, + 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, + 0x77, 0x68, 0x6f, 0x20, 0x77, 0x61, 0x73, 0x6c, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x75, 0x69, 0x63, 0x69, + 0x64, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x73, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x53, 0x6f, 0x63, + 0x69, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x63, 0x6f, + 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x77, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x61, 0x74, 0x75, 0x72, 0x61, + 0x6c, 0x50, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x63, 0x6f, 0x6f, 0x6b, 0x69, + 0x65, 0x73, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x76, 0x65, 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x62, 0x72, 0x69, + 0x65, 0x66, 0x6c, 0x79, 0x50, 0x65, 0x72, 0x73, 0x69, 0x61, 0x6e, 0x73, 0x6f, + 0x20, 0x6d, 0x75, 0x63, 0x68, 0x43, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x64, + 0x65, 0x70, 0x69, 0x63, 0x74, 0x73, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, + 0x68, 0x6f, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x73, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x62, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x65, 0x64, 0x6a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x28, 0x2d, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x74, 0x6f, + 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x64, + 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x54, 0x75, 0x72, 0x6b, 0x69, 0x73, 0x68, + 0x79, 0x6f, 0x75, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x65, 0x67, 0x72, + 0x65, 0x65, 0x73, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x52, 0x69, 0x63, + 0x68, 0x61, 0x72, 0x64, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6c, 0x79, 0x70, 0x6c, + 0x61, 0x73, 0x74, 0x69, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3c, + 0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x75, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x73, 0x65, 0x73, + 0x73, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x70, 0x68, 0x79, 0x73, 0x69, + 0x63, 0x73, 0x66, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x73, 0x74, 0x6c, 0x69, 0x6e, + 0x6b, 0x20, 0x74, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3c, 0x62, + 0x72, 0x20, 0x2f, 0x3e, 0x0a, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x63, + 0x68, 0x61, 0x72, 0x74, 0x65, 0x72, 0x74, 0x6f, 0x75, 0x72, 0x69, 0x73, 0x6d, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x65, + 0x64, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3c, 0x2f, 0x68, 0x31, 0x3e, + 0x0d, 0x0a, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x3f, 0x78, 0x6d, 0x6c, + 0x20, 0x76, 0x65, 0x68, 0x65, 0x6c, 0x70, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x61, + 0x6d, 0x6f, 0x6e, 0x64, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x61, 0x69, + 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x3e, 0x29, + 0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x56, 0x69, 0x6e, 0x63, 0x65, + 0x6e, 0x74, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x20, 0x73, 0x72, 0x63, + 0x3d, 0x22, 0x2f, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x64, 0x65, 0x73, + 0x70, 0x69, 0x74, 0x65, 0x64, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x74, 0x65, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x68, + 0x65, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x4a, 0x6f, 0x73, 0x65, 0x70, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x61, 0x74, 0x72, 0x65, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x73, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x61, 0x20, 0x6c, 0x61, 0x72, + 0x67, 0x65, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x6c, 0x61, 0x74, 0x65, + 0x72, 0x2c, 0x20, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x66, 0x61, 0x76, + 0x69, 0x63, 0x6f, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x75, + 0x6e, 0x67, 0x61, 0x72, 0x79, 0x41, 0x69, 0x72, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x4d, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6c, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x73, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x65, 0x26, 0x71, 0x75, + 0x6f, 0x74, 0x3b, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x66, + 0x74, 0x22, 0x3e, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x47, 0x6f, + 0x6c, 0x64, 0x65, 0x6e, 0x20, 0x41, 0x66, 0x66, 0x61, 0x69, 0x72, 0x73, 0x67, + 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x69, 0x64, 0x65, 0x61, 0x20, 0x6f, + 0x66, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x73, + 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x2e, 0x73, 0x72, 0x63, + 0x20, 0x3d, 0x20, 0x63, 0x61, 0x72, 0x74, 0x6f, 0x6f, 0x6e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x73, 0x4d, 0x75, + 0x73, 0x6c, 0x69, 0x6d, 0x73, 0x57, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x69, + 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x65, 0x64, + 0x2c, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x2f, 0x73, 0x68, 0x6f, 0x77, + 0x5f, 0x61, 0x6f, 0x75, 0x74, 0x64, 0x6f, 0x6f, 0x72, 0x65, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x28, 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x67, 0x65, 0x6e, + 0x65, 0x74, 0x69, 0x63, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c, 0x49, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, + 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, + 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x79, 0x0a, 0x09, 0x09, 0x3c, 0x21, 0x2d, + 0x2d, 0x44, 0x61, 0x6e, 0x69, 0x65, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3e, 0x69, 0x6d, 0x70, 0x6f, + 0x73, 0x65, 0x64, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x41, 0x62, 0x72, + 0x61, 0x68, 0x61, 0x6d, 0x28, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x7b, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x29, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0x3b, 0x0a, + 0x44, 0x41, 0x54, 0x41, 0x5b, 0x20, 0x2a, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65, + 0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x61, 0x63, 0x74, 0x75, 0x61, + 0x6c, 0x20, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x6d, 0x61, 0x69, 0x6e, + 0x6c, 0x79, 0x20, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x27, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x74, 0x73, 0x69, 0x66, + 0x28, 0x74, 0x79, 0x70, 0x65, 0x49, 0x74, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x26, + 0x63, 0x6f, 0x70, 0x79, 0x3b, 0x20, 0x22, 0x3e, 0x54, 0x65, 0x72, 0x6d, 0x73, + 0x62, 0x6f, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x65, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x74, 0x61, 0x6c, 0x6b, 0x69, + 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x72, 0x6e, 0x67, 0x61, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x6a, 0x75, 0x73, + 0x74, 0x69, 0x66, 0x79, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x73, 0x66, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x61, + 0x73, 0x73, 0x61, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x64, + 0x6c, 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x77, + 0x6e, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x20, 0x72, 0x65, 0x6c, + 0x3d, 0x22, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x63, 0x6f, 0x6e, 0x63, + 0x65, 0x72, 0x74, 0x64, 0x69, 0x61, 0x67, 0x72, 0x61, 0x6d, 0x64, 0x6f, 0x6c, + 0x6c, 0x61, 0x72, 0x73, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x70, 0x68, + 0x70, 0x3f, 0x69, 0x64, 0x3d, 0x61, 0x6c, 0x63, 0x6f, 0x68, 0x6f, 0x6c, 0x29, + 0x3b, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x76, 0x65, 0x73, 0x73, 0x65, 0x6c, + 0x73, 0x72, 0x65, 0x76, 0x69, 0x76, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x61, 0x6d, 0x61, 0x74, 0x65, 0x75, 0x72, 0x61, 0x6e, 0x64, 0x72, + 0x6f, 0x69, 0x64, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x65, 0x64, 0x69, 0x6c, 0x6c, + 0x6e, 0x65, 0x73, 0x73, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x73, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x79, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x65, 0x78, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73, + 0x65, 0x64, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x09, 0x3c, 0x21, 0x2d, + 0x2d, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x73, 0x6c, 0x69, 0x6e, 0x6b, + 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x20, 0x42, 0x6f, 0x6f, + 0x6b, 0x20, 0x6f, 0x66, 0x65, 0x76, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x6d, 0x69, + 0x6e, 0x2e, 0x6a, 0x73, 0x3f, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6b, + 0x6f, 0x6e, 0x74, 0x61, 0x6b, 0x74, 0x74, 0x6f, 0x64, 0x61, 0x79, 0x27, 0x73, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x3d, 0x77, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x20, 0x52, + 0x69, 0x67, 0x3b, 0x0a, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x72, 0x61, 0x69, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x41, 0x6c, 0x73, 0x6f, 0x2c, 0x20, 0x63, 0x72, 0x75, + 0x63, 0x69, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x22, 0x3e, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x66, + 0x69, 0x72, 0x65, 0x66, 0x6f, 0x78, 0x61, 0x73, 0x20, 0x6d, 0x75, 0x63, 0x68, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, + 0x20, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x0a, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x74, 0x6f, 0x77, 0x61, + 0x72, 0x64, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x50, 0x72, + 0x65, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x56, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x65, + 0x64, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x76, 0x65, 0x72, + 0x74, 0x79, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x69, + 0x6e, 0x67, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x74, + 0x68, 0x6f, 0x6e, 0x79, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x20, 0x52, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x72, + 0x65, 0x61, 0x63, 0x68, 0x65, 0x73, 0x63, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, 0x6c, 0x69, 0x66, 0x65, 0x20, 0x69, + 0x6e, 0x43, 0x68, 0x61, 0x70, 0x74, 0x65, 0x72, 0x2d, 0x73, 0x68, 0x61, 0x64, + 0x6f, 0x77, 0x4e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x0d, 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x74, 0x61, + 0x64, 0x69, 0x75, 0x6d, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x76, 0x61, + 0x72, 0x79, 0x69, 0x6e, 0x67, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x73, 0x68, + 0x65, 0x6c, 0x64, 0x20, 0x62, 0x79, 0x77, 0x68, 0x6f, 0x20, 0x61, 0x72, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74, + 0x79, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x77, 0x68, 0x6f, 0x20, 0x68, + 0x61, 0x64, 0x61, 0x69, 0x72, 0x70, 0x6f, 0x72, 0x74, 0x74, 0x6f, 0x77, 0x6e, + 0x20, 0x6f, 0x66, 0x0a, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x20, 0x27, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x27, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x73, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x63, + 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b, + 0x41, 0x6e, 0x64, 0x72, 0x65, 0x77, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x6f, 0x72, 0x20, 0x6d, 0x6f, + 0x72, 0x65, 0x33, 0x30, 0x30, 0x70, 0x78, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x3b, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x68, 0x65, + 0x72, 0x73, 0x65, 0x6c, 0x66, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x6c, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x65, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74, + 0x6f, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x63, 0x74, 0x72, 0x65, + 0x73, 0x73, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x66, 0x69, 0x6e, 0x67, + 0x65, 0x72, 0x73, 0x44, 0x75, 0x6b, 0x65, 0x20, 0x6f, 0x66, 0x70, 0x65, 0x6f, + 0x70, 0x6c, 0x65, 0x2c, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x77, 0x68, + 0x61, 0x74, 0x20, 0x69, 0x73, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x61, + 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x22, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x69, 0x6e, 0x20, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x6e, 0x75, 0x22, 0x3e, + 0x0a, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x6f, 0x66, 0x66, 0x69, 0x63, + 0x65, 0x72, 0x63, 0x6f, 0x75, 0x6e, 0x63, 0x69, 0x6c, 0x67, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x64, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x6c, 0x6f, + 0x79, 0x61, 0x6c, 0x74, 0x79, 0x66, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x61, + 0x6e, 0x64, 0x20, 0x77, 0x61, 0x73, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x6f, 0x72, + 0x73, 0x75, 0x70, 0x72, 0x65, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x20, 0x68, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x73, 0x73, 0x69, + 0x61, 0x6e, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x62, 0x65, + 0x72, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x65, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x22, 0x3e, 0x2e, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x64, 0x6f, 0x20, 0x77, 0x69, 0x74, 0x68, 0x66, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x6c, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x6f, 0x66, + 0x62, 0x65, 0x6e, 0x65, 0x61, 0x74, 0x68, 0x44, 0x65, 0x73, 0x70, 0x69, 0x74, + 0x65, 0x43, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x73, 0x29, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x63, 0x6c, 0x6f, + 0x73, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x49, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x66, 0x69, 0x66, 0x74, 0x65, 0x65, 0x6e, 0x61, + 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2e, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x2e, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x66, 0x69, 0x67, 0x68, 0x74, 0x65, + 0x72, 0x6f, 0x62, 0x73, 0x63, 0x75, 0x72, 0x65, 0x72, 0x65, 0x66, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x63, 0x3d, 0x20, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x6f, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x61, 0x20, + 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x79, + 0x65, 0x61, 0x72, 0x20, 0x6f, 0x66, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, + 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, + 0x74, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x68, 0x6f, 0x6d, 0x65, 0x20, + 0x6f, 0x66, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x72, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x64, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x68, 0x65, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x66, 0x72, 0x77, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x4d, + 0x61, 0x72, 0x63, 0x68, 0x20, 0x31, 0x6b, 0x6e, 0x6f, 0x77, 0x69, 0x6e, 0x67, + 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x42, 0x65, 0x74, 0x77, 0x65, 0x65, + 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x6f, 0x6e, 0x73, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x73, 0x74, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6b, + 0x73, 0x22, 0x3e, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x64, 0x45, 0x4e, 0x44, + 0x20, 0x2d, 0x2d, 0x3e, 0x66, 0x61, 0x6d, 0x6f, 0x75, 0x73, 0x20, 0x61, 0x77, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x20, 0x66, 0x61, 0x69, 0x72, 0x6c, 0x79, 0x20, + 0x77, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61, + 0x6c, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x65, + 0x74, 0x65, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x73, 0x69, 0x6e, 0x67, + 0x69, 0x6e, 0x67, 0x66, 0x61, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x42, 0x72, 0x61, + 0x73, 0x69, 0x6c, 0x29, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x47, 0x72, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x66, + 0x6f, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x75, 0x72, 0x73, 0x75, 0x65, 0x64, + 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x75, + 0x70, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x62, 0x6f, 0x74, 0x68, 0x20, + 0x6f, 0x66, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x73, 0x61, 0x77, 0x20, + 0x74, 0x68, 0x65, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x73, 0x63, 0x6f, 0x6c, + 0x6f, 0x75, 0x72, 0x73, 0x69, 0x66, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x77, 0x68, + 0x65, 0x6e, 0x20, 0x68, 0x65, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x66, 0x75, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x20, + 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x3e, 0x46, 0x61, 0x6e, 0x74, 0x61, 0x73, + 0x79, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x6a, 0x75, 0x72, + 0x65, 0x64, 0x55, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x66, 0x61, 0x72, 0x6d, + 0x69, 0x6e, 0x67, 0x63, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x20, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x63, 0x65, 0x75, 0x73, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x3c, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x6b, 0x65, 0x79, 0x43, 0x6f, 0x64, + 0x65, 0x73, 0x69, 0x78, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x73, 0x6c, 0x61, 0x6d, + 0x69, 0x63, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x65, 0x6e, 0x74, 0x69, + 0x72, 0x65, 0x20, 0x77, 0x69, 0x64, 0x65, 0x6c, 0x79, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x6f, 0x6e, + 0x65, 0x20, 0x63, 0x61, 0x6e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x73, + 0x70, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, + 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x74, 0x65, 0x72, 0x72, 0x61, 0x69, + 0x6e, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x66, 0x75, 0x6e, 0x65, 0x72, + 0x61, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x69, 0x6e, 0x67, 0x6d, 0x69, 0x64, 0x64, + 0x6c, 0x65, 0x20, 0x63, 0x72, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x70, 0x72, 0x6f, + 0x70, 0x68, 0x65, 0x74, 0x73, 0x68, 0x69, 0x66, 0x74, 0x65, 0x64, 0x64, 0x6f, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x6c, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x61, 0x6c, 0x67, 0x65, 0x62, 0x72, 0x61, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c, + 0x2d, 0x62, 0x75, 0x6c, 0x6b, 0x20, 0x6f, 0x66, 0x6d, 0x61, 0x6e, 0x20, 0x61, + 0x6e, 0x64, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x68, 0x65, 0x20, 0x6c, + 0x65, 0x66, 0x74, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x29, 0x3b, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x62, 0x61, + 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x68, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x6e, + 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, + 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b, + 0x0a, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x20, 0x74, 0x75, + 0x72, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x73, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x20, 0x42, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x63, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x64, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x43, 0x61, + 0x70, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x67, + 0x6f, 0x64, 0x64, 0x65, 0x73, 0x73, 0x54, 0x61, 0x67, 0x20, 0x2d, 0x2d, 0x3e, + 0x41, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x75, 0x74, 0x20, 0x77, 0x61, + 0x73, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x74, 0x69, 0x65, + 0x6e, 0x74, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x69, 0x6e, 0x3d, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x26, 0x4c, 0x69, 0x6e, 0x63, 0x6f, 0x6c, 0x6e, 0x77, 0x65, 0x20, + 0x6b, 0x6e, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x4a, 0x75, + 0x64, 0x61, 0x69, 0x73, 0x6d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x61, + 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x27, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x75, 0x6e, 0x63, 0x6c, 0x65, 0x61, + 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x27, 0x2c, 0x62, 0x6f, 0x74, 0x68, 0x20, + 0x69, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x0a, 0x0a, 0x3c, 0x21, + 0x2d, 0x2d, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x68, 0x61, 0x72, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x6f, + 0x72, 0x74, 0x20, 0x6f, 0x66, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x73, + 0x74, 0x72, 0x65, 0x65, 0x74, 0x73, 0x42, 0x65, 0x72, 0x6e, 0x61, 0x72, 0x64, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x73, 0x74, 0x65, 0x6e, 0x64, 0x20, 0x74, + 0x6f, 0x66, 0x61, 0x6e, 0x74, 0x61, 0x73, 0x79, 0x64, 0x6f, 0x77, 0x6e, 0x20, + 0x69, 0x6e, 0x68, 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x46, 0x72, 0x65, 0x65, + 0x64, 0x6f, 0x6d, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x72, 0x79, 0x2f, 0x61, 0x62, + 0x6f, 0x75, 0x74, 0x2e, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x6c, 0x65, + 0x67, 0x65, 0x6e, 0x64, 0x73, 0x69, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x6d, + 0x6f, 0x64, 0x65, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x70, 0x61, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x72, 0x61, 0x72, 0x65, + 0x6c, 0x79, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x79, 0x6d, 0x64, 0x65, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x30, 0x30, + 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x2f, 0x2a, 0x20, 0x3c, 0x21, 0x5b, 0x43, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x65, + 0x64, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4d, 0x61, 0x74, 0x74, 0x68, 0x65, 0x77, 0x74, 0x61, + 0x63, 0x74, 0x69, 0x63, 0x73, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x64, 0x77, + 0x61, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x6c, 0x61, 0x77, 0x73, 0x20, 0x6f, 0x66, + 0x65, 0x61, 0x73, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x20, 0x73, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x73, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x68, 0x69, 0x6e, 0x66, 0x6f, 0x62, 0x6f, 0x78, 0x77, 0x65, 0x6e, + 0x74, 0x20, 0x74, 0x6f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x63, 0x69, + 0x74, 0x69, 0x7a, 0x65, 0x6e, 0x49, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x72, + 0x65, 0x74, 0x72, 0x65, 0x61, 0x74, 0x2e, 0x20, 0x53, 0x6f, 0x6d, 0x65, 0x20, + 0x77, 0x77, 0x2e, 0x22, 0x29, 0x3b, 0x0a, 0x62, 0x6f, 0x6d, 0x62, 0x69, 0x6e, + 0x67, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x6f, 0x3a, 0x6d, 0x61, 0x64, 0x65, 0x20, + 0x69, 0x6e, 0x2e, 0x20, 0x4d, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x61, 0x72, 0x72, + 0x69, 0x65, 0x73, 0x7c, 0x7c, 0x7b, 0x7d, 0x3b, 0x77, 0x69, 0x77, 0x6f, 0x72, + 0x6b, 0x20, 0x6f, 0x66, 0x73, 0x79, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x64, 0x65, + 0x66, 0x65, 0x61, 0x74, 0x73, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x65, 0x64, 0x6f, + 0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x70, 0x61, 0x67, 0x65, 0x54, 0x72, 0x61, + 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x63, 0x6f, 0x6d, 0x53, 0x63, + 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6a, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x69, 0x63, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x20, 0x57, 0x69, + 0x6c, 0x68, 0x65, 0x6c, 0x6d, 0x73, 0x75, 0x62, 0x75, 0x72, 0x62, 0x73, 0x67, + 0x65, 0x6e, 0x75, 0x69, 0x6e, 0x65, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x6f, 0x66, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x73, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x6c, 0x65, 0x66, + 0x74, 0x20, 0x74, 0x6f, 0x63, 0x68, 0x69, 0x65, 0x66, 0x6c, 0x79, 0x2d, 0x68, + 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3c, + 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x0a, 0x2e, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, + 0x69, 0x6e, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x64, 0x69, 0x73, 0x6d, 0x69, 0x73, + 0x73, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x68, 0x65, 0x73, 0x70, 0x61, 0xc3, + 0xb1, 0x6f, 0x6c, 0x77, 0x65, 0x6c, 0x66, 0x61, 0x72, 0x65, 0x72, 0x75, 0x6c, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x63, 0x61, + 0x70, 0x74, 0x61, 0x69, 0x6e, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x6e, 0x72, + 0x75, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6b, + 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x3d, 0x30, 0x26, 0x61, 0x6d, 0x70, + 0x3b, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x61, 0x67, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x20, 0x4b, 0x65, 0x6e, + 0x6e, 0x65, 0x64, 0x79, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x66, 0x75, + 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x42, + 0x65, 0x73, 0x69, 0x64, 0x65, 0x73, 0x2f, 0x2f, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x68, 0x69, 0x6d, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x74, 0x73, 0x20, 0x62, 0x79, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x74, 0x6f, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x77, 0x61, 0x79, 0x73, 0x20, 0x74, 0x6f, 0x73, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x61, 0x64, 0x76, 0x69, 0x73, 0x65, 0x64, 0x70, + 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x3a, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, + 0x73, 0x61, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x48, 0x65, 0x72, 0x62, 0x65, + 0x72, 0x74, 0x73, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x73, 0x20, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x66, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x70, 0x73, 0x6c, + 0x6f, 0x77, 0x6c, 0x79, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x72, 0x20, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x09, 0x09, + 0x69, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x64, + 0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x75, 0x6c, 0x3e, 0x0d, 0x0a, + 0x20, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x70, 0x61, 0x69, 0x72, + 0x20, 0x6f, 0x66, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x69, 0x74, 0x4b, 0x6f, 0x6e, + 0x74, 0x61, 0x6b, 0x74, 0x41, 0x6e, 0x74, 0x6f, 0x6e, 0x69, 0x6f, 0x68, 0x61, + 0x76, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, + 0x74, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0x29, 0x2e, 0x63, 0x73, 0x73, + 0x28, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6c, 0x65, 0x6c, 0x65, 0x61, 0x64, 0x20, + 0x74, 0x6f, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x2c, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2d, 0x2d, 0x3e, + 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x3d, 0x22, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x3c, + 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56, + 0x3e, 0x3c, 0x5c, 0x2f, 0x73, 0x63, 0x72, 0x73, 0x6f, 0x6c, 0x76, 0x69, 0x6e, + 0x67, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x6c, 0x61, 0x76, 0x65, + 0x72, 0x79, 0x77, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x61, 0x73, 0x21, 0x3d, 0x20, 0x27, 0x75, 0x6e, 0x64, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x6c, 0x79, 0x20, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x41, 0x72, 0x61, 0x62, 0x69, 0x61, 0x6e, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, + 0x75, 0x6e, 0x69, 0x74, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, + 0x2d, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2c, 0x69, 0x73, 0x20, 0x68, 0x6f, + 0x6d, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x20, 0x6f, 0x66, 0x64, 0x65, 0x73, 0x69, + 0x72, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x6e, 0x74, 0x6f, 0x6e, 0x63, 0x6f, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x65, + 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x70, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x4d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20, + 0x65, 0x61, 0x64, 0x27, 0x29, 0x5b, 0x30, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, + 0x73, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f, 0x73, 0x3e, 0x26, 0x63, 0x6f, 0x70, + 0x79, 0x3b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3e, 0x61, 0x73, 0x73, 0x65, + 0x6d, 0x62, 0x6c, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x2e, 0x70, 0x73, + 0x3a, 0x22, 0x20, 0x3f, 0x20, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x62, + 0x79, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x20, + 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, + 0x64, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x68, 0x61, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x70, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x20, 0x61, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x42, 0x61, 0x62, 0x79, 0x6c, 0x6f, 0x6e, 0x62, 0x6f, + 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x69, 0x74, 0x73, 0x20, 0x75, 0x73, 0x65, + 0x41, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, + 0x73, 0x61, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x64, 0x65, 0x6e, 0x6f, 0x74, + 0x65, 0x73, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x69, 0x6e, 0x48, 0x6f, 0x75, 0x73, + 0x74, 0x6f, 0x6e, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x22, 0x3e, 0x61, 0x63, 0x63, + 0x75, 0x73, 0x65, 0x64, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x67, 0x6f, + 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x46, 0x61, 0x6d, 0x6f, 0x75, 0x73, 0x20, 0x29, + 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x70, 0x72, 0x69, 0x65, 0x73, 0x74, 0x73, + 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x69, 0x6e, 0x20, 0x4a, 0x75, 0x6c, + 0x79, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x22, 0x67, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x74, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x68, 0x65, 0x6c, 0x70, + 0x66, 0x75, 0x6c, 0x72, 0x65, 0x76, 0x69, 0x76, 0x65, 0x64, 0x69, 0x73, 0x20, + 0x76, 0x65, 0x72, 0x79, 0x72, 0x27, 0x2b, 0x27, 0x69, 0x70, 0x74, 0x6c, 0x6f, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x65, 0x6d, 0x61, 0x6c, 0x65, 0x73, 0x69, + 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, + 0x64, 0x61, 0x79, 0x73, 0x20, 0x6f, 0x66, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, + 0x6c, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3c, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x09, 0x09, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x69, 0x73, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x2e, 0x20, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x6f, 0x6e, 0x64, + 0x6f, 0x6e, 0x65, 0x20, 0x62, 0x79, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x6c, 0x61, 0x77, 0x20, 0x6f, 0x66, + 0x20, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x61, 0x76, 0x6f, 0x69, 0x64, + 0x65, 0x64, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x32, 0x70, 0x78, 0x20, + 0x33, 0x70, 0x78, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x20, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6d, 0x65, + 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2d, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, + 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x66, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x20, 0x26, 0x6e, 0x62, + 0x73, 0x70, 0x3b, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x6e, 0x6f, + 0x74, 0x69, 0x63, 0x65, 0x64, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x73, 0x7d, + 0x29, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65, + 0x73, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x69, 0x73, 0x20, 0x6a, 0x75, + 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x77, 0x68, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x73, 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x62, 0x72, + 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x6f, 0x66, + 0x63, 0x75, 0x69, 0x73, 0x69, 0x6e, 0x65, 0x69, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x61, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x72, + 0x61, 0x6c, 0x20, 0x66, 0x69, 0x78, 0x65, 0x64, 0x3b, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x20, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, + 0x73, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x74, 0x61, 0x72, 0x69, 0x6f, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x69, + 0x6e, 0x76, 0x61, 0x64, 0x65, 0x64, 0x3d, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, + 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x73, + 0x74, 0x61, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x6c, 0x79, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x7d, 0x29, 0x3b, 0x0d, + 0x0a, 0x20, 0x20, 0x69, 0x6d, 0x6d, 0x65, 0x6e, 0x73, 0x65, 0x74, 0x69, 0x6d, + 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x73, 0x61, + 0x74, 0x69, 0x73, 0x66, 0x79, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x64, + 0x6f, 0x77, 0x6e, 0x20, 0x74, 0x6f, 0x6c, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x69, 0x6e, 0x20, 0x4a, 0x75, 0x6e, + 0x65, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x6e, 0x6f, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x64, 0x69, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x6e, 0x69, 0x73, 0x68, 0x73, 0x72, 0x63, + 0x20, 0x3d, 0x20, 0x28, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x68, 0x65, + 0x6c, 0x70, 0x20, 0x6f, 0x66, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x20, 0x6c, + 0x61, 0x77, 0x20, 0x61, 0x6e, 0x64, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, + 0x66, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x73, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, + 0x67, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3e, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2d, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x53, 0x74, 0x61, 0x6e, + 0x6c, 0x65, 0x79, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x2f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x43, 0x72, 0x6f, 0x61, 0x74, 0x69, 0x61, 0x20, 0x41, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x69, + 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, + 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, + 0x77, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x6c, 0x69, 0x67, 0x68, 0x74, + 0x65, 0x72, 0x65, 0x74, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x22, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x6c, 0x69, 0x6b, + 0x65, 0x20, 0x61, 0x20, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x20, 0x69, 0x6e, 0x61, 0x73, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x75, 0x62, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x22, 0x3e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x66, 0x65, 0x65, 0x64, + 0x69, 0x6e, 0x67, 0x4e, 0x75, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x6f, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x57, 0x6f, + 0x6d, 0x65, 0x6e, 0x27, 0x73, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x4d, + 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x69, 0x6e, + 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x61, 0x6e, + 0x79, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x6c, 0x61, 0x77, 0x73, 0x75, + 0x69, 0x74, 0x64, 0x65, 0x76, 0x69, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x75, 0x73, + 0x68, 0x28, 0x7b, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x73, 0x69, 0x6d, + 0x70, 0x6c, 0x79, 0x20, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x2e, 0x63, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x75, 0x73, 0x2e, 0x6a, 0x73, 0x22, 0x3e, + 0x20, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, + 0x74, 0x6f, 0x21, 0x2d, 0x2d, 0x20, 0x65, 0x6e, 0x64, 0x6c, 0x69, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x77, 0x68, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x28, 0x22, + 0x44, 0x4f, 0x4d, 0x43, 0x6f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x6f, + 0x6e, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, + 0x4b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x74, + 0x73, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x74, 0x6f, 0x20, 0x73, 0x68, + 0x6f, 0x77, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x64, 0x65, + 0x20, 0x69, 0x74, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x77, 0x65, 0x72, + 0x65, 0x20, 0x69, 0x6e, 0x6d, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x69, 0x73, 0x65, 0x61, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x73, + 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x64, 0x42, 0x61, 0x70, 0x74, 0x69, 0x73, + 0x74, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x0a, 0x09, 0x09, 0x76, 0x61, + 0x72, 0x20, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x20, 0x32, 0x67, 0x72, 0x65, 0x77, + 0x20, 0x75, 0x70, 0x43, 0x6c, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x77, 0x61, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x66, + 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x74, 0x6f, 0x20, 0x77, 0x6f, 0x72, + 0x6b, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x73, 0x68, 0x61, 0x73, 0x20, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x73, 0x68, 0x6f, 0x77, + 0x28, 0x29, 0x3b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x62, 0x6f, 0x6f, + 0x6b, 0x20, 0x6f, 0x66, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x3d, + 0x20, 0x22, 0x68, 0x74, 0x74, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0a, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, + 0x2e, 0x72, 0x65, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x68, 0x65, 0x20, 0x77, + 0x65, 0x6e, 0x74, 0x62, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x73, 0x70, 0x72, + 0x65, 0x61, 0x64, 0x20, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x61, 0x20, + 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x66, + 0x6f, 0x72, 0x75, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x6f, 0x74, 0x61, 0x67, 0x65, + 0x22, 0x3e, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x43, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x73, 0x20, 0x68, 0x69, + 0x67, 0x68, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x65, 0x2d, 0x2d, 0x3e, 0x3c, + 0x21, 0x2d, 0x2d, 0x66, 0x65, 0x6d, 0x61, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x73, 0x65, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x61, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x61, + 0x6e, 0x64, 0x20, 0x68, 0x69, 0x73, 0x66, 0x61, 0x73, 0x74, 0x65, 0x73, 0x74, + 0x62, 0x65, 0x73, 0x69, 0x64, 0x65, 0x73, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x69, 0x6d, + 0x67, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x62, 0x6f, 0x78, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2c, 0x61, 0x20, 0x79, 0x6f, 0x75, 0x6e, 0x67, 0x61, 0x6e, 0x64, + 0x20, 0x61, 0x72, 0x65, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x68, + 0x65, 0x61, 0x70, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x61, + 0x6e, 0x64, 0x20, 0x68, 0x61, 0x73, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, + 0x77, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x28, 0x6d, 0x6f, 0x73, 0x74, 0x6c, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, + 0x61, 0x20, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x6e, + 0x63, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x72, + 0x65, 0x20, 0x6f, 0x66, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x2c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x6c, 0x79, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2c, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x66, + 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x64, 0x75, 0x63, 0x65, + 0x64, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6c, 0x65, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x41, 0x67, 0x61, 0x69, + 0x6e, 0x73, 0x74, 0x74, 0x68, 0x65, 0x20, 0x77, 0x61, 0x79, 0x6b, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x70, 0x78, 0x3b, 0x22, 0x3e, 0x0d, 0x0a, 0x70, 0x75, + 0x73, 0x68, 0x65, 0x64, 0x20, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x6e, + 0x75, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x43, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, + 0x49, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69, + 0x6e, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x69, 0x73, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x6f, 0x77, + 0x6e, 0x65, 0x64, 0x49, 0x53, 0x42, 0x4e, 0x20, 0x30, 0x2d, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x73, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x6d, 0x61, + 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x6c, + 0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x63, 0x65, + 0x65, 0x6e, 0x61, 0x63, 0x74, 0x65, 0x64, 0x77, 0x69, 0x73, 0x68, 0x20, 0x74, + 0x6f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x6c, 0x79, 0x63, 0x6f, 0x6f, 0x6c, 0x69, + 0x6e, 0x67, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3d, 0x69, 0x74, 0x2e, 0x20, + 0x54, 0x68, 0x65, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x73, + 0x73, 0x75, 0x6d, 0x65, 0x73, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x70, + 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, + 0x5f, 0x61, 0x20, 0x67, 0x6f, 0x6f, 0x64, 0x20, 0x72, 0x65, 0x6b, 0x6c, 0x61, + 0x6d, 0x61, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x2c, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x22, 0x3e, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x2c, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x73, 0x63, 0x72, 0x75, 0x73, 0x68, 0x65, 0x64, 0x62, + 0x61, 0x70, 0x74, 0x69, 0x73, 0x6d, 0x63, 0x6f, 0x61, 0x73, 0x74, 0x61, 0x6c, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, + 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x6c, 0x6f, 0x73, 0x74, 0x20, + 0x69, 0x6e, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c, + 0x69, 0x65, 0x73, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x72, 0x79, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x50, 0x65, + 0x72, 0x68, 0x61, 0x70, 0x73, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x66, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, + 0x6c, 0x61, 0x73, 0x74, 0x65, 0x64, 0x20, 0x72, 0x69, 0x73, 0x65, 0x20, 0x69, + 0x6e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x76, 0x69, 0x65, 0x77, 0x20, + 0x6f, 0x66, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x65, 0x6d, + 0x20, 0x74, 0x6f, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x67, 0x69, + 0x76, 0x65, 0x6e, 0x20, 0x61, 0x67, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x63, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x66, + 0x20, 0x4c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x75, + 0x74, 0x48, 0x69, 0x67, 0x68, 0x77, 0x61, 0x79, 0x6f, 0x6e, 0x6c, 0x79, 0x20, + 0x62, 0x79, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x20, 0x64, + 0x6f, 0x65, 0x73, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x73, 0x62, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x79, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6c, 0x61, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x74, 0x73, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x6f, 0x6e, + 0x72, 0x65, 0x66, 0x75, 0x73, 0x65, 0x64, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x3d, 0x55, 0x53, 0x26, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x68, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x66, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x6c, 0x65, + 0x73, 0x62, 0x69, 0x61, 0x6e, 0x73, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x61, + 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x48, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x2f, 0x70, 0x69, 0x78, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6c, + 0x6f, 0x6e, 0x67, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x6a, 0x6f, 0x69, + 0x6e, 0x74, 0x6c, 0x79, 0x73, 0x6b, 0x79, 0x73, 0x63, 0x72, 0x61, 0x55, 0x6e, + 0x69, 0x63, 0x6f, 0x64, 0x65, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x41, + 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x61, 0x6e, 0x75, 0x63, 0x6c, 0x65, 0x75, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x79, 0x2c, 0x70, 0x75, 0x72, 0x65, 0x6c, 0x79, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x61, 0x73, 0x69, 0x6c, + 0x79, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x61, 0x6f, 0x6e, 0x63, 0x6c, + 0x69, 0x63, 0x6b, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x68, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6e, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, + 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x6e, 0x20, 0x77, 0x68, + 0x6f, 0x6f, 0x72, 0x67, 0x2f, 0x57, 0x65, 0x62, 0x6f, 0x6e, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x63, 0x61, 0x76, 0x61, 0x6c, 0x72, 0x79, 0x48, 0x65, 0x20, 0x64, + 0x69, 0x65, 0x64, 0x73, 0x65, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x30, 0x30, 0x2c, + 0x30, 0x30, 0x30, 0x20, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x74, 0x6f, 0x69, 0x66, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x61, + 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x73, 0x6f, 0x6c, 0x65, 0x6c, 0x79, 0x20, + 0x6d, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x65, + 0x64, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, 0x74, 0x61, 0x6d, 0x6f, 0x6e, 0x67, + 0x73, 0x74, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6d, + 0x20, 0x69, 0x6e, 0x53, 0x65, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x4b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x46, 0x72, + 0x61, 0x6e, 0x63, 0x69, 0x73, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x68, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, + 0x68, 0x69, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x73, 0x63, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x74, 0x20, 0x68, 0x6f, + 0x6d, 0x65, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x66, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x66, 0x66, 0x61, 0x6c, 0x6f, 0x6c, 0x69, + 0x6e, 0x6b, 0x22, 0x3e, 0x3c, 0x77, 0x68, 0x61, 0x74, 0x20, 0x68, 0x65, 0x66, + 0x72, 0x65, 0x65, 0x20, 0x74, 0x6f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, + 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x64, + 0x61, 0x79, 0x6e, 0x65, 0x72, 0x76, 0x6f, 0x75, 0x73, 0x73, 0x71, 0x75, 0x61, + 0x72, 0x65, 0x20, 0x7d, 0x3b, 0x69, 0x66, 0x28, 0x67, 0x6f, 0x69, 0x6e, 0x20, + 0x77, 0x68, 0x61, 0x74, 0x69, 0x6d, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x69, 0x73, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x74, + 0x75, 0x65, 0x73, 0x64, 0x61, 0x79, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x6c, 0x79, + 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x73, 0x65, 0x78, 0x75, 0x61, 0x6c, + 0x20, 0x2d, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x75, + 0x6d, 0x22, 0x44, 0x4f, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x46, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x2c, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x77, 0x61, 0x72, + 0x20, 0x61, 0x6e, 0x64, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x61, + 0x6b, 0x65, 0x20, 0x61, 0x20, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x68, 0x69, 0x67, 0x68, 0x77, 0x61, 0x79, + 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x22, 0x3e, 0x6f, 0x62, 0x6c, 0x69, 0x67, + 0x65, 0x64, 0x72, 0x69, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x22, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x45, 0x61, + 0x72, 0x6c, 0x79, 0x20, 0x70, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x69, 0x6e, + 0x20, 0x69, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, 0x69, 0x73, 0x61, + 0x74, 0x68, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72, + 0x59, 0x61, 0x68, 0x6f, 0x6f, 0x21, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, + 0x20, 0x73, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x72, 0x65, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x20, 0x77, 0x6f, + 0x6d, 0x61, 0x6e, 0x3f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x20, 0x62, 0x69, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x64, + 0x61, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x61, 0x74, 0x68, 0x65, 0x72, 0x2c, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, + 0x20, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, + 0x6f, 0x77, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x61, 0x20, 0x70, 0x61, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3e, 0x3b, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x61, + 0x6e, 0x6e, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x65, 0x77, + 0x70, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x20, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x61, 0x20, 0x62, 0x72, 0x69, + 0x65, 0x66, 0x28, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x2e, 0x3b, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x65, 0x6e, 0x7a, + 0x79, 0x6d, 0x65, 0x73, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x6c, 0x61, 0x74, 0x65, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x74, + 0x68, 0x65, 0x72, 0x61, 0x70, 0x79, 0x61, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x62, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x6b, 0x73, 0x22, 0x3e, + 0x0a, 0x28, 0x29, 0x3b, 0x22, 0x20, 0x72, 0x65, 0x61, 0x20, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x5c, 0x75, 0x30, 0x30, 0x33, 0x43, 0x61, 0x61, 0x62, 0x6f, 0x75, + 0x74, 0x20, 0x61, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x67, 0x69, 0x76, 0x65, 0x73, 0x20, 0x61, 0x3c, 0x53, + 0x43, 0x52, 0x49, 0x50, 0x54, 0x52, 0x61, 0x69, 0x6c, 0x77, 0x61, 0x79, 0x74, + 0x68, 0x65, 0x6d, 0x65, 0x73, 0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x62, 0x6f, 0x78, + 0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x78, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x73, + 0x2c, 0x77, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x69, 0x6e, 0x20, 0x73, 0x6f, + 0x6d, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x77, 0x69, 0x63, 0x6f, 0x6d, 0x69, + 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x20, 0x55, 0x6e, + 0x64, 0x65, 0x72, 0x20, 0x62, 0x75, 0x74, 0x20, 0x68, 0x61, 0x73, 0x68, 0x61, + 0x6e, 0x64, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x62, 0x79, 0x74, + 0x68, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x65, 0x61, 0x72, 0x20, 0x6f, 0x66, + 0x64, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x74, 0x61, + 0x67, 0x65, 0x69, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x61, 0x26, 0x71, 0x75, + 0x6f, 0x74, 0x3b, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x49, 0x6e, 0x20, + 0x6d, 0x61, 0x6e, 0x79, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x6f, 0x72, 0x65, + 0x67, 0x69, 0x6d, 0x65, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c, + 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56, 0x61, + 0x3b, 0x26, 0x67, 0x74, 0x3b, 0x3c, 0x2f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x6d, 0x6f, 0x73, 0x74, 0x6c, + 0x79, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x72, 0x65, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x3d, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x68, 0x61, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x6f, + 0x73, 0x74, 0x20, 0x3d, 0x20, 0x57, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x66, + 0x65, 0x72, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, + 0x3d, 0x5b, 0x5d, 0x3b, 0x28, 0x66, 0x75, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, + 0x73, 0x2f, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x61, 0x63, 0x74, 0x73, 0x20, + 0x61, 0x73, 0x49, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x3e, 0x0d, 0x0a, 0x0d, + 0x0a, 0x3c, 0x21, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x73, 0x20, 0x3c, 0x62, + 0x72, 0x20, 0x2f, 0x3e, 0x42, 0x65, 0x69, 0x6a, 0x69, 0x6e, 0x67, 0x63, 0x61, + 0x74, 0x61, 0x6c, 0xc3, 0xa0, 0x64, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x65, + 0x75, 0x72, 0x6f, 0x70, 0x65, 0x75, 0x65, 0x75, 0x73, 0x6b, 0x61, 0x72, 0x61, + 0x67, 0x61, 0x65, 0x69, 0x6c, 0x67, 0x65, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, + 0x61, 0x65, 0x73, 0x70, 0x61, 0xc3, 0xb1, 0x61, 0x6d, 0x65, 0x6e, 0x73, 0x61, + 0x6a, 0x65, 0x75, 0x73, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x74, 0x72, 0x61, 0x62, + 0x61, 0x6a, 0x6f, 0x6d, 0xc3, 0xa9, 0x78, 0x69, 0x63, 0x6f, 0x70, 0xc3, 0xa1, + 0x67, 0x69, 0x6e, 0x61, 0x73, 0x69, 0x65, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6d, 0x61, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x64, + 0x75, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x61, 0xc3, 0xb1, 0x61, 0x64, 0x69, 0x72, + 0x65, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x61, 0x6d, 0x6f, 0x6d, 0x65, 0x6e, 0x74, + 0x6f, 0x6e, 0x75, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x6d, 0x65, + 0x72, 0x61, 0x74, 0x72, 0x61, 0x76, 0xc3, 0xa9, 0x73, 0x67, 0x72, 0x61, 0x63, + 0x69, 0x61, 0x73, 0x6e, 0x75, 0x65, 0x73, 0x74, 0x72, 0x61, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x6f, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x63, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x64, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6e, + 0xc3, 0xba, 0x6d, 0x65, 0x72, 0x6f, 0x61, 0x63, 0x75, 0x65, 0x72, 0x64, 0x6f, + 0x6d, 0xc3, 0xba, 0x73, 0x69, 0x63, 0x61, 0x6d, 0x69, 0x65, 0x6d, 0x62, 0x72, + 0x6f, 0x6f, 0x66, 0x65, 0x72, 0x74, 0x61, 0x73, 0x61, 0x6c, 0x67, 0x75, 0x6e, + 0x6f, 0x73, 0x70, 0x61, 0xc3, 0xad, 0x73, 0x65, 0x73, 0x65, 0x6a, 0x65, 0x6d, + 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x63, 0x68, 0x6f, 0x61, 0x64, 0x65, + 0x6d, 0xc3, 0xa1, 0x73, 0x70, 0x72, 0x69, 0x76, 0x61, 0x64, 0x6f, 0x61, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x72, 0x65, 0x6e, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x70, + 0x6f, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x68, 0x6f, 0x74, 0x65, 0x6c, 0x65, 0x73, + 0x73, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x61, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x72, + 0x6f, 0xc3, 0xba, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x73, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x6f, 0x63, 0x75, 0x6c, 0x74, + 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6a, 0x65, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x72, 0x61, 0x64, 0x61, 0x61, 0x6e, 0x75, 0x6e, 0x63, 0x69, 0x6f, 0x65, 0x6d, + 0x62, 0x61, 0x72, 0x67, 0x6f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x64, 0x6f, 0x67, + 0x72, 0x61, 0x6e, 0x64, 0x65, 0x73, 0x65, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f, + 0x6d, 0x65, 0x6a, 0x6f, 0x72, 0x65, 0x73, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, + 0x6f, 0x64, 0x69, 0x73, 0x65, 0xc3, 0xb1, 0x6f, 0x74, 0x75, 0x72, 0x69, 0x73, + 0x6d, 0x6f, 0x63, 0xc3, 0xb3, 0x64, 0x69, 0x67, 0x6f, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x64, 0x61, 0x65, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6f, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x74, 0x6f, 0x6e, 0x69, 0x6f, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x74, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x61, 0x72, 0x61, + 0x6c, 0x67, 0x75, 0x6e, 0x61, 0x73, 0x70, 0x72, 0x65, 0x63, 0x69, 0x6f, 0x73, + 0x61, 0x6c, 0x67, 0x75, 0x69, 0x65, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x64, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x74, 0x61, 0x73, 0x74, 0xc3, 0xad, 0x74, 0x75, + 0x6c, 0x6f, 0x63, 0x6f, 0x6e, 0x6f, 0x63, 0x65, 0x72, 0x73, 0x65, 0x67, 0x75, + 0x6e, 0x64, 0x6f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6a, 0x6f, 0x66, 0x72, 0x61, + 0x6e, 0x63, 0x69, 0x61, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x6f, 0x73, 0x73, 0x65, + 0x67, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x65, 0x6e, 0x65, 0x6d, 0x6f, 0x73, 0x65, + 0x66, 0x65, 0x63, 0x74, 0x6f, 0x73, 0x6d, 0xc3, 0xa1, 0x6c, 0x61, 0x67, 0x61, + 0x73, 0x65, 0x73, 0x69, 0xc3, 0xb3, 0x6e, 0x72, 0x65, 0x76, 0x69, 0x73, 0x74, + 0x61, 0x67, 0x72, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x6f, 0x67, 0x61, 0x72, 0x63, + 0xc3, 0xad, 0x61, 0x61, 0x63, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x65, 0x63, 0x75, + 0x61, 0x64, 0x6f, 0x72, 0x71, 0x75, 0x69, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x6f, 0x64, 0x65, 0x62, 0x65, 0x72, 0xc3, 0xa1, 0x6d, + 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x68, 0x6f, 0x6d, 0x62, 0x72, 0x65, 0x73, + 0x6d, 0x75, 0x65, 0x73, 0x74, 0x72, 0x61, 0x70, 0x6f, 0x64, 0x72, 0xc3, 0xad, + 0x61, 0x6d, 0x61, 0xc3, 0xb1, 0x61, 0x6e, 0x61, 0xc3, 0xba, 0x6c, 0x74, 0x69, + 0x6d, 0x61, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x6f, 0x73, 0x6f, 0x66, 0x69, 0x63, + 0x69, 0x61, 0x6c, 0x74, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0xc3, 0xba, 0x6e, 0x73, 0x61, 0x6c, 0x75, 0x64, 0x6f, 0x73, 0x70, 0x6f, + 0x64, 0x65, 0x6d, 0x6f, 0x73, 0x6d, 0x65, 0x6a, 0x6f, 0x72, 0x61, 0x72, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, + 0x73, 0x73, 0x68, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x63, 0x61, 0x6d, 0x70, 0x61, + 0x69, 0x67, 0x6e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x63, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, + 0x74, 0x65, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x6d, 0x69, 0x6c, + 0x69, 0x74, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x6d, 0x61, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x7a, 0x2d, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x73, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x6d, 0x6f, 0x76, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x70, 0x6f, 0x6c, 0x69, 0x74, + 0x69, 0x63, 0x73, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x72, 0x65, + 0x6c, 0x69, 0x67, 0x69, 0x6f, 0x6e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, + 0x6c, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x6c, 0x65, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x61, 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x61, 0x62, + 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x6d, 0x61, 0x67, 0x61, + 0x7a, 0x69, 0x6e, 0x65, 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x74, + 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x72, 0x65, 0x73, 0x73, 0x75, + 0x72, 0x65, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x3c, 0x73, 0x74, + 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x73, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x67, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x62, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64, 0x66, 0x6f, 0x6f, 0x74, + 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4c, + 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x72, 0x65, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x74, 0x72, 0x61, + 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x73, 0x74, 0x75, 0x64, 0x65, + 0x6e, 0x74, 0x73, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x66, 0x69, + 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, + 0x6e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x66, 0x65, 0x73, 0x74, + 0x69, 0x76, 0x61, 0x6c, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x70, 0x72, 0x61, + 0x63, 0x74, 0x69, 0x63, 0x65, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x72, 0x72, 0x69, + 0x61, 0x67, 0x65, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x70, 0x72, + 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x61, 0x6e, 0x61, 0x6c, + 0x79, 0x73, 0x69, 0x73, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x62, + 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, + 0x73, 0x65, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, + 0x61, 0x72, 0x6b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x63, 0x68, + 0x65, 0x6d, 0x69, 0x63, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x63, + 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x64, 0x65, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x79, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x3d, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x61, 0x69, 0x72, 0x63, 0x72, 0x61, 0x66, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x65, 0x64, 0x64, 0x6f, 0x6d, 0x65, 0x73, 0x74, 0x69, 0x63, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x68, 0x6f, 0x73, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x61, 0x70, + 0x70, 0x72, 0x6f, 0x61, 0x63, 0x68, 0x70, 0x61, 0x72, 0x74, 0x6e, 0x65, 0x72, + 0x73, 0x6c, 0x6f, 0x67, 0x6f, 0x22, 0x3e, 0x3c, 0x61, 0x64, 0x61, 0x75, 0x67, + 0x68, 0x74, 0x65, 0x72, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x22, 0x20, 0x63, + 0x75, 0x6c, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, + 0x65, 0x73, 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x61, 0x73, 0x73, + 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x66, 0x75, 0x6c, + 0x74, 0x65, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x66, 0x69, 0x6e, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x63, 0x72, + 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x63, 0x67, 0x69, 0x2d, 0x62, 0x69, 0x6e, + 0x2f, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x62, + 0x65, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x73, 0x61, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x65, 0x78, 0x65, + 0x72, 0x63, 0x69, 0x73, 0x65, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, + 0x6d, 0x65, 0x64, 0x69, 0x63, 0x69, 0x6e, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x61, 0x63, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x4d, 0x61, + 0x67, 0x61, 0x7a, 0x69, 0x6e, 0x65, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x74, 0x74, + 0x6f, 0x6d, 0x22, 0x3e, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x3a, + 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x6f, 0x66, + 0x74, 0x77, 0x61, 0x72, 0x65, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, + 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x73, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x6c, 0x79, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x65, 0x76, 0x65, 0x72, 0x79, 0x6f, 0x6e, 0x65, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x67, 0x68, 0x74, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x65, 0x64, 0x68, 0x65, 0x72, 0x69, 0x74, 0x61, 0x67, 0x65, + 0x73, 0x68, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x65, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x72, 0x65, + 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, + 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x61, 0x6e, 0x79, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x73, 0x6c, + 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, + 0x6c, 0x79, 0x61, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x2e, 0x72, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x3e, 0x3c, 0x74, 0x72, + 0x3e, 0x3c, 0x74, 0x64, 0x63, 0x6f, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x72, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x65, 0x64, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, + 0x74, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x75, 0x6c, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x48, 0x6f, 0x6d, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x77, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x73, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x61, 0x6c, + 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x6c, + 0x79, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x3e, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, + 0x61, 0x74, 0x76, 0x69, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x57, 0x65, 0x73, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x76, 0x69, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x73, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x0a, 0x6d, 0x65, 0x61, 0x73, + 0x75, 0x72, 0x65, 0x73, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x76, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, + 0x65, 0x64, 0x76, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x69, 0x61, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x64, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x61, 0x63, 0x63, 0x75, + 0x72, 0x61, 0x74, 0x65, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x73, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, + 0x61, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x63, 0x72, 0x69, + 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x79, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, + 0x6e, 0x61, 0x6c, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x61, 0x63, 0x68, 0x69, 0x65, 0x76, 0x65, + 0x64, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, 0x2f, 0x3e, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x20, 0x20, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, + 0x6c, 0x79, 0x62, 0x72, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x6d, + 0x62, 0x69, 0x6e, 0x65, 0x64, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x61, 0x64, 0x65, 0x71, 0x75, 0x61, 0x74, 0x65, 0x70, 0x61, + 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x62, 0x6c, 0x65, 0x3c, 0x2f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x3e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x62, + 0x72, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, + 0x73, 0x65, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x20, 0x28, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x67, 0x72, + 0x61, 0x64, 0x75, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x6c, 0x61, + 0x79, 0x73, 0x69, 0x61, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x6d, + 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x6f, 0x20, + 0x63, 0x61, 0x74, 0x68, 0x6f, 0x6c, 0x69, 0x63, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x73, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x67, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x73, 0x74, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x73, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x3c, 0x2f, 0x75, 0x6c, + 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x63, + 0x69, 0x74, 0x69, 0x7a, 0x65, 0x6e, 0x73, 0x63, 0x6c, 0x6f, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x77, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x3c, 0x6c, 0x69, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x63, 0x61, 0x72, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x73, 0x65, 0x6e, 0x74, 0x65, + 0x6e, 0x63, 0x65, 0x3c, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x74, 0x68, 0x69, 0x6e, 0x6b, 0x69, 0x6e, + 0x67, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x29, 0x73, 0x6f, 0x75, 0x74, + 0x68, 0x65, 0x72, 0x6e, 0x4d, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6c, 0x20, 0x6d, + 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x75, 0x73, + 0x65, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x69, 0x6f, 0x72, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x63, 0x74, 0x6f, 0x62, + 0x65, 0x72, 0x20, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6d, + 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x2d, 0x2d, 0x26, 0x67, 0x74, 0x3b, 0x0a, + 0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x63, 0x68, 0x61, 0x69, + 0x72, 0x6d, 0x61, 0x6e, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x2f, 0x3e, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x69, 0x63, 0x68, 0x61, 0x72, + 0x64, 0x20, 0x77, 0x68, 0x61, 0x74, 0x65, 0x76, 0x65, 0x72, 0x70, 0x72, 0x6f, + 0x62, 0x61, 0x62, 0x6c, 0x79, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x62, 0x61, 0x73, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x6a, 0x75, 0x64, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x2e, 0x63, + 0x73, 0x73, 0x22, 0x20, 0x2f, 0x3e, 0x20, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, 0x0a, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x73, 0x63, 0x6f, 0x74, 0x6c, 0x61, + 0x6e, 0x64, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x49, 0x53, 0x42, 0x4e, 0x20, 0x30, + 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x22, 0x20, + 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x65, 0x72, + 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x73, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x6d, + 0x69, 0x6e, 0x69, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x74, 0x61, + 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x3a, 0x20, 0x27, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x27, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x42, 0x72, 0x69, 0x74, + 0x69, 0x73, 0x68, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x46, + 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x6f, + 0x75, 0x73, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x63, 0x6f, 0x6e, + 0x63, 0x65, 0x72, 0x6e, 0x73, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x76, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x57, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x73, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x66, + 0x6c, 0x65, 0x78, 0x69, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x6c, 0x61, 0x77, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x3d, 0x22, + 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x68, 0x61, 0x6d, 0x69, 0x6c, 0x74, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x74, 0x68, 0x65, 0x6d, 0x65, + 0x73, 0x2f, 0x2f, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x77, 0x69, 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x64, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, + 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x20, 0x6d, 0x65, 0x61, 0x73, + 0x75, 0x72, 0x65, 0x64, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x26, 0x68, 0x65, 0x6c, 0x6c, 0x69, + 0x70, 0x3b, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x22, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x22, 0x20, 0x22, 0x20, 0x2f, 0x3e, 0x3c, + 0x2f, 0x61, 0x3e, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x73, 0x65, + 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, + 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x6f, 0x70, 0x69, 0x6e, + 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73, 0x6c, + 0x69, 0x6e, 0x6b, 0x73, 0x22, 0x3e, 0x0a, 0x09, 0x3c, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x61, 0x74, + 0x75, 0x72, 0x64, 0x61, 0x79, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, + 0x69, 0x74, 0x65, 0x6d, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x64, 0x65, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x3d, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x45, 0x73, 0x70, 0x61, + 0xc3, 0xb1, 0x6f, 0x6c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x73, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x65, 0x72, 0x26, 0x71, 0x75, 0x6f, + 0x74, 0x3b, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x79, 0x6d, + 0x70, 0x74, 0x6f, 0x6d, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x64, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x22, 0x3e, 0x3c, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x6c, 0x65, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x20, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x2e, 0x0a, 0x0a, 0x53, 0x6f, 0x6d, + 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x73, 0x75, 0x69, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x62, 0x75, 0x6c, 0x67, 0x61, 0x72, 0x69, 0x61, + 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x28, 0x29, 0x3b, 0x64, 0x65, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6e, 0x63, 0x65, 0x70, 0x74, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x73, 0x4f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x3e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x61, 0x20, 0x26, + 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x79, 0x6f, + 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, + 0x20, 0x6d, 0x69, 0x63, 0x68, 0x69, 0x67, 0x61, 0x6e, 0x45, 0x6e, 0x67, 0x6c, + 0x69, 0x73, 0x68, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x62, 0x69, 0x61, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, + 0x6e, 0x67, 0x64, 0x72, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x66, 0x61, 0x63, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x69, 0x63, + 0x65, 0x72, 0x73, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, 0x31, + 0x22, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x66, 0x61, 0x6d, 0x69, + 0x6c, 0x69, 0x61, 0x72, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x63, 0x74, 0x73, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, + 0x70, 0x6f, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x20, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x69, 0x6e, + 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x73, 0x61, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, + 0x63, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x2e, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x70, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x67, 0x6c, 0x6f, 0x73, 0x73, 0x61, + 0x72, 0x79, 0x0a, 0x0a, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x67, 0x75, 0x69, + 0x64, 0x61, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x6d, 0x69, 0x64, 0x64, 0x6c, + 0x65, 0x22, 0x3e, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x73, 0x73, 0x63, 0x6f, 0x74, 0x74, 0x69, 0x73, + 0x68, 0x6a, 0x6f, 0x6e, 0x61, 0x74, 0x68, 0x61, 0x6e, 0x6d, 0x61, 0x6a, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x74, 0x68, 0x61, 0x69, 0x6c, 0x61, + 0x6e, 0x64, 0x74, 0x65, 0x61, 0x63, 0x68, 0x65, 0x72, 0x73, 0x3c, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x0a, 0x09, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x3b, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3c, 0x2f, + 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x6f, 0x6b, 0x6c, 0x61, 0x68, 0x6f, 0x6d, + 0x61, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x30, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x68, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x79, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x20, 0x28, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x2e, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x76, 0x69, 0x73, 0x69, 0x74, + 0x69, 0x6e, 0x67, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x70, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, + 0x20, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x22, 0x71, 0x75, 0x69, 0x63, + 0x6b, 0x6c, 0x79, 0x20, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x65, + 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x20, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, + 0x2c, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x22, 0x6d, 0x61, + 0x67, 0x6e, 0x65, 0x74, 0x69, 0x63, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x68, 0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x2e, 0x20, 0x57, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79, 0x64, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x26, 0x65, 0x61, 0x63, 0x75, 0x74, + 0x65, 0x3b, 0x68, 0x61, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x70, 0x61, 0x74, 0x69, 0x65, + 0x6e, 0x74, 0x73, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x61, 0x64, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x63, 0x61, 0x6d, 0x70, 0x62, 0x65, 0x6c, 0x6c, 0x3c, 0x21, 0x2d, 0x2d, + 0x20, 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x3c, + 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x5f, 0x70, 0x6f, 0x70, 0x75, 0x70, + 0x73, 0x7c, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2c, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20, + 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x3c, 0x62, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6c, 0x65, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x20, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x6e, 0x79, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x3c, + 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, + 0x65, 0x73, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x6d, 0x61, 0x72, + 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x6c, 0x79, 0x29, 0x2e, 0x0a, 0x0a, 0x54, + 0x68, 0x65, 0x20, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x6d, 0x75, + 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x0a, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x72, 0x74, 0x75, 0x67, + 0x75, 0xc3, 0xaa, 0x73, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x6f, 0x20, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0x0d, 0x0a, 0x61, 0x74, 0x74, 0x6f, 0x72, 0x6e, 0x65, 0x79, 0x65, 0x6d, 0x70, + 0x68, 0x61, 0x73, 0x69, 0x73, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x73, + 0x66, 0x61, 0x6e, 0x63, 0x79, 0x62, 0x6f, 0x78, 0x77, 0x6f, 0x72, 0x6c, 0x64, + 0x27, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x65, 0x64, 0x3d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x70, 0x78, 0x3b, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x6a, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, + 0x65, 0x64, 0x76, 0x61, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x68, 0x6f, + 0x6d, 0x70, 0x73, 0x6f, 0x6e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x30, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, 0x0a, + 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x20, 0x3c, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x20, 0x4f, 0x63, 0x74, 0x6f, + 0x62, 0x65, 0x72, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x20, 0x65, 0x78, + 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x6f, 0x6e, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x6d, 0x61, 0x72, 0x79, 0x6c, 0x61, 0x6e, 0x64, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, + 0x63, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x61, + 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e, + 0x67, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x73, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x29, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x62, 0x6f, 0x78, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x73, 0x70, 0x72, + 0x65, 0x67, 0x6e, 0x61, 0x6e, 0x74, 0x74, 0x6f, 0x6d, 0x6f, 0x72, 0x72, 0x6f, + 0x77, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x69, 0x63, 0x6f, 0x6e, + 0x2e, 0x70, 0x6e, 0x67, 0x6a, 0x61, 0x70, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x63, + 0x6f, 0x64, 0x65, 0x62, 0x61, 0x73, 0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x22, 0x3e, 0x67, 0x61, 0x6d, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x75, 0x63, + 0x68, 0x20, 0x61, 0x73, 0x20, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x6f, + 0x75, 0x72, 0x69, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x74, 0x6f, + 0x70, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x2e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x3e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x32, 0x6c, 0x61, 0x7a, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x6e, + 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x22, 0x3e, 0x0a, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, + 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x20, 0x26, 0x6c, 0x74, 0x3b, + 0x21, 0x2d, 0x2d, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x2f, + 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, + 0x3e, 0x0a, 0x28, 0xe7, 0xae, 0x80, 0xe4, 0xbd, 0x93, 0x29, 0x28, 0xe7, 0xb9, + 0x81, 0xe9, 0xab, 0x94, 0x29, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, + 0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x72, 0x6f, 0x6d, 0xc3, 0xa2, + 0x6e, 0xc4, 0x83, 0x74, 0xc3, 0xbc, 0x72, 0x6b, 0xc3, 0xa7, 0x65, 0xd8, 0xa7, + 0xd8, 0xb1, 0xd8, 0xaf, 0xd9, 0x88, 0x74, 0x61, 0x6d, 0x62, 0x69, 0xc3, 0xa9, + 0x6e, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x69, 0x61, 0x73, 0x6d, 0x65, 0x6e, 0x73, + 0x61, 0x6a, 0x65, 0x73, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x73, 0x64, + 0x65, 0x72, 0x65, 0x63, 0x68, 0x6f, 0x73, 0x6e, 0x61, 0x63, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x69, 0x6f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x63, 0x74, 0x6f, 0x75, 0x73, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x73, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x61, 0x67, 0x6f, 0x62, 0x69, 0x65, + 0x72, 0x6e, 0x6f, 0x65, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x61, 0x73, 0x61, 0x6e, + 0x75, 0x6e, 0x63, 0x69, 0x6f, 0x73, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x69, + 0x61, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x64, 0x65, 0x73, 0x70, + 0x75, 0xc3, 0xa9, 0x73, 0x64, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x73, 0x70, + 0x72, 0x6f, 0x79, 0x65, 0x63, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x6f, 0x70, 0xc3, 0xba, 0x62, 0x6c, 0x69, 0x63, 0x6f, 0x6e, 0x6f, 0x73, + 0x6f, 0x74, 0x72, 0x6f, 0x73, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x61, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x6d, 0x69, 0x6c, 0x6c, 0x6f, + 0x6e, 0x65, 0x73, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x74, 0x65, 0x70, 0x72, + 0x65, 0x67, 0x75, 0x6e, 0x74, 0x61, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, + 0x72, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x73, 0x70, 0x72, 0x6f, 0x62, + 0x6c, 0x65, 0x6d, 0x61, 0x73, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x6e, + 0x75, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x73, 0x6f, 0x70, 0x69, 0x6e, 0x69, 0xc3, + 0xb3, 0x6e, 0x69, 0x6d, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x72, 0x6d, 0x69, 0x65, + 0x6e, 0x74, 0x72, 0x61, 0x73, 0x61, 0x6d, 0xc3, 0xa9, 0x72, 0x69, 0x63, 0x61, + 0x76, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6f, 0x72, 0x73, 0x6f, 0x63, 0x69, 0x65, + 0x64, 0x61, 0x64, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x65, + 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x72, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x6f, 0x70, 0x61, 0x6c, 0x61, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0xc3, 0xa9, 0x73, 0x65, 0x6e, 0x74, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x65, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x6d, 0x69, 0x65, 0x6d, 0x62, 0x72, + 0x6f, 0x73, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x64, 0x63, 0xc3, 0xb3, + 0x72, 0x64, 0x6f, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x61, 0x67, 0x6f, 0x7a, 0x61, + 0x70, 0xc3, 0xa1, 0x67, 0x69, 0x6e, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, + 0x6c, 0x65, 0x73, 0x62, 0x6c, 0x6f, 0x71, 0x75, 0x65, 0x61, 0x72, 0x67, 0x65, + 0x73, 0x74, 0x69, 0xc3, 0xb3, 0x6e, 0x61, 0x6c, 0x71, 0x75, 0x69, 0x6c, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6d, 0x61, 0x73, 0x63, 0x69, 0x65, 0x6e, + 0x63, 0x69, 0x61, 0x73, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x6f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x61, 0x65, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f, 0x73, 0x70, 0xc3, 0xba, + 0x62, 0x6c, 0x69, 0x63, 0x61, 0x6f, 0x62, 0x6a, 0x65, 0x74, 0x69, 0x76, 0x6f, + 0x61, 0x6c, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x62, 0x75, 0x73, 0x63, 0x61, + 0x64, 0x6f, 0x72, 0x63, 0x61, 0x6e, 0x74, 0x69, 0x64, 0x61, 0x64, 0x65, 0x6e, + 0x74, 0x72, 0x61, 0x64, 0x61, 0x73, 0x61, 0x63, 0x63, 0x69, 0x6f, 0x6e, 0x65, + 0x73, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x6f, 0x73, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x72, 0x6d, 0x61, 0x79, 0x6f, 0x72, 0xc3, 0xad, 0x61, 0x61, + 0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x69, 0x61, 0x66, 0x75, 0x6e, 0x63, 0x69, 0xc3, + 0xb3, 0x6e, 0xc3, 0xba, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x73, 0x68, 0x61, 0x63, + 0x69, 0x65, 0x6e, 0x64, 0x6f, 0x61, 0x71, 0x75, 0x65, 0x6c, 0x6c, 0x6f, 0x73, + 0x65, 0x64, 0x69, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x66, 0x65, 0x72, 0x6e, 0x61, + 0x6e, 0x64, 0x6f, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x66, 0x61, + 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x6e, 0x75, 0x65, 0x73, 0x74, 0x72, 0x61, + 0x73, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x6f, 0x73, 0x62, 0x61, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x72, 0x63, 0x6f, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x6f, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x61, 0x72, 0x63, 0x6f, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x6f, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x6a, 0xc3, 0xb3, 0x76, 0x65, + 0x6e, 0x65, 0x73, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x74, 0x6f, 0x74, 0xc3, + 0xa9, 0x63, 0x6e, 0x69, 0x63, 0x61, 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x6e, 0x74, + 0x6f, 0x65, 0x6e, 0x65, 0x72, 0x67, 0xc3, 0xad, 0x61, 0x74, 0x72, 0x61, 0x62, + 0x61, 0x6a, 0x61, 0x72, 0x61, 0x73, 0x74, 0x75, 0x72, 0x69, 0x61, 0x73, 0x72, + 0x65, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x72, 0x62, 0x6f, 0x6c, 0x65, 0x74, 0xc3, 0xad, 0x6e, 0x73, 0x61, 0x6c, + 0x76, 0x61, 0x64, 0x6f, 0x72, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x61, + 0x74, 0x72, 0x61, 0x62, 0x61, 0x6a, 0x6f, 0x73, 0x70, 0x72, 0x69, 0x6d, 0x65, + 0x72, 0x6f, 0x73, 0x6e, 0x65, 0x67, 0x6f, 0x63, 0x69, 0x6f, 0x73, 0x6c, 0x69, + 0x62, 0x65, 0x72, 0x74, 0x61, 0x64, 0x64, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x73, 0x70, 0x61, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x70, 0x72, 0xc3, 0xb3, + 0x78, 0x69, 0x6d, 0x6f, 0x61, 0x6c, 0x6d, 0x65, 0x72, 0xc3, 0xad, 0x61, 0x61, + 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x65, 0x73, 0x71, 0x75, 0x69, 0xc3, 0xa9, 0x6e, + 0x65, 0x73, 0x63, 0x6f, 0x72, 0x61, 0x7a, 0xc3, 0xb3, 0x6e, 0x73, 0x65, 0x63, + 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x62, 0x75, 0x73, 0x63, 0x61, 0x6e, 0x64, 0x6f, + 0x6f, 0x70, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x69, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x6f, 0x74, 0x6f, + 0x64, 0x61, 0x76, 0xc3, 0xad, 0x61, 0x67, 0x61, 0x6c, 0x65, 0x72, 0xc3, 0xad, + 0x61, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x69, + 0x63, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74, 0x61, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x6f, 0x73, 0x63, 0x72, 0xc3, 0xad, 0x74, 0x69, 0x63, 0x61, 0x64, 0xc3, 0xb3, + 0x6c, 0x61, 0x72, 0x65, 0x73, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x63, 0x69, 0x61, + 0x64, 0x65, 0x62, 0x65, 0x72, 0xc3, 0xa1, 0x6e, 0x70, 0x65, 0x72, 0xc3, 0xad, + 0x6f, 0x64, 0x6f, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x69, 0x74, 0x61, 0x6d, 0x61, + 0x6e, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x70, 0x65, 0x71, 0x75, 0x65, 0xc3, 0xb1, + 0x6f, 0x72, 0x65, 0x63, 0x69, 0x62, 0x69, 0x64, 0x61, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x6e, 0x61, 0x6c, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x66, 0x65, 0x63, + 0x61, 0x6e, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x61, 0x6e, 0x61, 0x72, 0x69, + 0x61, 0x73, 0x64, 0x65, 0x73, 0x63, 0x61, 0x72, 0x67, 0x61, 0x64, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x6f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x72, 0x63, 0x61, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x65, 0x72, 0x65, 0x74, 0xc3, 0xa9, 0x63, 0x6e, + 0x69, 0x63, 0x6f, 0x64, 0x65, 0x62, 0x65, 0x72, 0xc3, 0xad, 0x61, 0x76, 0x69, + 0x76, 0x69, 0x65, 0x6e, 0x64, 0x61, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x7a, 0x61, + 0x73, 0x61, 0x64, 0x65, 0x6c, 0x61, 0x6e, 0x74, 0x65, 0x66, 0x75, 0x6e, 0x63, + 0x69, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6a, 0x6f, 0x73, 0x64, + 0x69, 0x66, 0xc3, 0xad, 0x63, 0x69, 0x6c, 0x63, 0x69, 0x75, 0x64, 0x61, 0x64, + 0x65, 0x73, 0x61, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x73, 0x61, 0x76, 0x61, + 0x6e, 0x7a, 0x61, 0x64, 0x61, 0x74, 0xc3, 0xa9, 0x72, 0x6d, 0x69, 0x6e, 0x6f, + 0x75, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x65, 0x73, 0x73, 0xc3, 0xa1, 0x6e, 0x63, + 0x68, 0x65, 0x7a, 0x63, 0x61, 0x6d, 0x70, 0x61, 0xc3, 0xb1, 0x61, 0x73, 0x6f, + 0x66, 0x74, 0x6f, 0x6e, 0x69, 0x63, 0x72, 0x65, 0x76, 0x69, 0x73, 0x74, 0x61, + 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x65, 0x73, 0x6d, 0x6f, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x66, + 0x61, 0x63, 0x75, 0x6c, 0x74, 0x61, 0x64, 0x63, 0x72, 0xc3, 0xa9, 0x64, 0x69, + 0x74, 0x6f, 0x64, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x73, 0x73, 0x75, 0x70, + 0x75, 0x65, 0x73, 0x74, 0x6f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x6f, 0x73, 0x70, 0x65, 0x71, 0x75, 0x65, + 0xc3, 0xb1, 0x61, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xb5, + 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82, 0xd1, + 0x8c, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x8b, + 0xd1, 0x82, 0xd1, 0x8c, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, + 0x95, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb3, + 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x8f, 0xd0, 0xb2, 0xd1, + 0x81, 0xd0, 0xb5, 0xd1, 0x85, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb9, + 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xb6, 0xd0, 0xb5, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, + 0xbb, 0xd0, 0xb8, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd1, 0x83, 0xd0, 0xb4, + 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x8c, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, + 0x82, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xb5, + 0xd0, 0xb1, 0xd1, 0x8f, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, + 0x81, 0xd0, 0xb5, 0xd0, 0xb1, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb4, + 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xb9, 0xd1, 0x82, 0xd1, 0x84, 0xd0, + 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, + 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, + 0xbe, 0xd0, 0xb9, 0xd0, 0xb8, 0xd0, 0xb3, 0xd1, 0x80, 0xd1, 0x8b, 0xd1, 0x82, + 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xb5, 0xd0, 0xb2, 0xd1, 0x81, 0xd0, 0xb5, 0xd0, + 0xbc, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd1, 0x8e, 0xd0, 0xbb, 0xd0, 0xb8, + 0xd1, 0x88, 0xd1, 0x8c, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0xd0, + 0xbf, 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xb5, + 0xd0, 0xb9, 0xd0, 0xb4, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, + 0xb8, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xb1, 0xd0, 0xbe, + 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd1, 0x83, 0xd1, 0x85, 0xd0, 0xbe, 0xd1, + 0x82, 0xd1, 0x8f, 0xd0, 0xb4, 0xd0, 0xb2, 0xd1, 0x83, 0xd1, 0x85, 0xd1, 0x81, + 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xbb, 0xd1, 0x8e, 0xd0, 0xb4, 0xd0, + 0xb8, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb8, + 0xd1, 0x80, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xb1, 0xd1, 0x8f, 0xd1, + 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xb2, 0xd0, 0xb8, 0xd0, 0xb4, + 0xd0, 0xb5, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, 0x8d, 0xd1, + 0x82, 0xd0, 0xb8, 0xd0, 0xbc, 0xd1, 0x81, 0xd1, 0x87, 0xd0, 0xb5, 0xd1, 0x82, + 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd1, 0x8b, 0xd1, 0x86, 0xd0, 0xb5, 0xd0, + 0xbd, 0xd1, 0x8b, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbb, 0xd0, 0xb2, + 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x8c, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, + 0xb5, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb4, 0xd1, 0x8b, 0xd1, 0x82, 0xd0, 0xb5, + 0xd0, 0xb1, 0xd0, 0xb5, 0xd0, 0xb2, 0xd1, 0x8b, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, + 0xbd, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xbf, + 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x83, 0xd0, 0xbf, 0xd1, + 0x80, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x86, 0xd0, 0xb0, + 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, + 0xb4, 0xd1, 0x8b, 0xd0, 0xb7, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x8e, 0xd0, 0xbc, + 0xd0, 0xbe, 0xd0, 0xb3, 0xd1, 0x83, 0xd0, 0xb4, 0xd1, 0x80, 0xd1, 0x83, 0xd0, + 0xb3, 0xd0, 0xb2, 0xd1, 0x81, 0xd0, 0xb5, 0xd0, 0xb9, 0xd0, 0xb8, 0xd0, 0xb4, + 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, + 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, + 0xd0, 0xb0, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, + 0x80, 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xb8, 0xd1, 0x8e, 0xd0, 0xbd, 0xd1, 0x8f, + 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x8c, 0xd0, 0x95, 0xd1, 0x81, 0xd1, + 0x82, 0xd1, 0x8c, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, 0xb0, 0xd0, 0xbd, + 0xd0, 0xb0, 0xd1, 0x88, 0xd0, 0xb8, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x84, 0xd9, + 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd9, 0x8a, 0xd8, 0xac, 0xd9, 0x85, + 0xd9, 0x8a, 0xd8, 0xb9, 0xd8, 0xae, 0xd8, 0xa7, 0xd8, 0xb5, 0xd8, 0xa9, 0xd8, + 0xa7, 0xd9, 0x84, 0xd8, 0xb0, 0xd9, 0x8a, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x8a, + 0xd9, 0x87, 0xd8, 0xac, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xa2, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xaf, + 0xd8, 0xaa, 0xd8, 0xad, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xb5, 0xd9, 0x81, 0xd8, + 0xad, 0xd8, 0xa9, 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7, + 0xd9, 0x84, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x8a, 0xd9, 0x83, 0xd9, 0x88, 0xd9, + 0x86, 0xd8, 0xb4, 0xd8, 0xa8, 0xd9, 0x83, 0xd8, 0xa9, 0xd9, 0x81, 0xd9, 0x8a, + 0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xa8, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, + 0xad, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xa1, 0xd8, 0xa3, 0xd9, 0x83, 0xd8, 0xab, + 0xd8, 0xb1, 0xd8, 0xae, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xad, 0xd8, 0xa8, 0xd8, 0xaf, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x84, + 0xd8, 0xaf, 0xd8, 0xb1, 0xd9, 0x88, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, 0xb6, 0xd8, + 0xba, 0xd8, 0xb7, 0xd8, 0xaa, 0xd9, 0x83, 0xd9, 0x88, 0xd9, 0x86, 0xd9, 0x87, + 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, 0xad, 0xd8, + 0xa9, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xb7, 0xd8, 0xa8, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x83, 0xd8, + 0xb4, 0xd9, 0x83, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x8a, 0xd9, 0x85, 0xd9, 0x83, + 0xd9, 0x86, 0xd9, 0x85, 0xd9, 0x86, 0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xb4, 0xd8, + 0xb1, 0xd9, 0x83, 0xd8, 0xa9, 0xd8, 0xb1, 0xd8, 0xa6, 0xd9, 0x8a, 0xd8, 0xb3, + 0xd9, 0x86, 0xd8, 0xb4, 0xd9, 0x8a, 0xd8, 0xb7, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, + 0xb0, 0xd8, 0xa7, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x86, 0xd8, 0xb4, + 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xaa, 0xd8, 0xb9, 0xd8, 0xa8, 0xd8, + 0xb1, 0xd8, 0xb1, 0xd8, 0xad, 0xd9, 0x85, 0xd8, 0xa9, 0xd9, 0x83, 0xd8, 0xa7, + 0xd9, 0x81, 0xd8, 0xa9, 0xd9, 0x8a, 0xd9, 0x82, 0xd9, 0x88, 0xd9, 0x84, 0xd9, + 0x85, 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xb2, 0xd9, 0x83, 0xd9, 0x84, 0xd9, 0x85, + 0xd8, 0xa9, 0xd8, 0xa3, 0xd8, 0xad, 0xd9, 0x85, 0xd8, 0xaf, 0xd9, 0x82, 0xd9, + 0x84, 0xd8, 0xa8, 0xd9, 0x8a, 0xd9, 0x8a, 0xd8, 0xb9, 0xd9, 0x86, 0xd9, 0x8a, + 0xd8, 0xb5, 0xd9, 0x88, 0xd8, 0xb1, 0xd8, 0xa9, 0xd8, 0xb7, 0xd8, 0xb1, 0xd9, + 0x8a, 0xd9, 0x82, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xac, + 0xd9, 0x88, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8, 0xae, 0xd8, 0xb1, 0xd9, + 0x89, 0xd9, 0x85, 0xd8, 0xb9, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xa7, 0xd8, 0xa8, + 0xd8, 0xad, 0xd8, 0xab, 0xd8, 0xb9, 0xd8, 0xb1, 0xd9, 0x88, 0xd8, 0xb6, 0xd8, + 0xa8, 0xd8, 0xb4, 0xd9, 0x83, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb3, 0xd8, 0xac, + 0xd9, 0x84, 0xd8, 0xa8, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x86, 0xd8, 0xae, 0xd8, + 0xa7, 0xd9, 0x84, 0xd8, 0xaf, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xa8, + 0xd9, 0x83, 0xd9, 0x84, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa8, 0xd8, 0xaf, 0xd9, + 0x88, 0xd9, 0x86, 0xd8, 0xa3, 0xd9, 0x8a, 0xd8, 0xb6, 0xd8, 0xa7, 0xd9, 0x8a, + 0xd9, 0x88, 0xd8, 0xac, 0xd8, 0xaf, 0xd9, 0x81, 0xd8, 0xb1, 0xd9, 0x8a, 0xd9, + 0x82, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa8, 0xd8, 0xaa, 0xd8, 0xa3, 0xd9, 0x81, + 0xd8, 0xb6, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb7, 0xd8, 0xa8, 0xd8, 0xae, 0xd8, + 0xa7, 0xd9, 0x83, 0xd8, 0xab, 0xd8, 0xb1, 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xb1, + 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x81, 0xd8, 0xb6, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, + 0xad, 0xd9, 0x84, 0xd9, 0x89, 0xd9, 0x86, 0xd9, 0x81, 0xd8, 0xb3, 0xd9, 0x87, + 0xd8, 0xa3, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xaf, 0xd9, + 0x88, 0xd8, 0xaf, 0xd8, 0xa3, 0xd9, 0x86, 0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xaf, + 0xd9, 0x8a, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, + 0x86, 0xd9, 0x85, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xb6, 0xd8, 0xaa, 0xd8, 0xb9, + 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xaf, 0xd8, 0xa7, 0xd8, 0xae, 0xd9, 0x84, 0xd9, + 0x85, 0xd9, 0x85, 0xd9, 0x83, 0xd9, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x06, 0x05, 0x04, 0x03, + 0x02, 0x01, 0x00, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x0e, + 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x18, 0x19, 0x1a, 0x1b, + 0x1c, 0x1d, 0x1e, 0x1f, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, + 0x07, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x65, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, + 0x54, 0x44, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x69, 0x6e, 0x67, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, + 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x61, 0x64, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, + 0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x3c, 0x2f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x3e, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, + 0x6c, 0x69, 0x61, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, + 0x69, 0x74, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, + 0x65, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x61, 0x6e, 0x6f, + 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x65, 0x73, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x61, 0x72, 0x79, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x7d, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x6f, 0x75, + 0x73, 0x73, 0x61, 0x74, 0x65, 0x6c, 0x6c, 0x69, 0x74, 0x65, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x65, 0x72, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x26, 0x72, 0x61, 0x71, 0x75, 0x6f, 0x3b, 0x3c, 0x2f, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x62, 0x65, 0x61, 0x75, 0x74, 0x69, 0x66, 0x75, 0x6c, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x65, + 0x64, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x70, 0x72, 0x6f, + 0x6d, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x4e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, + 0x28, 0x29, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x75, + 0x6e, 0x63, 0x65, 0x64, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x0a, + 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, + 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x74, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x69, 0x73, 0x6d, 0x74, + 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6c, 0x73, 0x65, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x41, 0x6c, 0x65, 0x78, 0x61, 0x6e, 0x64, 0x65, 0x72, + 0x61, 0x70, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x6d, 0x61, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x73, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x61, 0x66, 0x66, + 0x69, 0x6c, 0x69, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x3e, 0x74, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x69, + 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x6f, + 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x62, 0x69, 0x6f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x79, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, + 0x70, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x46, 0x72, 0x61, 0x6e, + 0xc3, 0xa7, 0x61, 0x69, 0x73, 0x48, 0x6f, 0x6c, 0x6c, 0x79, 0x77, 0x6f, 0x6f, + 0x64, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x64, 0x61, 0x72, 0x64, 0x73, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3e, 0x0a, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x65, 0x64, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x6f, + 0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x75, 0x73, 0x69, 0x6e, + 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x3e, 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x65, 0x64, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, 0x77, 0x69, 0x64, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, + 0x63, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6e, 0x65, + 0x77, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x6c, + 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x73, 0x73, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x65, + 0x64, 0x45, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x3c, 0x2f, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x65, + 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x64, 0x74, 0x77, 0x6f, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, + 0x53, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x22, + 0x3e, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x69, 0x6e, 0x63, + 0x72, 0x65, 0x61, 0x73, 0x65, 0x64, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x20, + 0x6f, 0x66, 0x70, 0x65, 0x72, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x74, 0x72, + 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, + 0x61, 0x72, 0x79, 0x70, 0x6f, 0x72, 0x74, 0x72, 0x61, 0x79, 0x65, 0x64, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6c, 0x69, 0x7a, 0x61, + 0x62, 0x65, 0x74, 0x68, 0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3e, + 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x73, 0x75, + 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6f, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x73, 0x6f, + 0x6d, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, 0x3c, + 0x2f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x79, 0x72, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x6f, 0x75, 0x73, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x74, 0x65, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x6e, 0x6f, 0x20, + 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x63, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x79, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x3b, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, + 0x70, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x69, 0x74, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x63, 0x65, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x70, + 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x73, 0x61, 0x64, 0x76, 0x61, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x46, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x6d, 0x6f, 0x63, 0x72, 0x61, 0x63, + 0x79, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x73, 0x75, 0x66, 0x66, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x63, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x73, + 0x61, 0x69, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x74, 0x20, 0x6d, 0x61, + 0x79, 0x20, 0x62, 0x65, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x3c, 0x2f, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x64, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x73, 0x75, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, + 0x20, 0x30, 0x73, 0x70, 0x69, 0x72, 0x69, 0x74, 0x75, 0x61, 0x6c, 0x3c, 0x2f, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x0a, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x6f, 0x66, 0x74, 0x67, 0x72, 0x61, 0x64, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x64, + 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x65, 0x64, 0x68, 0x65, 0x20, 0x62, 0x65, + 0x63, 0x61, 0x6d, 0x65, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, + 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x6a, 0x73, 0x68, 0x6f, 0x75, 0x73, + 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x64, 0x6c, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x65, 0x64, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x63, + 0x65, 0x6e, 0x74, 0x75, 0x72, 0x69, 0x65, 0x73, 0x4a, 0x61, 0x70, 0x61, 0x6e, + 0x65, 0x73, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x61, 0x6c, 0x67, 0x6f, + 0x72, 0x69, 0x74, 0x68, 0x6d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x73, 0x72, 0x65, 0x62, 0x65, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x72, 0x61, + 0x67, 0x65, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x69, 0x6e, + 0x76, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x6c, 0x74, 0x68, + 0x6f, 0x75, 0x67, 0x68, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x63, 0x6f, 0x6e, 0x64, 0x75, 0x63, 0x74, 0x65, 0x64, 0x29, 0x2c, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x64, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x46, 0x65, 0x62, + 0x72, 0x75, 0x61, 0x72, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x6f, 0x75, + 0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x65, 0x78, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x74, 0x63, + 0x6f, 0x6c, 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x74, 0x65, 0x63, 0x68, 0x6e, + 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x6f, 0x66, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x46, 0x61, + 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x65, 0x6c, + 0x65, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x73, + 0x69, 0x76, 0x65, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x09, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x65, 0x64, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x74, 0x68, 0x6f, 0x73, + 0x65, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x64, 0x69, 0x66, + 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x64, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x63, 0x6f, + 0x6e, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x2e, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x69, 0x63, 0x61, 0x6c, 0x63, 0x6f, 0x61, 0x6c, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x64, 0x65, 0x63, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, + 0x74, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x65, 0x76, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, + 0x72, 0x22, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x6f, 0x61, 0x6c, + 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x65, 0x64, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x41, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x66, 0x75, 0x72, 0x6e, + 0x69, 0x74, 0x75, 0x72, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x20, 0x20, 0x6f, 0x6e, 0x62, 0x6c, 0x75, 0x72, 0x3d, 0x22, 0x73, 0x75, 0x73, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, + 0x6e, 0x74, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x4d, 0x6f, + 0x72, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x62, 0x6f, 0x6c, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x77, + 0x65, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x65, 0x6d, 0x6f, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, + 0x6e, 0x61, 0x72, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x61, 0x64, 0x76, 0x6f, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x64, 0x69, 0x72, + 0x3d, 0x22, 0x6c, 0x74, 0x72, 0x22, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, + 0x65, 0x73, 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x20, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x73, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x53, 0x65, 0x70, 0x74, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x61, 0x64, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x28, + 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x20, 0x73, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x65, 0x6c, 0x61, + 0x62, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x63, 0x65, + 0x72, 0x74, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x4a, + 0x65, 0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x74, 0x68, 0x65, 0x79, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x6e, 0x63, 0x65, 0x73, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x61, 0x72, 0x62, 0x69, 0x74, 0x72, 0x61, 0x72, 0x79, 0x72, 0x65, 0x63, + 0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x70, 0x78, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x74, 0x68, + 0x65, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, + 0x6f, 0x75, 0x72, 0x57, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x65, + 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x62, 0x65, 0x67, 0x61, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, + 0x6d, 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, + 0x6e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x61, + 0x72, 0x79, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x6f, 0x63, + 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x3c, 0x2f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x3e, 0x3c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x6b, 0x69, 0x6e, 0x64, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x63, 0x69, 0x65, 0x74, 0x69, 0x65, + 0x73, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x69, 0x64, 0x65, 0x20, 0x2d, 0x2d, + 0x26, 0x67, 0x74, 0x3b, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x77, 0x65, + 0x73, 0x74, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x72, 0x61, + 0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x73, + 0x70, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x65, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x62, 0x75, 0x72, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x61, 0x20, 0x73, + 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x74, 0x68, 0x65, 0x79, 0x20, 0x77, 0x65, + 0x72, 0x65, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x4e, 0x6f, + 0x72, 0x77, 0x65, 0x67, 0x69, 0x61, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x70, + 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, + 0x44, 0x61, 0x74, 0x65, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, + 0x66, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x66, 0x74, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x65, 0x71, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x72, 0x65, 0x67, + 0x75, 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x68, 0x65, 0x6e, 0x6f, 0x6d, + 0x65, 0x6e, 0x61, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x74, + 0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x22, 0x3e, 0x73, 0x75, 0x62, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x66, 0x41, 0x6d, 0x6f, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x41, 0x69, 0x72, + 0x20, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, + 0x6f, 0x66, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x69, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x74, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x63, + 0x6f, 0x6e, 0x71, 0x75, 0x65, 0x72, 0x65, 0x64, 0x61, 0x72, 0x65, 0x20, 0x73, + 0x74, 0x69, 0x6c, 0x6c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, + 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, + 0x20, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x6d, 0x6f, 0x6c, + 0x65, 0x63, 0x75, 0x6c, 0x65, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x69, + 0x73, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x74, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x68, + 0x6f, 0x6f, 0x64, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x64, 0x64, + 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x73, 0x69, 0x6e, 0x67, 0x61, + 0x70, 0x6f, 0x72, 0x65, 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, + 0x66, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x66, + 0x6c, 0x69, 0x63, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, + 0x0a, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x77, 0x65, 0x72, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6d, + 0x6f, 0x72, 0x65, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x69, 0x61, 0x6e, 0x73, + 0x64, 0x65, 0x6c, 0x69, 0x63, 0x69, 0x6f, 0x75, 0x73, 0x70, 0x72, 0x69, 0x73, + 0x6f, 0x6e, 0x65, 0x72, 0x73, 0x61, 0x64, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, 0x3c, 0x21, 0x5b, + 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x63, 0x74, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x20, 0x62, 0x67, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, + 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x6f, 0x66, 0x66, 0x69, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x73, 0x65, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x6c, + 0x79, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x66, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x3c, 0x2f, 0x62, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x3e, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x69, 0x6e, 0x63, 0x72, + 0x65, 0x61, 0x73, 0x65, 0x73, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x21, 0x2d, + 0x2d, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x57, 0x69, + 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x77, + 0x61, 0x73, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x56, 0x65, 0x6e, 0x65, 0x7a, + 0x75, 0x65, 0x6c, 0x61, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x6c, 0x79, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x69, + 0x63, 0x66, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6b, 0x69, 0x70, 0x65, 0x64, + 0x69, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x77, 0x61, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c, 0x65, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x73, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x61, 0x77, 0x61, 0x79, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x6d, 0x6f, 0x6c, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x72, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x65, 0x6c, 0x79, 0x64, 0x69, 0x73, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x3e, 0x26, + 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x73, 0x6d, 0x73, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x46, 0x72, 0x69, 0x65, 0x64, 0x72, 0x69, 0x63, 0x68, 0x77, 0x61, 0x73, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, + 0x20, 0x66, 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x69, + 0x6e, 0x67, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x70, 0x68, + 0x79, 0x73, 0x69, 0x63, 0x69, 0x73, 0x74, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73, + 0x20, 0x69, 0x6e, 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x73, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, 0x74, 0x6f, + 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x72, 0x76, + 0x69, 0x76, 0x69, 0x6e, 0x67, 0x7d, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3e, 0x68, 0x69, 0x73, 0x20, 0x64, 0x65, 0x61, 0x74, 0x68, 0x61, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x77, 0x61, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x61, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x73, 0x20, 0x6f, 0x66, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x4f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x73, 0x6d, + 0x69, 0x73, 0x73, 0x65, 0x64, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x73, + 0x74, 0x72, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x73, 0x64, 0x75, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, + 0x76, 0x65, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x61, 0x6c, + 0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x67, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x70, + 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x69, 0x6d, 0x67, 0x20, + 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x72, + 0x6e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x6e, 0x65, + 0x65, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x74, 0x68, 0x65, 0x20, 0x47, 0x72, + 0x65, 0x61, 0x74, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x65, 0x65, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x76, 0x69, 0x65, 0x77, 0x65, + 0x64, 0x20, 0x61, 0x73, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x20, 0x6f, 0x6e, + 0x69, 0x64, 0x65, 0x61, 0x20, 0x74, 0x68, 0x61, 0x74, 0x74, 0x68, 0x65, 0x20, + 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6f, + 0x66, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x65, + 0x73, 0x65, 0x20, 0x61, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x22, 0x3e, 0x63, 0x61, 0x72, 0x65, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x6d, 0x61, + 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, + 0x20, 0x6f, 0x66, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x70, 0x72, 0x65, 0x64, 0x69, + 0x63, 0x74, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, + 0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x74, + 0x65, 0x6e, 0x20, 0x20, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x70, 0x72, + 0x6f, 0x62, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x50, 0x72, 0x6f, 0x66, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x73, 0x61, 0x79, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x68, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x48, 0x75, 0x6e, 0x67, + 0x61, 0x72, 0x69, 0x61, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, + 0x66, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x20, 0x61, 0x73, 0x55, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x66, 0x6f, + 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x69, 0x6e, 0x66, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x68, + 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, + 0x61, 0x72, 0x22, 0x3e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x61, 0x6c, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6f, + 0x66, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, + 0x63, 0x74, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69, 0x61, 0x6e, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x6c, 0x69, 0x76, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x6e, 0x65, 0x61, 0x73, 0x69, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x70, + 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x0a, 0x26, 0x6c, 0x74, 0x3b, + 0x21, 0x2d, 0x2d, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x66, + 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x77, 0x61, 0x73, 0x20, + 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x74, 0x6f, 0x6f, 0x6b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x62, 0x65, 0x6c, + 0x69, 0x65, 0x66, 0x20, 0x69, 0x6e, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, + 0x6e, 0x73, 0x61, 0x73, 0x20, 0x66, 0x61, 0x72, 0x20, 0x61, 0x73, 0x70, 0x72, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x3c, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x43, 0x68, 0x72, 0x69, 0x73, + 0x74, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x0a, 0x0a, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, + 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x61, 0x73, + 0x74, 0x6d, 0x61, 0x67, 0x61, 0x7a, 0x69, 0x6e, 0x65, 0x73, 0x3e, 0x3c, 0x73, + 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, + 0x65, 0x65, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x20, 0x6f, 0x66, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x61, + 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x73, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, 0x77, 0x6e, + 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x61, 0x6e, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, + 0x6e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x64, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x77, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x6e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3b, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x69, 0x6e, 0x68, 0x61, 0x62, 0x69, + 0x74, 0x65, 0x64, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x74, 0x4a, + 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x20, 0x31, 0x3c, 0x2f, 0x66, 0x6f, 0x6f, + 0x74, 0x65, 0x72, 0x3e, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x6c, 0x79, + 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x20, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x3b, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x64, 0x65, + 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x63, + 0x6f, 0x6e, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2e, 0x70, 0x68, 0x70, 0x61, 0x73, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, + 0x65, 0x6e, 0x67, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x72, 0x65, 0x63, 0x65, + 0x6e, 0x74, 0x6c, 0x79, 0x2c, 0x66, 0x65, 0x77, 0x20, 0x79, 0x65, 0x61, 0x72, + 0x73, 0x77, 0x65, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x0a, 0x3c, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x61, 0x72, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x63, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6b, 0x65, 0x79, 0x63, 0x6f, 0x6e, 0x64, 0x65, 0x6d, 0x6e, 0x65, 0x64, 0x61, + 0x6c, 0x73, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2c, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x6f, 0x66, + 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x65, 0x64, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x6d, 0x69, 0x6e, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x3e, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x61, 0x64, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, + 0x68, 0x65, 0x79, 0x20, 0x77, 0x65, 0x72, 0x65, 0x61, 0x6e, 0x79, 0x20, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x75, 0x63, 0x68, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x77, 0x61, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, + 0x61, 0x6c, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x79, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x73, 0x77, + 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x68, 0x69, 0x72, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x20, 0x32, 0x77, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x79, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, + 0x6e, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x68, + 0x69, 0x73, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x64, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x22, 0x3e, 0x0a, 0x70, 0x69, 0x65, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x74, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x73, 0x65, + 0x65, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x73, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x20, 0x3c, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3e, 0x67, 0x69, + 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x69, 0x61, 0x6e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x30, 0x76, 0x69, 0x65, 0x77, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x2c, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, + 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x6f, + 0x66, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x6e, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20, + 0x6f, 0x66, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x65, + 0x64, 0x6c, 0x79, 0x43, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x77, + 0x61, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x61, 0x72, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, + 0x77, 0x61, 0x73, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x6f, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f, + 0x66, 0x6d, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x75, 0x63, + 0x68, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, + 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x2c, 0x20, + 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x4d, 0x75, 0x73, 0x65, 0x75, 0x6d, + 0x20, 0x6f, 0x66, 0x6c, 0x6f, 0x75, 0x69, 0x73, 0x69, 0x61, 0x6e, 0x61, 0x28, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x69, 0x6e, 0x6e, 0x65, + 0x73, 0x6f, 0x74, 0x61, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, + 0x61, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x6f, 0x6d, 0x69, + 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x66, + 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x30, 0x30, 0x70, 0x78, 0x7c, 0x72, 0x69, + 0x67, 0x68, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x6d, 0x6f, + 0x75, 0x73, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x28, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x73, 0x63, 0x6f, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x6f, 0x75, 0x74, 0x20, 0x61, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x6f, 0x6d, + 0x65, 0x77, 0x68, 0x6f, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x61, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, + 0x6f, 0x66, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x74, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x6d, 0x65, 0x61, 0x73, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x70, 0x61, 0x70, 0x65, 0x72, 0x62, 0x61, 0x63, 0x6b, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3e, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x65, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x20, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x79, 0x61, 0x6e, + 0x64, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3e, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x70, 0x6f, 0x77, 0x65, 0x72, + 0x20, 0x61, 0x6e, 0x64, 0x6f, 0x66, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, + 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x3b, 0x43, 0x68, 0x75, 0x72, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x76, 0x65, 0x72, 0x79, 0x20, 0x68, 0x69, + 0x67, 0x68, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x2d, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x3d, 0x22, 0x2f, 0x63, 0x67, 0x69, 0x2d, 0x62, 0x69, 0x6e, 0x2f, 0x74, + 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x61, 0x66, 0x72, 0x69, 0x6b, + 0x61, 0x61, 0x6e, 0x73, 0x65, 0x73, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x6f, + 0x66, 0x72, 0x61, 0x6e, 0xc3, 0xa7, 0x61, 0x69, 0x73, 0x6c, 0x61, 0x74, 0x76, + 0x69, 0x65, 0xc5, 0xa1, 0x75, 0x6c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x69, 0xc5, + 0xb3, 0xc4, 0x8c, 0x65, 0xc5, 0xa1, 0x74, 0x69, 0x6e, 0x61, 0xc4, 0x8d, 0x65, + 0xc5, 0xa1, 0x74, 0x69, 0x6e, 0x61, 0xe0, 0xb9, 0x84, 0xe0, 0xb8, 0x97, 0xe0, + 0xb8, 0xa2, 0xe6, 0x97, 0xa5, 0xe6, 0x9c, 0xac, 0xe8, 0xaa, 0x9e, 0xe7, 0xae, + 0x80, 0xe4, 0xbd, 0x93, 0xe5, 0xad, 0x97, 0xe7, 0xb9, 0x81, 0xe9, 0xab, 0x94, + 0xe5, 0xad, 0x97, 0xed, 0x95, 0x9c, 0xea, 0xb5, 0xad, 0xec, 0x96, 0xb4, 0xe4, + 0xb8, 0xba, 0xe4, 0xbb, 0x80, 0xe4, 0xb9, 0x88, 0xe8, 0xae, 0xa1, 0xe7, 0xae, + 0x97, 0xe6, 0x9c, 0xba, 0xe7, 0xac, 0x94, 0xe8, 0xae, 0xb0, 0xe6, 0x9c, 0xac, + 0xe8, 0xa8, 0x8e, 0xe8, 0xab, 0x96, 0xe5, 0x8d, 0x80, 0xe6, 0x9c, 0x8d, 0xe5, + 0x8a, 0xa1, 0xe5, 0x99, 0xa8, 0xe4, 0xba, 0x92, 0xe8, 0x81, 0x94, 0xe7, 0xbd, + 0x91, 0xe6, 0x88, 0xbf, 0xe5, 0x9c, 0xb0, 0xe4, 0xba, 0xa7, 0xe4, 0xbf, 0xb1, + 0xe4, 0xb9, 0x90, 0xe9, 0x83, 0xa8, 0xe5, 0x87, 0xba, 0xe7, 0x89, 0x88, 0xe7, + 0xa4, 0xbe, 0xe6, 0x8e, 0x92, 0xe8, 0xa1, 0x8c, 0xe6, 0xa6, 0x9c, 0xe9, 0x83, + 0xa8, 0xe8, 0x90, 0xbd, 0xe6, 0xa0, 0xbc, 0xe8, 0xbf, 0x9b, 0xe4, 0xb8, 0x80, + 0xe6, 0xad, 0xa5, 0xe6, 0x94, 0xaf, 0xe4, 0xbb, 0x98, 0xe5, 0xae, 0x9d, 0xe9, + 0xaa, 0x8c, 0xe8, 0xaf, 0x81, 0xe7, 0xa0, 0x81, 0xe5, 0xa7, 0x94, 0xe5, 0x91, + 0x98, 0xe4, 0xbc, 0x9a, 0xe6, 0x95, 0xb0, 0xe6, 0x8d, 0xae, 0xe5, 0xba, 0x93, + 0xe6, 0xb6, 0x88, 0xe8, 0xb4, 0xb9, 0xe8, 0x80, 0x85, 0xe5, 0x8a, 0x9e, 0xe5, + 0x85, 0xac, 0xe5, 0xae, 0xa4, 0xe8, 0xae, 0xa8, 0xe8, 0xae, 0xba, 0xe5, 0x8c, + 0xba, 0xe6, 0xb7, 0xb1, 0xe5, 0x9c, 0xb3, 0xe5, 0xb8, 0x82, 0xe6, 0x92, 0xad, + 0xe6, 0x94, 0xbe, 0xe5, 0x99, 0xa8, 0xe5, 0x8c, 0x97, 0xe4, 0xba, 0xac, 0xe5, + 0xb8, 0x82, 0xe5, 0xa4, 0xa7, 0xe5, 0xad, 0xa6, 0xe7, 0x94, 0x9f, 0xe8, 0xb6, + 0x8a, 0xe6, 0x9d, 0xa5, 0xe8, 0xb6, 0x8a, 0xe7, 0xae, 0xa1, 0xe7, 0x90, 0x86, + 0xe5, 0x91, 0x98, 0xe4, 0xbf, 0xa1, 0xe6, 0x81, 0xaf, 0xe7, 0xbd, 0x91, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x69, 0x6f, 0x73, 0x61, 0x72, 0x74, 0xc3, 0xad, + 0x63, 0x75, 0x6c, 0x6f, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, + 0x62, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x63, 0x75, 0x61, 0x6c, + 0x71, 0x75, 0x69, 0x65, 0x72, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x64, + 0x6f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x6f, 0x73, 0x70, 0x6f, 0x6c, + 0xc3, 0xad, 0x74, 0x69, 0x63, 0x61, 0x72, 0x65, 0x73, 0x70, 0x75, 0x65, 0x73, + 0x74, 0x61, 0x77, 0x69, 0x6b, 0x69, 0x70, 0x65, 0x64, 0x69, 0x61, 0x73, 0x69, + 0x67, 0x75, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x62, 0xc3, 0xba, 0x73, 0x71, 0x75, + 0x65, 0x64, 0x61, 0x63, 0x6f, 0x6d, 0x75, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x73, + 0x65, 0x67, 0x75, 0x72, 0x69, 0x64, 0x61, 0x64, 0x70, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x70, 0x72, 0x65, 0x67, 0x75, 0x6e, 0x74, 0x61, 0x73, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x69, 0x64, 0x6f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, + 0x61, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x61, 0x73, 0x64, 0x69, 0x63, + 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x72, 0x65, 0x6c, 0x61, 0x63, 0x69, 0xc3, + 0xb3, 0x6e, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x73, 0x69, + 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x79, 0x65, 0x63, + 0x74, 0x6f, 0x73, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x61, 0x73, 0x69, + 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x6f, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x64, 0x61, 0x64, 0x65, 0x6e, 0x63, 0x75, 0x65, 0x6e, 0x74, 0x72, 0x61, + 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0xc3, 0xad, 0x61, 0x69, 0x6d, 0xc3, 0xa1, + 0x67, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x61, + 0x72, 0x64, 0x65, 0x73, 0x63, 0x61, 0x72, 0x67, 0x61, 0x72, 0x6e, 0x65, 0x63, + 0x65, 0x73, 0x61, 0x72, 0x69, 0x6f, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x69, 0xc3, + 0xb3, 0x6e, 0x74, 0x65, 0x6c, 0xc3, 0xa9, 0x66, 0x6f, 0x6e, 0x6f, 0x63, 0x6f, + 0x6d, 0x69, 0x73, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x61, 0x6e, 0x63, 0x69, 0x6f, + 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x64, 0x61, 0x64, 0x65, + 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x72, 0x61, 0x6e, 0xc3, 0xa1, 0x6c, + 0x69, 0x73, 0x69, 0x73, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x6f, 0x73, + 0x74, 0xc3, 0xa9, 0x72, 0x6d, 0x69, 0x6e, 0x6f, 0x73, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x6e, 0x63, 0x69, 0x61, 0x65, 0x74, 0x69, 0x71, 0x75, 0x65, 0x74, 0x61, + 0x73, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x66, 0x75, 0x6e, + 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x61, + 0x64, 0x6f, 0x63, 0x61, 0x72, 0xc3, 0xa1, 0x63, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x6f, 0x70, 0x69, 0x65, 0x64, 0x61, 0x64, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x69, 0x6f, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x69, 0x64, 0x61, 0x64, 0x6d, + 0x75, 0x6e, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x63, 0x72, 0x65, 0x61, 0x63, + 0x69, 0xc3, 0xb3, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x61, 0x72, 0x67, 0x61, 0x73, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x63, 0x6f, 0x6d, 0x65, + 0x72, 0x63, 0x69, 0x61, 0x6c, 0x6f, 0x70, 0x69, 0x6e, 0x69, 0x6f, 0x6e, 0x65, + 0x73, 0x65, 0x6a, 0x65, 0x72, 0x63, 0x69, 0x63, 0x69, 0x6f, 0x65, 0x64, 0x69, + 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x61, 0x6c, 0x61, 0x6d, 0x61, 0x6e, + 0x63, 0x61, 0x67, 0x6f, 0x6e, 0x7a, 0xc3, 0xa1, 0x6c, 0x65, 0x7a, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x70, 0x65, 0x6c, 0xc3, 0xad, 0x63, + 0x75, 0x6c, 0x61, 0x72, 0x65, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x73, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x72, 0x72, 0x61, + 0x67, 0x6f, 0x6e, 0x61, 0x70, 0x72, 0xc3, 0xa1, 0x63, 0x74, 0x69, 0x63, 0x61, + 0x6e, 0x6f, 0x76, 0x65, 0x64, 0x61, 0x64, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x70, + 0x75, 0x65, 0x73, 0x74, 0x61, 0x70, 0x61, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x65, + 0x73, 0x74, 0xc3, 0xa9, 0x63, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x6f, 0x62, 0x6a, + 0x65, 0x74, 0x69, 0x76, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, + 0x6f, 0x73, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, + 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x88, + 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, + 0xb5, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x87, + 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0x95, 0xe0, + 0xa5, 0x81, 0xe0, 0xa4, 0x9b, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0x95, + 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xad, 0xe0, + 0xa5, 0x80, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, + 0xb0, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x88, + 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0x64, 0x69, 0x70, 0x6c, 0x6f, + 0x64, 0x6f, 0x63, 0x73, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xaf, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xab, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x94, + 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa4, 0xb9, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, + 0xa4, 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0x96, 0xe0, 0xa5, + 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbf, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb5, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xae, + 0xe0, 0xa5, 0x8c, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xb2, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, + 0x9c, 0xe0, 0xa5, 0x89, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xa6, + 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xa8, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x97, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xad, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0x97, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xb8, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0x95, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xb8, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0x97, + 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xae, 0xe0, + 0xa4, 0x96, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xad, 0xe0, 0xa5, 0x80, + 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa4, 0xe0, + 0xa5, 0x81, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, + 0x9f, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x85, + 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x90, 0xe0, 0xa4, 0xb8, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, + 0xb2, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x8a, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa4, 0x9a, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x90, 0xe0, 0xa4, + 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xa6, 0xe0, + 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, + 0xa6, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, + 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x96, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, + 0xac, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0x86, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, + 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb2, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x89, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xad, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0xb2, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x97, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, + 0xa4, 0x95, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa0, 0xe0, 0xa5, + 0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x81, + 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0, + 0xa4, 0xb9, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xa4, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0x86, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x95, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8c, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, + 0xb6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, + 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0x96, 0xe0, 0xa5, + 0x81, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x97, 0xe0, 0xa5, 0x80, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x65, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x3e, 0x0d, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x76, 0x65, 0x72, 0x79, + 0x74, 0x68, 0x69, 0x6e, 0x67, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x61, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x26, 0x63, 0x6f, 0x70, 0x79, 0x3b, 0x20, 0x32, 0x30, 0x31, + 0x6a, 0x61, 0x76, 0x61, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x63, 0x68, 0x61, + 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x62, 0x72, 0x65, 0x61, 0x64, 0x63, + 0x72, 0x75, 0x6d, 0x62, 0x74, 0x68, 0x65, 0x6d, 0x73, 0x65, 0x6c, 0x76, 0x65, + 0x73, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6c, 0x69, 0x66, + 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x4e, + 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, + 0x6f, 0x78, 0x22, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x73, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x70, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x61, 0x73, 0x20, 0x77, 0x65, + 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x75, 0x6e, 0x74, 0x27, 0x2c, 0x20, 0x27, 0x55, + 0x41, 0x2d, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x6c, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, + 0x74, 0x65, 0x64, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, + 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x20, 0x3d, 0x20, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x69, 0x6d, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x26, 0x6c, 0x74, 0x3b, 0x62, 0x72, 0x26, 0x67, 0x74, + 0x3b, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x70, 0x6f, + 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x67, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x65, 0x77, 0x73, + 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x54, 0x65, 0x63, + 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x72, 0x6c, 0x69, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, + 0x6e, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x2e, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x62, + 0x69, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x76, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x6f, 0x6f, 0x64, + 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x61, 0x74, 0x6d, 0x6f, 0x73, 0x70, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x3d, 0x22, 0x3c, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x75, 0x62, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x68, 0x65, + 0x6e, 0x6f, 0x6d, 0x65, 0x6e, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x63, 0x69, 0x70, + 0x6c, 0x69, 0x6e, 0x65, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x6e, 0x67, 0x22, + 0x20, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x61, 0x72, 0x69, 0x65, 0x73, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x6f, + 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x28, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x22, 0x20, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x22, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x64, 0x65, 0x6d, + 0x6f, 0x63, 0x72, 0x61, 0x74, 0x69, 0x63, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x22, 0x3e, + 0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x6c, 0x69, + 0x6e, 0x67, 0x75, 0x69, 0x73, 0x74, 0x69, 0x63, 0x70, 0x78, 0x3b, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70, + 0x68, 0x79, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x75, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x66, 0x61, 0x63, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, + 0x7a, 0x65, 0x64, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x6d, 0x61, 0x69, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75, + 0x6c, 0x61, 0x72, 0x79, 0x68, 0x79, 0x70, 0x6f, 0x74, 0x68, 0x65, 0x73, 0x69, + 0x73, 0x2e, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x28, 0x29, 0x3b, 0x26, 0x61, + 0x6d, 0x70, 0x3b, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x22, 0x61, 0x73, 0x73, 0x75, + 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x65, 0x64, 0x63, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x73, 0x74, 0x73, 0x65, 0x78, 0x70, + 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x63, 0x6f, + 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x64, 0x65, 0x70, 0x61, 0x72, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x6f, 0x6f, 0x6e, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x69, + 0x6e, 0x76, 0x65, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x72, 0x6f, 0x6e, + 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x67, 0x65, 0x6f, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3d, 0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, + 0x22, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x64, 0x65, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x70, 0x75, 0x6e, 0x69, 0x73, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x72, + 0x65, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x61, 0x64, 0x61, 0x70, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x73, 0x75, 0x70, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x68, 0x31, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x30, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x63, 0x65, 0x6c, 0x65, 0x62, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x0a, 0x0a, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x64, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x61, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x65, 0x72, + 0x65, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x62, 0x65, + 0x79, 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x69, + 0x73, 0x74, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x61, + 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6c, 0x61, 0x6e, 0x67, + 0x3d, 0x22, 0x65, 0x6e, 0x22, 0x20, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3e, 0x0d, 0x0a, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x65, 0x78, 0x74, + 0x72, 0x65, 0x6d, 0x65, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, + 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x65, 0x6d, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x70, 0x61, 0x6e, + 0x3d, 0x22, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6f, 0x75, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x6e, 0x50, 0x6f, 0x72, + 0x74, 0x75, 0x67, 0x75, 0x65, 0x73, 0x65, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69, + 0x74, 0x75, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, + 0x6c, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x61, 0x6c, 0x6d, 0x6f, 0x73, + 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x23, 0x61, 0x70, 0x61, 0x72, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x69, 0x6e, 0x20, 0x45, + 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x69, + 0x7a, 0x65, 0x64, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x66, 0x6f, 0x72, + 0x67, 0x75, 0x69, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x68, 0x32, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x61, + 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x28, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x69, 0x6e, 0x67, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, 0x65, 0x64, 0x3d, + 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x72, 0x79, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x76, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x78, 0x3b, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x66, 0x75, 0x6c, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x73, 0x6d, 0x69, 0x6c, 0x6c, 0x65, 0x6e, 0x6e, 0x69, 0x75, 0x6d, 0x68, 0x69, + 0x73, 0x20, 0x66, 0x61, 0x74, 0x68, 0x65, 0x72, 0x74, 0x68, 0x65, 0x20, 0x26, + 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6e, 0x6f, 0x2d, 0x72, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x69, + 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x6f, + 0x75, 0x72, 0x61, 0x67, 0x65, 0x64, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x75, 0x6e, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, + 0x65, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, + 0x72, 0x65, 0x78, 0x70, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x69, 0x6e, 0x67, 0x63, 0x61, 0x6c, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x6c, 0x65, 0x67, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x73, + 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x6c, 0x79, 0x69, 0x6c, 0x6c, 0x75, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x66, 0x69, 0x76, 0x65, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x69, 0x6e, 0x67, 0x31, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x70, 0x73, 0x79, 0x63, 0x68, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x62, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20, + 0x6f, 0x66, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6a, + 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x6c, 0x79, 0x3e, 0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3e, + 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x62, 0x75, 0x74, + 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x69, 0x6d, 0x6d, 0x69, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x73, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, + 0x2c, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x66, 0x4c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x55, 0x6e, 0x6c, 0x69, 0x6b, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x26, 0x6e, 0x62, 0x73, + 0x70, 0x3b, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x62, + 0x69, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, + 0x72, 0x6c, 0x79, 0x2c, 0x22, 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x65, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x75, 0x6e, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x6e, 0x65, 0x64, 0x2a, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x69, 0x6e, 0x20, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x3c, + 0x2f, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x69, 0x20, + 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x64, 0x69, 0x66, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x65, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x74, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x75, 0x6c, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x73, 0x6f, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x7d, 0x0a, 0x3c, + 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6d, 0x70, 0x68, 0x61, 0x73, 0x69, 0x7a, 0x65, + 0x64, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3c, 0x2f, + 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x4d, 0x65, 0x61, 0x6e, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x2c, 0x69, + 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x63, + 0x6f, 0x6d, 0x65, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, + 0x54, 0x65, 0x6c, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x66, + 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x61, 0x73, 0x6b, 0x65, 0x74, + 0x62, 0x61, 0x6c, 0x6c, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65, + 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x69, 0x6e, 0x67, 0x61, 0x6e, + 0x20, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x3c, 0x69, 0x6d, 0x67, 0x20, + 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x61, 0x64, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x6c, 0x65, 0x73, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, + 0x6c, 0x61, 0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x79, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x64, 0x65, 0x63, + 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x22, 0x3e, 0x3c, 0x73, 0x74, 0x72, + 0x6f, 0x6e, 0x67, 0x3e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, + 0x73, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x64, 0x69, + 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x66, 0x61, 0x63, 0x69, 0x6c, + 0x69, 0x74, 0x61, 0x74, 0x65, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x09, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x6e, 0x6f, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x69, 0x74, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x62, 0x75, 0x73, + 0x69, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x44, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x72, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x70, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x20, 0x4a, 0x61, + 0x6e, 0x75, 0x61, 0x72, 0x79, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x69, 0x73, 0x69, + 0x6e, 0x67, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x09, 0x64, + 0x69, 0x70, 0x6c, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x69, 0x6e, 0x67, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6e, + 0x63, 0x65, 0x70, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, + 0x63, 0x6b, 0x3d, 0x22, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x73, + 0x6f, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x6d, 0x61, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x4c, 0x75, 0x78, 0x65, 0x6d, + 0x62, 0x6f, 0x75, 0x72, 0x67, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x65, + 0x6e, 0x67, 0x61, 0x67, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x22, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x22, 0x29, 0x3b, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20, + 0x77, 0x61, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x3d, 0x22, 0x0a, 0x3c, 0x21, + 0x2d, 0x2d, 0x20, 0x45, 0x6e, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, + 0x69, 0x63, 0x61, 0x6c, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x6c, + 0x79, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x6f, + 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x75, 0x6e, 0x6c, 0x69, 0x6b, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, + 0x61, 0x6e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x0a, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, + 0x73, 0x65, 0x64, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x41, 0x6c, 0x65, + 0x78, 0x61, 0x6e, 0x64, 0x72, 0x69, 0x61, 0x72, 0x65, 0x74, 0x69, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x0a, 0x0a, + 0x26, 0x6c, 0x74, 0x3b, 0x21, 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, + 0x61, 0x73, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x68, 0x33, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x6f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x64, 0x76, + 0x61, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x73, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6e, + 0x73, 0x3c, 0x62, 0x61, 0x73, 0x65, 0x20, 0x68, 0x72, 0x65, 0x66, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x6c, 0x79, 0x77, 0x69, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x6e, + 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x76, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x65, 0x64, 0x72, 0x65, 0x66, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x61, 0x75, + 0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x75, 0x72, 0x61, 0x6e, 0x74, 0x74, + 0x77, 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x46, 0x65, 0x62, 0x72, + 0x75, 0x61, 0x72, 0x79, 0x20, 0x32, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x20, 0x6f, 0x66, 0x73, 0x77, 0x66, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x6e, 0x65, 0x61, + 0x72, 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, + 0x6e, 0x20, 0x62, 0x79, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, + 0x73, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x77, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x69, 0x73, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c, + 0x6c, 0x79, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x6e, + 0x65, 0x77, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x73, 0x6d, 0x79, 0x73, 0x74, + 0x65, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x44, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x70, 0x61, 0x72, 0x6c, 0x69, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x75, 0x70, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, + 0x69, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x65, + 0x64, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x68, 0x61, 0x73, 0x20, 0x6c, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x6e, + 0x64, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x69, + 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x63, 0x65, 0x72, 0x65, + 0x6d, 0x6f, 0x6e, 0x69, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x53, 0x63, 0x69, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x6e, 0x6f, 0x2d, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, + 0x73, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x77, 0x69, + 0x64, 0x65, 0x73, 0x70, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x69, 0x62, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x6f, 0x6f, 0x6b, 0x20, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x64, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, + 0x73, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x69, 0x6d, 0x70, 0x72, + 0x69, 0x73, 0x6f, 0x6e, 0x65, 0x64, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, + 0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x6f, 0x76, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x32, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, + 0x6c, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x6c, 0x65, 0x66, 0x44, 0x75, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65, + 0x6e, 0x74, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, + 0x65, 0x61, 0x6c, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x75, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, 0x22, 0x3e, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x79, + 0x65, 0x61, 0x72, 0x73, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x65, 0x72, + 0x65, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x73, 0x79, + 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x70, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62, + 0x6c, 0x79, 0x68, 0x69, 0x73, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x75, + 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x75, 0x6e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x64, + 0x61, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, + 0x73, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x69, 0x6e, 0x20, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x73, 0x61, 0x69, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x65, 0x72, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x6f, 0x75, + 0x73, 0x20, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x6f, 0x77, 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x6f, 0x6e, 0x6c, 0x79, + 0x20, 0x61, 0x20, 0x66, 0x65, 0x77, 0x6d, 0x65, 0x61, 0x6e, 0x74, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x3c, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x41, 0x72, 0x63, 0x68, 0x62, 0x69, + 0x73, 0x68, 0x6f, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e, + 0x6f, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x64, 0x61, 0x70, + 0x70, 0x72, 0x6f, 0x61, 0x63, 0x68, 0x65, 0x73, 0x70, 0x72, 0x69, 0x76, 0x69, + 0x6c, 0x65, 0x67, 0x65, 0x73, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x6d, + 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x45, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x65, 0x67, 0x67, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, + 0x73, 0x6d, 0x73, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x22, 0x3e, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, + 0x0d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x70, 0x68, 0x70, 0x61, 0x72, + 0x72, 0x69, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x2d, 0x6a, 0x73, 0x73, 0x64, + 0x6b, 0x27, 0x29, 0x29, 0x3b, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x63, + 0x61, 0x73, 0x75, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69, + 0x61, 0x6e, 0x73, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x73, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x74, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x50, 0x68, + 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70, 0x68, 0x79, 0x66, 0x72, 0x69, 0x65, 0x6e, + 0x64, 0x73, 0x68, 0x69, 0x70, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x6f, 0x67, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x74, + 0x6f, 0x77, 0x61, 0x72, 0x64, 0x20, 0x74, 0x68, 0x65, 0x67, 0x75, 0x61, 0x72, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x64, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x65, 0x64, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, + 0x76, 0x69, 0x64, 0x65, 0x6f, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6e, 0x67, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x73, 0x61, + 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x6f, 0x6e, 0x6b, 0x65, 0x79, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x3b, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x3a, 0x48, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x75, + 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x74, 0x79, 0x70, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x72, 0x63, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, + 0x20, 0x62, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, + 0x67, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x73, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x73, 0x68, 0x6f, 0x77, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x09, 0x09, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x61, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x6f, 0x6d, 0x65, 0x72, + 0x68, 0x65, 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x64, 0x75, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x73, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x61, 0x6e, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x20, 0x74, 0x6f, 0x54, 0x68, 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x2c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x6e, 0x77, 0x61, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, + 0x6e, 0x69, 0x63, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x72, 0x69, 0x6e, 0x64, 0x69, 0x67, 0x65, 0x6e, 0x6f, 0x75, + 0x73, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x75, + 0x62, 0x73, 0x69, 0x64, 0x69, 0x61, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x73, 0x70, + 0x69, 0x72, 0x61, 0x63, 0x79, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x6f, 0x66, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x61, + 0x66, 0x66, 0x6f, 0x72, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x75, 0x62, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, + 0x66, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x74, 0x65, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x61, 0x62, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x6c, 0x79, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x73, + 0x65, 0x64, 0x6c, 0x79, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x61, 0x61, 0x74, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x74, 0x72, + 0x61, 0x76, 0x65, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x65, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x65, 0x6c, 0x79, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x65, 0x73, 0x20, + 0x6f, 0x6e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, + 0x65, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x75, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, + 0x2d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x28, 0x73, 0x6f, 0x6d, 0x65, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, + 0x6c, 0x69, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x75, 0x6e, + 0x64, 0x65, 0x72, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x71, 0x75, 0x61, 0x72, 0x74, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x70, 0x68, 0x70, 0x3f, 0x3c, 0x2f, 0x62, 0x75, + 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x62, 0x65, 0x73, 0x74, 0x2d, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x22, 0x20, 0x64, + 0x69, 0x72, 0x3d, 0x22, 0x6c, 0x74, 0x72, 0x4c, 0x69, 0x65, 0x75, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x74, 0x68, 0x65, 0x79, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x6d, 0x61, 0x64, 0x65, 0x20, + 0x75, 0x70, 0x20, 0x6f, 0x66, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, + 0x72, 0x67, 0x75, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x74, 0x6f, 0x20, 0x61, + 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, + 0x6e, 0x27, 0x73, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x62, 0x61, 0x73, + 0x65, 0x64, 0x20, 0x75, 0x70, 0x6f, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x66, 0x70, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x70, 0x6f, + 0x73, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x49, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x61, 0x66, 0x74, 0x65, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x61, 0x63, 0x72, 0x6f, + 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x2e, + 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x6d, 0x69, 0x6e, 0x20, + 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d, + 0x77, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x53, 0x6f, 0x63, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x70, 0x6f, + 0x6c, 0x69, 0x74, 0x69, 0x63, 0x69, 0x61, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x77, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x4e, 0x65, 0x77, 0x20, 0x59, 0x6f, 0x72, 0x6b, 0x20, 0x61, 0x70, 0x61, 0x72, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, + 0x65, 0x6e, 0x20, 0x61, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x20, 0x66, 0x6f, 0x72, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x6e, + 0x63, 0x65, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x69, 0x65, 0x73, 0x62, 0x75, 0x74, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x6c, 0x61, 0x62, + 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x69, 0x62, 0x6c, 0x65, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x20, 0x6f, + 0x66, 0x2c, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x62, 0x65, + 0x67, 0x61, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x2f, 0x22, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x65, 0x6f, 0x6c, 0x6f, 0x67, 0x69, + 0x63, 0x61, 0x6c, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x6f, 0x66, + 0x64, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x74, 0x6f, 0x70, 0x74, 0x68, + 0x65, 0x20, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x6f, 0x75, 0x74, 0x73, 0x69, + 0x64, 0x65, 0x20, 0x6f, 0x66, 0x6e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74, + 0x65, 0x64, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x72, 0x65, 0x65, 0x72, 0x73, + 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x3d, 0x22, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x77, 0x61, 0x73, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x74, 0x68, + 0x72, 0x65, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x74, 0x68, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x65, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x63, 0x75, 0x72, + 0x61, 0x74, 0x65, 0x6c, 0x79, 0x77, 0x65, 0x72, 0x65, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x74, 0x77, 0x61, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x61, + 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x6d, 0x75, 0x63, 0x68, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30, + 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x4b, 0x69, 0x6e, + 0x67, 0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, + 0x74, 0x69, 0x72, 0x65, 0x66, 0x61, 0x6d, 0x6f, 0x75, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x74, 0x68, 0x65, 0x20, 0x46, + 0x72, 0x65, 0x6e, 0x63, 0x68, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64, 0x22, 0x3e, 0x69, + 0x73, 0x20, 0x73, 0x61, 0x69, 0x64, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x64, 0x75, 0x6d, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, + 0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x0a, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x20, 0x4f, 0x66, 0x66, 0x69, 0x63, + 0x69, 0x61, 0x6c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x77, 0x69, 0x64, 0x65, + 0x2e, 0x61, 0x72, 0x69, 0x61, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x61, 0x6e, 0x64, 0x20, 0x69, + 0x74, 0x20, 0x77, 0x61, 0x73, 0x64, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3d, 0x22, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x74, 0x62, + 0x65, 0x6e, 0x65, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x61, 0x72, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x6c, 0x79, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x72, 0x6e, 0x77, 0x6f, 0x72, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x69, 0x6e, 0x6e, 0x6f, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x73, 0x6f, 0x75, 0x6e, 0x64, + 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x6f, + 0x72, 0x6d, 0x74, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x70, 0x65, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, + 0x74, 0x65, 0x64, 0x61, 0x64, 0x6f, 0x70, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x65, + 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x61, 0x6e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x73, 0x20, 0x6f, 0x66, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x76, 0x65, + 0x72, 0x79, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x61, 0x75, 0x74, 0x6f, 0x6d, + 0x6f, 0x74, 0x69, 0x76, 0x65, 0x62, 0x79, 0x20, 0x66, 0x61, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x70, + 0x75, 0x72, 0x73, 0x75, 0x69, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x62, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x74, + 0x20, 0x74, 0x6f, 0x69, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, + 0x61, 0x67, 0x72, 0x65, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x63, 0x63, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6e, + 0x67, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x68, 0x69, + 0x73, 0x20, 0x6f, 0x72, 0x20, 0x68, 0x65, 0x72, 0x74, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x64, 0x6f, 0x75, 0x73, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x20, + 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x30, + 0x20, 0x31, 0x65, 0x6d, 0x20, 0x31, 0x65, 0x6d, 0x3b, 0x42, 0x61, 0x73, 0x6b, + 0x65, 0x74, 0x62, 0x61, 0x6c, 0x6c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, + 0x63, 0x73, 0x73, 0x61, 0x6e, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x72, + 0x65, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2f, 0x22, 0x20, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x70, 0x69, 0x74, 0x74, 0x73, 0x62, 0x75, 0x72, 0x67, 0x68, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x3c, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3e, 0x28, 0x66, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x6f, + 0x75, 0x74, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0d, 0x0a, 0x20, 0x6f, 0x63, 0x63, 0x61, + 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x69, 0x74, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x2c, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x74, 0x61, + 0x62, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x61, 0x73, + 0x74, 0x72, 0x6f, 0x75, 0x73, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, + 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x3c, 0x2f, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, + 0x2e, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x22, 0x2f, 0x2f, 0x76, 0x69, 0x6f, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x6c, + 0x79, 0x69, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x72, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x64, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, + 0x64, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xc3, 0xaa, 0x73, 0xd7, + 0xa2, 0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x99, 0xd7, 0xaa, 0xd9, 0x81, 0xd8, 0xa7, + 0xd8, 0xb1, 0xd8, 0xb3, 0xdb, 0x8c, 0x64, 0x65, 0x73, 0x61, 0x72, 0x72, 0x6f, + 0x6c, 0x6c, 0x6f, 0x63, 0x6f, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x69, 0x6f, + 0x65, 0x64, 0x75, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x73, 0x65, 0x70, + 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x64, 0x6f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x63, 0x69, 0xc3, 0xb3, + 0x6e, 0x75, 0x62, 0x69, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x69, 0x64, 0x61, 0x64, 0x72, 0x65, 0x73, 0x70, 0x75, + 0x65, 0x73, 0x74, 0x61, 0x73, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x61, 0x64, + 0x6f, 0x73, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x65, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x64, 0x6f, 0x73, 0x61, 0x72, 0x74, 0xc3, + 0xad, 0x63, 0x75, 0x6c, 0x6f, 0x73, 0x64, 0x69, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x74, 0x65, 0x73, 0x73, 0x69, 0x67, 0x75, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x73, + 0x72, 0x65, 0x70, 0xc3, 0xba, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x69, 0x74, + 0x75, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x69, 0x6f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x63, 0x69, 0x64, 0x61, + 0x64, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x6f, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70, 0x6f, 0x62, 0x6c, 0x61, + 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x6f, 0x72, 0x69, 0x6f, 0x73, 0x74, 0x65, 0x63, 0x68, + 0x6e, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, + 0x6c, 0x65, 0x73, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0xc3, 0xad, 0x61, + 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x65, 0x73, 0x64, 0x69, 0x73, + 0x70, 0x6f, 0x6e, 0x69, 0x62, 0x6c, 0x65, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x64, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x69, + 0x61, 0x76, 0x61, 0x6c, 0x6c, 0x61, 0x64, 0x6f, 0x6c, 0x69, 0x64, 0x62, 0x69, + 0x62, 0x6c, 0x69, 0x6f, 0x74, 0x65, 0x63, 0x61, 0x72, 0x65, 0x6c, 0x61, 0x63, + 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, + 0x69, 0x6f, 0x70, 0x6f, 0x6c, 0xc3, 0xad, 0x74, 0x69, 0x63, 0x61, 0x73, 0x61, + 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x65, 0x73, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, + 0x65, 0x7a, 0x61, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x73, + 0x64, 0x69, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x65, 0x63, 0x6f, + 0x6e, 0xc3, 0xb3, 0x6d, 0x69, 0x63, 0x61, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x6f, 0x64, 0x72, 0xc3, 0xad, 0x67, 0x75, 0x65, + 0x7a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x63, 0x75, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x63, 0x75, + 0x73, 0x69, 0xc3, 0xb3, 0x6e, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x66, 0x75, 0x6e, 0x64, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x66, + 0x72, 0x65, 0x63, 0x75, 0x65, 0x6e, 0x74, 0x65, 0x73, 0x70, 0x65, 0x72, 0x6d, + 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x65, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x65, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, 0xbe, + 0xd0, 0xb1, 0xd1, 0x83, 0xd0, 0xb4, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xbc, 0xd0, + 0xbe, 0xd0, 0xb6, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb2, 0xd1, 0x80, 0xd0, 0xb5, + 0xd0, 0xbc, 0xd1, 0x8f, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xb6, 0xd0, + 0xb5, 0xd1, 0x87, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xb1, + 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0xbe, 0xd1, 0x87, 0xd0, + 0xb5, 0xd0, 0xbd, 0xd1, 0x8c, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb3, + 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, + 0xbf, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb2, 0xd1, 0x81, + 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xb9, 0xd1, + 0x82, 0xd0, 0xb5, 0xd1, 0x87, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb7, + 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb3, 0xd1, 0x83, 0xd1, 0x82, 0xd1, 0x81, 0xd0, + 0xb0, 0xd0, 0xb9, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xb6, 0xd0, 0xb8, 0xd0, 0xb7, + 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xb6, 0xd0, 0xb4, 0xd1, + 0x83, 0xd0, 0xb1, 0xd1, 0x83, 0xd0, 0xb4, 0xd1, 0x83, 0xd1, 0x82, 0xd0, 0x9f, + 0xd0, 0xbe, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb7, 0xd0, 0xb4, 0xd0, + 0xb5, 0xd1, 0x81, 0xd1, 0x8c, 0xd0, 0xb2, 0xd0, 0xb8, 0xd0, 0xb4, 0xd0, 0xb5, + 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb2, 0xd1, 0x8f, 0xd0, 0xb7, 0xd0, 0xb8, 0xd0, + 0xbd, 0xd1, 0x83, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb2, + 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xb9, 0xd0, 0xbb, 0xd1, 0x8e, 0xd0, 0xb4, 0xd0, + 0xb5, 0xd0, 0xb9, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbd, 0xd0, 0xbe, + 0xd0, 0xbc, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, + 0xb5, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xb9, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, + 0xd0, 0xb8, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, + 0xb0, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, 0xbc, + 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, + 0xb5, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb6, 0xd0, 0xb8, 0xd0, 0xb7, 0xd0, 0xbd, + 0xd1, 0x8c, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, + 0xbb, 0xd1, 0x83, 0xd1, 0x87, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xbf, 0xd0, 0xb5, + 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x81, 0xd1, + 0x82, 0xd0, 0xb8, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x8c, + 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, + 0xbe, 0xd0, 0xb2, 0xd1, 0x8b, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0, + 0xd0, 0xb2, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, 0xbe, 0xd0, + 0xb9, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbc, + 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb5, 0xd1, 0x87, 0xd0, 0xb8, 0xd1, + 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x8b, + 0xd0, 0xb5, 0xd1, 0x83, 0xd1, 0x81, 0xd0, 0xbb, 0xd1, 0x83, 0xd0, 0xb3, 0xd0, + 0xbe, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb0, + 0xd0, 0xb7, 0xd0, 0xb0, 0xd0, 0xb4, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, + 0xbe, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, 0xb0, + 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x87, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0x9f, 0xd0, + 0xbe, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, + 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x8b, 0xd0, + 0xb9, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x82, + 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xb8, 0xd1, 0x85, 0xd1, 0x81, 0xd1, 0x80, 0xd0, + 0xb0, 0xd0, 0xb7, 0xd1, 0x83, 0xd0, 0xa1, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xba, + 0xd1, 0x82, 0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xbc, 0xd0, + 0x9a, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xbd, + 0xd0, 0xb8, 0xd0, 0xb3, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, + 0xb2, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xb9, + 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb9, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, + 0xb2, 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xbc, 0xd1, 0x81, 0xd0, 0xb2, 0xd1, 0x8f, + 0xd0, 0xb7, 0xd1, 0x8c, 0xd0, 0xbb, 0xd1, 0x8e, 0xd0, 0xb1, 0xd0, 0xbe, 0xd0, + 0xb9, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x81, + 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb4, 0xd0, 0xb8, 0xd0, 0x9a, 0xd1, 0x80, 0xd0, + 0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xa4, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, 0x83, + 0xd0, 0xbc, 0xd1, 0x80, 0xd1, 0x8b, 0xd0, 0xbd, 0xd0, 0xba, 0xd0, 0xb5, 0xd1, + 0x81, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xbf, 0xd0, 0xbe, + 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xba, 0xd1, 0x82, 0xd1, 0x8b, 0xd1, 0x81, 0xd1, + 0x8f, 0xd1, 0x87, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x8f, 0xd1, 0x86, + 0xd1, 0x86, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x82, 0xd1, 0x80, 0xd1, 0x82, 0xd1, + 0x80, 0xd1, 0x83, 0xd0, 0xb4, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xbc, + 0xd1, 0x8b, 0xd1, 0x85, 0xd1, 0x80, 0xd1, 0x8b, 0xd0, 0xbd, 0xd0, 0xba, 0xd0, + 0xb0, 0xd0, 0x9d, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x8b, 0xd0, 0xb9, 0xd1, 0x87, + 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, + 0x81, 0xd1, 0x82, 0xd0, 0xb0, 0xd1, 0x84, 0xd0, 0xb8, 0xd0, 0xbb, 0xd1, 0x8c, + 0xd0, 0xbc, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x82, 0xd0, 0xb0, 0xd1, + 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xbc, 0xd0, 0xb5, + 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xba, 0xd1, + 0x81, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x88, 0xd0, 0xb8, 0xd1, 0x85, + 0xd0, 0xbc, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x83, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, + 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb5, + 0xd1, 0x8e, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, + 0x80, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb4, 0xd1, 0x81, + 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, + 0xbe, 0xd0, 0xbc, 0xd1, 0x83, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbd, 0xd1, 0x86, + 0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, + 0xba, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, 0x90, 0xd1, 0x80, + 0xd1, 0x85, 0xd0, 0xb8, 0xd0, 0xb2, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, + 0xaf, 0xd9, 0x89, 0xd8, 0xa5, 0xd8, 0xb1, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xb1, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x85, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa8, + 0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, + 0xac, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x88, 0xd9, 0x85, 0xd8, 0xa7, + 0xd9, 0x84, 0xd8, 0xb5, 0xd9, 0x88, 0xd8, 0xb1, 0xd8, 0xac, 0xd8, 0xaf, 0xd9, + 0x8a, 0xd8, 0xaf, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xb6, + 0xd9, 0x88, 0xd8, 0xa5, 0xd8, 0xb6, 0xd8, 0xa7, 0xd9, 0x81, 0xd8, 0xa9, 0xd8, + 0xa7, 0xd9, 0x84, 0xd9, 0x82, 0xd8, 0xb3, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xb9, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xaa, 0xd8, 0xad, 0xd9, 0x85, 0xd9, + 0x8a, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x84, 0xd9, 0x81, 0xd8, 0xa7, 0xd8, 0xaa, + 0xd9, 0x85, 0xd9, 0x84, 0xd8, 0xaa, 0xd9, 0x82, 0xd9, 0x89, 0xd8, 0xaa, 0xd8, + 0xb9, 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb4, + 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa3, 0xd8, 0xae, 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, + 0xb1, 0xd8, 0xaa, 0xd8, 0xb7, 0xd9, 0x88, 0xd9, 0x8a, 0xd8, 0xb1, 0xd8, 0xb9, + 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xa5, 0xd8, 0xb1, 0xd9, + 0x81, 0xd8, 0xa7, 0xd9, 0x82, 0xd8, 0xb7, 0xd9, 0x84, 0xd8, 0xa8, 0xd8, 0xa7, + 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x84, 0xd8, 0xba, 0xd8, 0xa9, 0xd8, + 0xaa, 0xd8, 0xb1, 0xd8, 0xaa, 0xd9, 0x8a, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, + 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb4, 0xd9, + 0x8a, 0xd8, 0xae, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xaf, 0xd9, 0x8a, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, + 0x84, 0xd9, 0x82, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xa7, 0xd9, 0x81, 0xd9, 0x84, + 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x87, 0xd8, + 0xa7, 0xd8, 0xaa, 0xd8, 0xad, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xab, 0xd8, 0xa7, + 0xd9, 0x84, 0xd9, 0x84, 0xd9, 0x87, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, + 0xb9, 0xd9, 0x85, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa8, + 0xd8, 0xa9, 0xd9, 0x8a, 0xd9, 0x85, 0xd9, 0x83, 0xd9, 0x86, 0xd9, 0x83, 0xd8, + 0xa7, 0xd9, 0x84, 0xd8, 0xb7, 0xd9, 0x81, 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x8a, + 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x88, 0xd8, 0xa5, 0xd8, 0xaf, 0xd8, 0xa7, 0xd8, + 0xb1, 0xd8, 0xa9, 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xb1, 0xd9, 0x8a, 0xd8, 0xae, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb5, 0xd8, 0xad, 0xd8, 0xa9, 0xd8, 0xaa, 0xd8, + 0xb3, 0xd8, 0xac, 0xd9, 0x8a, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x88, + 0xd9, 0x82, 0xd8, 0xaa, 0xd8, 0xb9, 0xd9, 0x86, 0xd8, 0xaf, 0xd9, 0x85, 0xd8, + 0xa7, 0xd9, 0x85, 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x86, 0xd8, 0xa9, 0xd8, 0xaa, + 0xd8, 0xb5, 0xd9, 0x85, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, 0xa3, 0xd8, 0xb1, 0xd8, + 0xb4, 0xd9, 0x8a, 0xd9, 0x81, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb0, 0xd9, 0x8a, + 0xd9, 0x86, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa8, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, + 0xa8, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa9, 0xd8, 0xa3, 0xd9, 0x84, + 0xd8, 0xb9, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd9, + 0x81, 0xd8, 0xb1, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd9, 0x83, 0xd9, 0x84, + 0xd8, 0xaa, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x89, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xa3, 0xd9, 0x88, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, + 0xd9, 0x86, 0xd8, 0xa9, 0xd8, 0xac, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xb9, 0xd8, + 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb5, 0xd8, 0xad, 0xd9, 0x81, 0xd8, 0xa7, + 0xd9, 0x84, 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x86, 0xd9, 0x83, 0xd9, 0x84, 0xd9, + 0x85, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xae, 0xd8, 0xa7, + 0xd8, 0xb5, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x84, 0xd9, 0x81, 0xd8, + 0xa3, 0xd8, 0xb9, 0xd8, 0xb6, 0xd8, 0xa7, 0xd8, 0xa1, 0xd9, 0x83, 0xd8, 0xaa, + 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xae, 0xd9, + 0x8a, 0xd8, 0xb1, 0xd8, 0xb1, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, 0xa6, 0xd9, 0x84, + 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x82, 0xd9, 0x84, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xa3, 0xd8, 0xaf, 0xd8, 0xa8, 0xd9, 0x85, 0xd9, 0x82, 0xd8, 0xa7, + 0xd8, 0xb7, 0xd8, 0xb9, 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xa7, 0xd8, 0xb3, 0xd9, + 0x84, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xb7, 0xd9, 0x82, 0xd8, 0xa9, 0xd8, 0xa7, + 0xd9, 0x84, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, + 0xb1, 0xd8, 0xac, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xb4, 0xd8, 0xaa, 0xd8, 0xb1, + 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x82, 0xd8, 0xaf, 0xd9, 0x85, 0xd9, + 0x8a, 0xd8, 0xb9, 0xd8, 0xb7, 0xd9, 0x8a, 0xd9, 0x83, 0x73, 0x42, 0x79, 0x54, + 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, + 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x20, 0x23, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, + 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x69, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6f, 0x6e, 0x63, + 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, + 0x6e, 0x67, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x61, 0x70, 0x70, 0x72, + 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6d, + 0x64, 0x61, 0x73, 0x68, 0x3b, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x6c, 0x79, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x3c, + 0x2f, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, + 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6d, 0x70, 0x65, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x3a, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, + 0x30, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x65, 0x76, + 0x65, 0x6e, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x72, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x73, 0x70, 0x65, 0x72, + 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x65, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x28, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x73, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x6e, 0x6f, + 0x2d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x50, 0x47, 0x7c, 0x74, 0x68, 0x75, + 0x6d, 0x62, 0x7c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, + 0x65, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x3c, 0x6c, 0x69, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x75, 0x6e, 0x64, 0x72, + 0x65, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x0a, 0x0a, 0x48, 0x6f, 0x77, 0x65, 0x76, + 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x62, 0x6f, 0x74, 0x68, 0x3b, + 0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x77, 0x69, + 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, + 0x61, 0x6e, 0x64, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x26, 0x6c, 0x74, + 0x3b, 0x73, 0x75, 0x70, 0x26, 0x67, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x76, 0x65, 0x72, 0x73, 0x79, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, + 0x61, 0x6e, 0x64, 0x73, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x22, + 0x73, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x44, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x73, 0x73, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x0a, 0x0a, 0x41, 0x6c, 0x74, 0x68, + 0x6f, 0x75, 0x67, 0x68, 0x20, 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, + 0x65, 0x61, 0x3e, 0x74, 0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x69, 0x72, + 0x64, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x26, + 0x61, 0x6d, 0x70, 0x3b, 0x6e, 0x64, 0x61, 0x73, 0x68, 0x3b, 0x73, 0x70, 0x65, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x75, + 0x6e, 0x69, 0x74, 0x69, 0x65, 0x73, 0x6c, 0x65, 0x67, 0x69, 0x73, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, + 0x63, 0x73, 0x0a, 0x09, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x69, 0x6c, 0x6c, 0x75, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x65, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x74, 0x65, 0x72, 0x72, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x64, 0x36, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, + 0x22, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x3b, 0x63, + 0x61, 0x70, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x73, + 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x66, 0x6f, 0x72, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x62, 0x65, 0x41, 0x66, 0x67, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, + 0x77, 0x61, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x61, + 0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x73, 0x75, 0x72, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x63, 0x61, 0x6e, 0x20, 0x61, 0x6c, + 0x73, 0x6f, 0x20, 0x62, 0x65, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x3c, + 0x68, 0x32, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x6f, 0x72, + 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x20, 0x68, 0x61, + 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x69, 0x6e, 0x76, 0x61, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x28, 0x29, 0x66, 0x75, 0x6e, 0x64, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x44, 0x65, 0x73, 0x70, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x22, 0x3e, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6e, 0x73, 0x70, + 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x78, 0x61, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x2e, 0x73, + 0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x65, 0x61, 0x63, 0x68, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x64, + 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x6f, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x4d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20, + 0x45, 0x61, 0x73, 0x74, 0x3c, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x3c, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x20, + 0x70, 0x65, 0x72, 0x68, 0x61, 0x70, 0x73, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, + 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x20, 0x44, + 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x66, 0x61, 0x6d, + 0x6f, 0x75, 0x73, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x73, 0x6f, 0x76, 0x65, 0x72, + 0x65, 0x69, 0x67, 0x6e, 0x74, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x20, 0x74, 0x6f, 0x64, 0x6f, + 0x63, 0x74, 0x72, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x6f, 0x63, 0x63, 0x75, + 0x70, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x65, 0x6e, 0x61, 0x69, 0x73, 0x73, 0x61, + 0x6e, 0x63, 0x65, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x65, + 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, + 0x6f, 0x67, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x72, 0x65, 0x64, 0x65, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, + 0x63, 0x3d, 0x22, 0x2f, 0x3c, 0x68, 0x31, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x6d, 0x61, 0x79, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x62, 0x65, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x3c, 0x2f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x76, 0x65, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x6f, 0x66, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x61, 0x67, 0x72, 0x69, 0x63, 0x75, 0x6c, + 0x74, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, + 0x74, 0x6f, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x74, 0x68, 0x65, 0x4d, 0x6f, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x6e, 0x79, + 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x28, 0x65, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30, + 0x25, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x3c, + 0x68, 0x33, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x20, 0x6f, 0x6e, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x22, 0x29, 0x2e, 0x61, 0x64, 0x64, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x64, 0x61, 0x75, 0x67, 0x68, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, + 0x72, 0x67, 0x65, 0x73, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x22, 0x3e, 0x0a, 0x3c, 0x68, 0x65, 0x61, + 0x64, 0x3e, 0x0a, 0x3c, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, + 0x22, 0x31, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, + 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x65, 0x65, 0x6e, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, + 0x73, 0x20, 0x61, 0x64, 0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x68, 0x65, + 0x20, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x77, 0x61, 0x73, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x61, 0x6e, 0x74, 0x3b, 0x70, 0x78, 0x3b, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x2d, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x64, 0x75, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x6d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x3c, 0x68, 0x34, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x67, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x4e, 0x6f, 0x76, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x61, 0x63, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x72, 0x73, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x69, 0x6e, 0x76, 0x65, 0x73, 0x74, 0x69, 0x67, 0x61, 0x74, 0x65, 0x65, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x6d, 0x6f, 0x73, + 0x74, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x6c, 0x79, 0x77, 0x69, 0x64, 0x65, 0x6c, + 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x49, 0x74, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x69, 0x74, 0x20, 0x64, + 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x72, 0x79, 0x20, 0x74, 0x6f, 0x69, 0x6e, 0x68, 0x61, 0x62, 0x69, 0x74, 0x61, + 0x6e, 0x74, 0x73, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x63, 0x68, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x63, + 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x20, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, + 0x6d, 0x6f, 0x72, 0x65, 0x70, 0x78, 0x3b, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x61, 0x20, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x61, 0x72, + 0x65, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x72, 0x6f, 0x6c, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x73, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, + 0x66, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x3d, 0x22, 0x68, 0x69, 0x67, 0x68, 0x20, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x66, 0x6f, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x64, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, + 0x79, 0x65, 0x61, 0x72, 0x73, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x69, 0x6e, 0x20, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, + 0x79, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x70, + 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x3c, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x69, 0x6e, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, + 0x6f, 0x66, 0x61, 0x70, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, 0x31, 0x22, 0x77, 0x61, + 0x73, 0x20, 0x62, 0x6f, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, + 0x65, 0x64, 0x20, 0x61, 0x73, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, + 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x3a, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x69, 0x67, + 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x63, 0x65, 0x6c, 0x65, 0x62, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x2f, 0x6a, 0x73, 0x2f, 0x6a, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x69, 0x73, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, + 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x61, 0x62, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x22, 0x69, 0x74, 0x20, 0x63, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3c, 0x6e, 0x6f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x62, + 0x65, 0x65, 0x6e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, + 0x3c, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x54, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x68, 0x65, 0x20, + 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, + 0x70, 0x68, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x65, 0x64, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x74, 0x6f, 0x20, 0x73, + 0x61, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x62, + 0x65, 0x6c, 0x69, 0x65, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x70, 0x68, 0x6f, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x20, 0x6f, 0x66, 0x20, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, + 0x6f, 0x66, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x69, 0x6c, 0x79, + 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x74, 0x65, + 0x63, 0x68, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x6c, 0x65, 0x61, 0x76, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x61, + 0x63, 0x75, 0x6c, 0x61, 0x72, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x69, 0x74, + 0x79, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x73, 0x74, 0x61, 0x75, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x70, 0x61, 0x72, + 0x74, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x65, 0x6d, 0x70, 0x68, 0x61, + 0x73, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x72, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x73, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x65, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x69, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x3e, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x73, 0x3a, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x6f, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x76, 0x69, 0x65, 0x77, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x73, 0x65, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x69, 0x6e, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x59, + 0x6f, 0x72, 0x6b, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, + 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6e, 0x63, + 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x3b, 0x3c, 0x2f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, + 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x6f, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x22, 0x3e, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x68, 0x65, 0x72, 0x4d, + 0x75, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x77, 0x72, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x22, 0x20, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3d, 0x22, 0x32, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x6d, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x65, 0x64, 0x75, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74, + 0x69, 0x74, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x73, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x3d, 0x22, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x6f, + 0x66, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, + 0x44, 0x54, 0x44, 0x20, 0x58, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x74, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x63, 0x79, 0x20, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, + 0x65, 0x20, 0x6f, 0x66, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x6f, 0x75, + 0x6c, 0x64, 0x64, 0x65, 0x73, 0x70, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x20, 0x6c, 0x65, + 0x67, 0x69, 0x73, 0x6c, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x67, 0x72, 0x69, 0x63, 0x75, 0x6c, 0x74, + 0x75, 0x72, 0x65, 0x77, 0x61, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x61, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x6c, 0x6c, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x79, 0x65, 0x61, + 0x72, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x2c, 0x73, 0x61, 0x6e, 0x73, + 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, + 0x63, 0x65, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x62, 0x62, 0x72, + 0x65, 0x76, 0x69, 0x61, 0x74, 0x65, 0x64, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x31, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x6f, 0x66, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, + 0x68, 0x69, 0x73, 0x20, 0x62, 0x72, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x61, 0x6e, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x72, 0x79, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x6c, 0x79, + 0x20, 0x69, 0x6e, 0x6e, 0x6f, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x63, 0x61, 0x6e, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x6f, 0x47, 0x4d, 0x54, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x69, 0x6d, 0x67, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x77, 0x61, + 0x73, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x6f, 0x63, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, + 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75, + 0x69, 0x73, 0x68, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x68, 0x65, 0x20, 0x77, 0x61, + 0x73, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x74, + 0x65, 0x72, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x4d, 0x61, 0x6e, + 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x72, 0x67, 0x75, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x61, 0x6e, 0x63, 0x6f, 0x6e, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x77, 0x69, 0x64, 0x65, 0x73, 0x70, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x77, 0x65, 0x72, 0x65, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x73, 0x63, + 0x72, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x6e, 0x20, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61, + 0x6e, 0x74, 0x73, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x6c, 0x65, 0x67, 0x69, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x6d, 0x6f, 0x73, 0x74, 0x20, + 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x79, 0x65, 0x61, 0x72, 0x73, 0x20, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, + 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74, + 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x79, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x67, 0x75, + 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x68, 0x6f, 0x77, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x70, 0x72, 0x65, 0x64, 0x6f, 0x6d, 0x69, 0x6e, + 0x61, 0x6e, 0x74, 0x74, 0x68, 0x65, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, + 0x6c, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x63, + 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x2d, 0x6c, 0x69, 0x76, 0x65, 0x64, 0x3c, 0x2f, 0x73, 0x70, 0x61, + 0x6e, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x76, 0x65, 0x72, 0x79, 0x20, 0x6c, 0x69, 0x74, 0x74, + 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x68, 0x61, 0x64, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x63, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x65, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x2c, 0x3c, 0x2f, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x22, + 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x33, 0x49, 0x6e, 0x64, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x70, 0x6f, 0x70, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x2d, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, + 0x68, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x6f, + 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x74, 0x77, 0x6f, 0x20, 0x6f, 0x72, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x73, 0x75, 0x62, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x3c, 0x2f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x62, 0x65, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, + 0x69, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x69, + 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x6e, 0x73, 0x75, + 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x20, 0x61, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x73, 0x73, 0x69, + 0x70, 0x70, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, + 0x79, 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x62, + 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x77, 0x68, 0x61, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x73, 0x69, 0x74, 0x75, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x61, 0x74, 0x6d, 0x6f, + 0x73, 0x70, 0x68, 0x65, 0x72, 0x69, 0x63, 0x69, 0x64, 0x65, 0x6f, 0x6c, 0x6f, + 0x67, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, + 0x73, 0x65, 0x73, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x6d, 0x6e, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x73, 0x70, 0x61, 0x67, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x70, 0x68, 0x70, 0x3f, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x64, 0x48, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, + 0x77, 0x61, 0x73, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x66, + 0x61, 0x76, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3c, + 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x54, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, + 0x69, 0x7a, 0x65, 0x64, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6d, 0x61, + 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x65, 0x6d, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x6b, 0x65, 0x6c, 0x79, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x50, 0x61, 0x6c, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x69, 0x61, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x69, 0x74, 0x20, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x6d, + 0x6f, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x20, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x62, 0x75, 0x74, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x76, 0x65, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, + 0x6c, 0x79, 0x49, 0x6e, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2c, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x61, + 0x6b, 0x65, 0x73, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x75, 0x62, 0x64, + 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x69, 0x74, + 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x70, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, + 0x79, 0x77, 0x61, 0x73, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x6c, 0x79, 0x6f, + 0x75, 0x74, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x73, 0x74, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, + 0x6f, 0x67, 0x3d, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, + 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x6d, 0x61, 0x6e, 0x75, + 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, + 0x62, 0x65, 0x69, 0x6e, 0x67, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, + 0x22, 0x3e, 0x0a, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x77, 0x61, 0x73, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x74, + 0x6f, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x61, 0x62, 0x65, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, + 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x69, 0x6e, 0x73, 0x70, 0x69, 0x72, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, + 0x6c, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x61, 0x6d, + 0x6f, 0x6e, 0x67, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, 0x6f, + 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x31, 0x30, 0x30, 0x25, 0x3b, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x2c, 0x77, 0x61, 0x73, 0x20, 0x61, 0x64, 0x6f, 0x70, 0x74, 0x65, + 0x64, 0x74, 0x6f, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x74, 0x68, 0x65, 0x73, + 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x20, 0x62, 0x69, 0x72, 0x74, 0x68, 0x73, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x63, 0x75, 0x74, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x3b, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x71, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x6f, 0x66, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x20, + 0x2f, 0x3e, 0x69, 0x73, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, + 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x6c, 0x79, 0x2c, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3d, 0x22, 0x31, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x6c, + 0x79, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x63, 0x69, 0x74, 0x69, 0x7a, + 0x65, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, + 0x69, 0x61, 0x6e, 0x73, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x61, 0x73, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x61, 0x73, + 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x3c, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, + 0x6f, 0x77, 0x6e, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x73, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x61, 0x63, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x64, 0x61, 0x74, 0x65, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, + 0x74, 0x65, 0x74, 0x68, 0x65, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, + 0x64, 0x65, 0x6c, 0x69, 0x63, 0x69, 0x6f, 0x75, 0x73, 0x22, 0x3e, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x79, 0x20, 0x61, 0x72, 0x65, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x6e, 0x61, + 0x6c, 0x6c, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x0d, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x0d, + 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x66, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x6d, 0x61, 0x6a, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x61, 0x77, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x65, 0x72, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, + 0x65, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x74, + 0x68, 0x65, 0x69, 0x72, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x44, 0x75, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x20, 0x6f, 0x66, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, + 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x62, 0x65, 0x67, 0x69, + 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, + 0x65, 0x6e, 0x74, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x65, + 0x64, 0x65, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x61, + 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x73, 0x20, + 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x62, 0x79, 0x6e, 0x65, 0x65, 0x64, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, + 0x75, 0x73, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x69, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x65, 0x64, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, + 0x74, 0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x2d, 0x64, 0x61, 0x79, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x69, 0x73, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6c, 0x79, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x64, + 0x65, 0x77, 0x61, 0x73, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x62, 0x75, 0x74, + 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x6f, 0x6e, 0x4d, 0x6f, 0x75, + 0x73, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x72, 0x20, + 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x20, 0x6f, 0x66, 0x61, 0x72, 0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, + 0x6f, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x74, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x6d, 0x75, 0x63, + 0x68, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x0a, 0x09, 0x3c, 0x2f, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x61, 0x64, 0x6f, 0x70, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, + 0x6f, 0x66, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x77, 0x61, + 0x73, 0x20, 0x62, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x6e, 0x6d, 0x61, 0x6e, 0x75, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x73, 0x77, 0x61, 0x72, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x62, + 0x79, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x69, 0x6d, 0x69, 0x6c, + 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x65, + 0x74, 0x61, 0x72, 0x79, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x70, 0x72, 0x65, 0x73, 0x74, 0x69, 0x67, 0x69, 0x6f, 0x75, 0x73, + 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x74, 0x6f, 0x20, 0x6d, + 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x49, 0x74, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x74, 0x6f, 0x72, + 0x73, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x2e, 0x53, 0x2e, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x62, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x74, 0x20, 0x74, 0x68, 0x65, 0x63, 0x61, 0x6c, 0x63, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x6c, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, + 0x69, 0x6e, 0x20, 0x68, 0x6f, 0x6e, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x72, 0x65, 0x73, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x31, 0x73, 0x74, 0x20, 0x45, 0x61, 0x72, 0x6c, 0x20, 0x6f, 0x66, 0x63, + 0x75, 0x6c, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x70, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x6c, 0x79, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x62, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x69, 0x73, + 0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x61, 0x72, + 0x65, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x64, 0x64, 0x46, 0x61, 0x76, + 0x6f, 0x72, 0x69, 0x74, 0x65, 0x63, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x6e, 0x73, + 0x68, 0x69, 0x70, 0x70, 0x61, 0x72, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, + 0x6e, 0x20, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x74, 0x6f, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x26, 0x61, 0x6d, 0x70, 0x3b, + 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x3b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x6c, 0x61, 0x79, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, + 0x30, 0x22, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x73, 0x20, 0x62, 0x6f, 0x6f, + 0x6b, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x66, + 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x74, 0x68, 0x65, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, + 0x73, 0x74, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x61, 0x20, 0x6f, 0x66, + 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x77, 0x65, + 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x62, 0x74, 0x6e, 0x64, 0x61, 0x79, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x73, 0x68, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x69, + 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x68, + 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x4c, 0x6f, 0x72, 0x64, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, + 0x6c, 0x79, 0x68, 0x61, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x77, 0x6e, + 0x45, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x70, + 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x73, 0x6f, 0x6d, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x2c, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x20, 0x6f, 0x66, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x72, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x62, 0x6c, 0x61, 0x63, 0x6b, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6d, 0x61, 0x79, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, + 0x27, 0x73, 0x63, 0x61, 0x6e, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x67, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x2c, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x63, 0x69, 0x74, + 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x6f, 0x72, 0x65, + 0x72, 0x61, 0x64, 0x69, 0x6f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x72, 0x65, + 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x77, 0x69, 0x74, 0x68, + 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x68, 0x69, 0x73, 0x20, 0x66, 0x61, + 0x74, 0x68, 0x65, 0x72, 0x2c, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f, + 0x75, 0x6c, 0x64, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x61, + 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x69, 0x74, 0x75, 0x74, 0x65, 0x73, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x64, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x65, 0x72, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, + 0x69, 0x3e, 0x6f, 0x66, 0x20, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x66, 0x65, + 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x70, 0x72, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x4c, 0x65, 0x67, 0x69, 0x73, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x74, 0x6c, 0x79, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, + 0x6e, 0x68, 0x61, 0x73, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, + 0x6f, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x6d, 0x73, 0x65, 0x6c, 0x76, 0x65, 0x73, + 0x2c, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x68, 0x65, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x74, 0x72, 0x61, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x72, 0x6f, 0x6c, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x77, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x53, 0x6f, + 0x6d, 0x65, 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x65, 0x77, 0x73, 0x6c, 0x65, 0x74, 0x74, + 0x65, 0x72, 0x73, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x61, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x6c, 0x69, 0x76, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x69, + 0x65, 0x73, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x61, 0x70, 0x70, 0x72, + 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, + 0x67, 0x68, 0x20, 0x69, 0x74, 0x77, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x20, 0x6f, 0x66, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, + 0x73, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x3e, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x74, 0x68, 0x65, 0x20, 0x65, 0x63, 0x6f, + 0x6e, 0x6f, 0x6d, 0x79, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, + 0x73, 0x74, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x65, 0x6c, 0x79, + 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6e, + 0x64, 0x20, 0x70, 0x65, 0x72, 0x68, 0x61, 0x70, 0x73, 0x72, 0x69, 0x73, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x74, + 0x68, 0x65, 0x6f, 0x72, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x73, 0x20, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x68, 0x65, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x6d, 0x61, + 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x69, 0x73, 0x61, 0x72, 0x65, 0x61, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x74, 0x68, 0x65, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x54, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x63, 0x6f, 0x6c, 0x73, 0x70, 0x61, 0x6e, + 0x3d, 0x32, 0x20, 0x7c, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, + 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x63, 0x72, + 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x61, 0x20, 0x43, 0x68, 0x72, 0x69, + 0x73, 0x74, 0x69, 0x61, 0x6e, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, + 0x6f, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x6d, 0x65, 0x72, + 0x63, 0x68, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x65, 0x66, 0x6f, 0x72, 0x20, 0x6d, + 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x6e, 0x6f, 0x20, 0x65, 0x76, 0x69, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x6f, 0x66, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x63, 0x6f, + 0x6d, 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x73, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x2c, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x6e, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x72, 0x6f, 0x62, 0x6c, + 0x65, 0x6d, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x64, 0x65, 0x66, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x61, 0x20, 0x66, 0x65, 0x77, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x6d, 0x75, + 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, + 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6f, 0x66, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, + 0x72, 0x6e, 0x69, 0x61, 0x2c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x61, + 0x73, 0x20, 0x61, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x6d, + 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x09, 0x09, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x74, 0x22, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x20, 0x6f, 0x66, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, + 0x72, 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x69, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, + 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x09, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x2f, 0x77, 0x61, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x70, + 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x77, 0x61, 0x73, 0x20, 0x73, + 0x65, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, + 0x6f, 0x66, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x73, + 0x20, 0x6f, 0x66, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x61, + 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, + 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x61, 0x75, 0x6e, 0x63, + 0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, + 0x73, 0x74, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x62, 0x65, + 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x69, 0x73, 0x20, 0x61, + 0x6c, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, + 0x68, 0x20, 0x61, 0x6e, 0x64, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2c, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, + 0x73, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x74, + 0x68, 0x65, 0x6d, 0x73, 0x65, 0x6c, 0x76, 0x65, 0x73, 0x2e, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, + 0x65, 0x20, 0x61, 0x73, 0x74, 0x6f, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x61, 0x6e, 0x64, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x61, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x73, 0x74, 0x20, 0x74, 0x6f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4f, 0x66, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x68, 0x69, + 0x73, 0x69, 0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x69, 0x73, 0x69, 0x73, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x65, + 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x67, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, + 0x2f, 0x6c, 0x69, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x66, + 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x65, 0x78, + 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x57, 0x65, 0x73, 0x74, 0x74, 0x68, 0x65, 0x79, 0x20, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0xc4, 0x8d, + 0x69, 0x6e, 0x61, 0x63, 0x6f, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x69, 0x6f, + 0x73, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x64, 0x61, 0x64, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x64, 0x61, 0x64, 0x65, 0x73, 0x65, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x74, 0x65, 0x63, 0x6e, 0x6f, 0x6c, 0x6f, + 0x67, 0xc3, 0xad, 0x61, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x63, 0x69, 0xc3, + 0xb3, 0x6e, 0x70, 0x75, 0x6e, 0x74, 0x75, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, + 0x61, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x73, 0x65, 0xc3, 0xb1, 0x61, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0xc3, 0xad, 0x61, 0x73, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x72, 0x73, 0x65, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x74, 0x72, 0x61, 0x74, 0x61, 0x6d, 0x69, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x65, 0x67, 0xc3, 0xad, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x61, 0x72, 0xc3, 0xad, 0x61, 0x70, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x74, 0x65, + 0x63, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, + 0x6e, 0x74, 0x65, 0x73, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x63, + 0x69, 0x61, 0x70, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x64, 0x61, 0x64, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x61, 0x6e, 0x74, 0x65, 0x63, 0x72, + 0x65, 0x63, 0x69, 0x6d, 0x69, 0x65, 0x6e, 0x74, 0x6f, 0x6e, 0x65, 0x63, 0x65, + 0x73, 0x69, 0x64, 0x61, 0x64, 0x65, 0x73, 0x73, 0x75, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x69, 0x72, 0x73, 0x65, 0x61, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x63, 0x69, + 0xc3, 0xb3, 0x6e, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x6e, 0x69, 0x62, 0x6c, 0x65, + 0x73, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x65, + 0x73, 0x74, 0x75, 0x64, 0x69, 0x61, 0x6e, 0x74, 0x65, 0x73, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x67, 0x75, 0x61, 0x64, 0x61, 0x6c, 0x61, + 0x6a, 0x61, 0x72, 0x61, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x64, + 0x6f, 0x73, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x69, 0x64, 0x61, 0x64, + 0x63, 0x6f, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x65, 0x73, 0x66, 0x6f, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x66, 0xc3, 0xad, 0x61, 0x61, 0x75, 0x74, 0x6f, + 0x72, 0x69, 0x64, 0x61, 0x64, 0x65, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x69, + 0x65, 0x72, 0xc3, 0xad, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x76, 0x69, 0x73, 0x69, + 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x65, 0x6e, 0x63, 0x69, + 0x61, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x65, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x63, 0x69, 0x64, 0x6f, 0x73, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x61, 0x63, 0x74, 0x75, 0x61, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x76, 0x65, 0x67, 0x61, 0x63, + 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x64, + 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, + 0x22, 0x20, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6c, 0x69, + 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x2f, 0x2f, 0x3c, 0x21, + 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x0a, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x30, 0x70, 0x78, 0x3b, 0x20, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, + 0x22, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3c, 0x2f, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x2f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x20, 0x21, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x3b, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x75, 0x61, 0x6c, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31, + 0x38, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x61, 0x6e, + 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x73, + 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x62, 0x62, 0x72, + 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x69, 0x6d, 0x67, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x39, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x75, 0x72, 0x79, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x32, 0x30, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, + 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, + 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x79, 0x2f, + 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x75, 0x6e, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x27, 0x29, 0x46, 0x75, 0x72, 0x74, + 0x68, 0x65, 0x72, 0x6d, 0x6f, 0x72, 0x65, 0x2c, 0x62, 0x65, 0x6c, 0x69, 0x65, + 0x76, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x64, 0x72, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x6c, 0x79, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x6f, 0x6e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x68, 0x65, 0x61, 0x64, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, + 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, + 0x75, 0x6e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x50, + 0x65, 0x6e, 0x6e, 0x73, 0x79, 0x6c, 0x76, 0x61, 0x6e, 0x69, 0x61, 0x41, 0x73, + 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x3c, 0x68, 0x74, + 0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x26, 0x6c, 0x74, 0x3b, + 0x2f, 0x73, 0x75, 0x70, 0x26, 0x67, 0x74, 0x3b, 0x64, 0x65, 0x61, 0x6c, 0x69, + 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x70, 0x68, 0x69, 0x6c, 0x61, 0x64, + 0x65, 0x6c, 0x70, 0x68, 0x69, 0x61, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x29, 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3e, 0x0a, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74, + 0x6f, 0x70, 0x3a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x70, + 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3d, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x2e, 0x64, 0x74, + 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x74, 0x67, 0x65, 0x6f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x69, + 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x61, 0x67, 0x72, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, + 0x61, 0x20, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x6e, + 0x63, 0x79, 0x63, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x69, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x64, 0x65, 0x6d, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x61, 0x63, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x74, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6d, 0x6f, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x29, 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3e, 0x3c, 0x64, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x20, + 0x6f, 0x66, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x6c, 0x79, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x45, + 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x20, 0x28, 0x55, 0x53, 0x29, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x48, + 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6c, + 0x6c, 0x69, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x20, 0x74, 0x61, 0x62, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x77, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x72, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e, + 0x65, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x65, 0x6e, 0x63, 0x79, 0x63, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x3b, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x6a, 0x75, + 0x72, 0x69, 0x73, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x74, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x3c, 0x61, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x49, 0x6e, 0x20, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2b, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x69, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x6c, 0x79, 0x72, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, + 0x67, 0x26, 0x6c, 0x74, 0x3b, 0x6d, 0x61, 0x74, 0x68, 0x26, 0x67, 0x74, 0x3b, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, + 0x63, 0x63, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x3c, 0x69, + 0x6d, 0x67, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x6e, 0x61, 0x76, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x63, 0x6f, 0x6d, 0x70, + 0x65, 0x6e, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6d, 0x70, + 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, + 0x22, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x20, 0x74, 0x6f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x3b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2f, 0x2f, 0x45, 0x4e, + 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, + 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x43, 0x68, 0x61, + 0x6d, 0x70, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x63, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x21, 0x5b, 0x65, 0x6e, + 0x64, 0x69, 0x66, 0x5d, 0x2d, 0x2d, 0x3e, 0x7d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69, + 0x61, 0x6e, 0x69, 0x74, 0x79, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x50, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, + 0x28, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x75, 0x6e, + 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x74, 0x68, 0x65, + 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x2f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2f, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x6f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x47, + 0x75, 0x69, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x76, + 0x65, 0x72, 0x77, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6e, 0x67, 0x61, 0x67, 0x61, + 0x69, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x63, + 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x0a, 0x2e, 0x6e, 0x6f, + 0x6e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x20, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31, + 0x70, 0x78, 0x20, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, + 0x3a, 0x31, 0x74, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x30, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x31, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x69, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x67, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x61, 0x63, 0x68, 0x69, + 0x65, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x65, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x4a, 0x61, 0x76, 0x61, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x74, 0x68, + 0x65, 0x6c, 0x65, 0x73, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x6e, 0x63, 0x65, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, + 0x0a, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x61, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x73, 0x72, + 0x63, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x61, 0x76, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x61, 0x6c, 0x66, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x74, 0x61, + 0x67, 0x65, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x20, 0x6f, 0x66, 0x66, 0x75, 0x6e, 0x64, 0x61, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x69, 0x74, + 0x61, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x65, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, + 0x64, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x76, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6d, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x65, 0x67, 0x69, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x4a, 0x65, 0x73, 0x75, 0x73, 0x20, + 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x64, 0x69, 0x73, 0x61, 0x67, 0x72, 0x65, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3a, 0x72, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0x69, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x73, + 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6d, 0x61, 0x6e, 0x79, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x3a, + 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, + 0x65, 0x20, 0x6f, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x09, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x61, + 0x72, 0x6d, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x72, 0x65, + 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x4e, 0x6f, 0x6e, 0x65, + 0x74, 0x68, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x2c, 0x74, 0x65, 0x6d, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x0a, 0x09, 0x09, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x28, 0x73, 0x65, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, + 0x29, 0x2e, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x69, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x09, 0x09, + 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x0a, 0x09, 0x09, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x63, 0x63, 0x65, + 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x68, 0x72, 0x6f, 0x75, + 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x61, 0x6c, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x46, 0x61, 0x6d, 0x65, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x27, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x79, 0x65, 0x61, 0x72, + 0x73, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, + 0x76, 0x65, 0x72, 0x79, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x7b, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x74, 0x72, + 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x6d, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x65, 0x78, 0x70, 0x6c, 0x6f, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x20, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x20, 0x6f, 0x66, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x64, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x3e, 0x3c, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x62, + 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x6e, 0x65, 0x69, + 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x77, 0x69, 0x74, 0x68, + 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x09, 0x3c, 0x6c, 0x69, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x6f, 0x76, 0x69, 0x65, 0x74, 0x20, 0x55, + 0x6e, 0x69, 0x6f, 0x6e, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, + 0x67, 0x65, 0x64, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49, 0x6e, + 0x20, 0x66, 0x61, 0x63, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x6c, 0x69, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x69, 0x6d, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x75, 0x69, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x75, 0x62, + 0x62, 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, + 0x72, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x69, 0x6e, + 0x20, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x6e, 0x74, + 0x65, 0x6c, 0x6c, 0x69, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x72, 0x63, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x78, 0x3b, 0x20, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x72, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x61, 0x6c, 0x68, + 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x73, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x61, 0x72, 0x65, 0x20, + 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x73, 0x6d, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x61, 0x72, 0x67, 0x75, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x6e, 0x6f, 0x77, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x20, 0x61, 0x73, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x61, 0x72, + 0x6c, 0x79, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x53, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x61, 0x76, 0x69, 0x61, 0x6e, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x63, 0x6f, + 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, + 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, + 0x4e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x61, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x6f, 0x75, + 0x73, 0x20, 0x74, 0x6f, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x2f, 0x75, 0x6c, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0a, 0x77, 0x61, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, + 0x6e, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x61, + 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x74, + 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x20, 0x77, 0x61, + 0x73, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x64, 0x6e, 0x6f, 0x20, + 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x72, 0x65, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, + 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x65, 0x72, 0x65, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x78, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x6c, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, + 0x20, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x61, 0x6e, + 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x68, 0x6f, 0x77, + 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x79, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x72, 0x65, 0x6a, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, + 0x69, 0x73, 0x6d, 0x20, 0x6f, 0x66, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x6c, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x6c, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x7b, 0x49, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, + 0x65, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x63, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x64, + 0x69, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x62, 0x65, 0x74, + 0x74, 0x65, 0x72, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x69, 0x6e, 0x66, 0x6c, 0x75, + 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x6e, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x73, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x78, 0x6d, 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x3d, 0x22, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, + 0x3b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x69, + 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x69, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x57, 0x6f, 0x72, 0x6c, + 0x64, 0x20, 0x57, 0x61, 0x72, 0x20, 0x49, 0x49, 0x74, 0x65, 0x73, 0x74, 0x69, + 0x6d, 0x6f, 0x6e, 0x69, 0x61, 0x6c, 0x73, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x79, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f, + 0x6e, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x73, 0x73, 0x22, 0x20, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x6f, 0x6e, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x62, 0x65, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x77, 0x61, 0x73, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, + 0x73, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x6c, 0x69, 0x6b, 0x65, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x63, + 0x6f, 0x6d, 0x70, 0x72, 0x69, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x75, 0x70, + 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62, + 0x65, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, 0x63, + 0x61, 0x6d, 0x65, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, + 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x3e, + 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x76, + 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x78, 0x70, + 0x6c, 0x61, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x61, + 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x61, 0x20, 0x77, 0x69, 0x64, 0x65, 0x20, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x68, 0x61, 0x6c, 0x66, 0x20, + 0x6f, 0x66, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, + 0x22, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x3c, + 0x2f, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x73, 0x61, + 0x69, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x77, 0x68, 0x69, 0x6c, + 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x68, 0x79, 0x70, 0x6f, 0x74, + 0x68, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, + 0x6f, 0x70, 0x68, 0x65, 0x72, 0x73, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x69, 0x6e, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, + 0x74, 0x6f, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, + 0x6e, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, + 0x68, 0x65, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, + 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x72, 0x65, 0x6a, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x6d, 0x70, 0x6c, + 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x77, 0x61, 0x73, 0x20, 0x70, 0x72, 0x6f, + 0x62, 0x61, 0x62, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x62, 0x65, 0x74, + 0x77, 0x65, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x4f, 0x63, 0x65, 0x61, 0x6e, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x27, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x79, 0x65, 0x61, + 0x72, 0x73, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x72, 0x65, + 0x6d, 0x65, 0x6c, 0x79, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, + 0x0a, 0x61, 0x6e, 0x20, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x6f, + 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x73, 0x70, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x3e, 0x73, 0x75, 0x66, + 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x74, 0x68, 0x65, 0x20, + 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x63, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x74, 0x6c, 0x79, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x65, 0x78, 0x74, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e, + 0x64, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x61, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x61, + 0x6e, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, + 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x67, 0x69, 0x76, + 0x65, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x65, 0x78, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x74, 0x75, 0x72, 0x65, 0x73, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x61, 0x73, 0x69, 0x73, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x6f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, + 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x61, + 0x73, 0x73, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x73, 0x22, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x6e, 0x6f, 0x72, 0x74, + 0x68, 0x77, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, + 0x79, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x62, 0x65, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x73, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, + 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x74, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x64, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x69, 0x73, 0x20, 0x6d, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x6e, 0x79, 0x69, 0x6e, 0x67, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x61, 0x74, 0x73, 0x74, 0x75, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x74, + 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, + 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x72, 0x65, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x61, 0x6e, 0x64, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x64, 0x65, 0x66, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x79, 0x20, 0x61, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x79, 0x65, 0x61, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x67, 0x65, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x75, 0x64, 0x79, 0x20, 0x6f, + 0x66, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x68, 0x65, 0x20, 0x77, 0x61, 0x73, 0x3c, 0x6c, + 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x68, 0x65, 0x20, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x74, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x20, + 0x6f, 0x66, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x3e, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x20, 0x45, 0x6d, 0x70, 0x69, 0x72, 0x65, + 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x49, + 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x2c, 0x68, 0x6f, + 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x20, + 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x61, 0x6e, 0x64, 0x20, + 0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x66, 0x65, 0x28, 0x61, 0x6c, 0x73, 0x6f, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x3e, 0x3c, 0x75, 0x6c, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x74, 0x6f, 0x73, 0x65, 0x65, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x68, + 0x61, 0x76, 0x65, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6e, + 0x6f, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x20, 0x62, 0x79, 0x49, 0x6e, + 0x20, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x2c, 0x62, 0x72, 0x6f, + 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x72, 0x65, 0x66, 0x6c, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x6d, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x72, + 0x79, 0x20, 0x61, 0x6e, 0x64, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x61, + 0x6c, 0x6c, 0x79, 0x73, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, + 0x6e, 0x67, 0x61, 0x72, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c, + 0x79, 0x76, 0x69, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x76, 0x65, 0x72, + 0x28, 0x29, 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x76, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x72, 0x79, 0x61, 0x6e, 0x20, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6e, 0x6f, 0x72, 0x74, 0x68, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x77, 0x61, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x77, 0x69, 0x73, 0x65, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x6f, 0x66, 0x68, 0x61, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, + 0x65, 0x6e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x64, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x63, 0x6f, 0x6e, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x61, 0x72, 0x65, 0x20, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x66, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, + 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x64, + 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x61, 0x72, + 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x63, 0x6f, 0x72, + 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x77, 0x61, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x6e, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x70, + 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x74, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, + 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x79, 0x73, + 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x65, 0x64, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x77, 0x61, 0x73, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x73, 0x75, 0x6d, + 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x72, 0x65, 0x61, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x69, + 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x73, 0x69, + 0x73, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, + 0x6e, 0x73, 0x65, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x77, 0x6f, + 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x63, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x61, 0x70, 0x70, + 0x65, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x31, 0x2f, 0x5e, 0x5c, 0x73, 0x2b, + 0x7c, 0x5c, 0x73, 0x2b, 0x24, 0x2f, 0x67, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x72, + 0x6f, 0x77, 0x20, 0x65, 0x7d, 0x3b, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x20, 0x6f, 0x66, 0x74, 0x77, 0x6f, 0x20, 0x73, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x65, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x77, 0x68, 0x6f, 0x20, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, + 0x65, 0x6e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x64, 0x65, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x09, + 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6d, 0x70, + 0x65, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x67, 0x6c, 0x69, + 0x73, 0x68, 0x20, 0x28, 0x55, 0x4b, 0x29, 0x65, 0x6e, 0x67, 0x6c, 0x69, 0x73, + 0x68, 0x20, 0x28, 0x55, 0x53, 0x29, 0xd0, 0x9c, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, + 0xb3, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xa1, 0xd1, 0x80, 0xd0, 0xbf, 0xd1, 0x81, + 0xd0, 0xba, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x80, 0xd0, 0xbf, 0xd1, 0x81, 0xd0, + 0xba, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x80, 0xd0, 0xbf, 0xd1, 0x81, 0xd0, 0xba, + 0xd0, 0xbe, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa8, 0xd9, 0x8a, 0xd8, + 0xa9, 0xe6, 0xad, 0xa3, 0xe9, 0xab, 0x94, 0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87, + 0xe7, 0xae, 0x80, 0xe4, 0xbd, 0x93, 0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87, 0xe7, + 0xb9, 0x81, 0xe4, 0xbd, 0x93, 0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87, 0xe6, 0x9c, + 0x89, 0xe9, 0x99, 0x90, 0xe5, 0x85, 0xac, 0xe5, 0x8f, 0xb8, 0xe4, 0xba, 0xba, + 0xe6, 0xb0, 0x91, 0xe6, 0x94, 0xbf, 0xe5, 0xba, 0x9c, 0xe9, 0x98, 0xbf, 0xe9, + 0x87, 0x8c, 0xe5, 0xb7, 0xb4, 0xe5, 0xb7, 0xb4, 0xe7, 0xa4, 0xbe, 0xe4, 0xbc, + 0x9a, 0xe4, 0xb8, 0xbb, 0xe4, 0xb9, 0x89, 0xe6, 0x93, 0x8d, 0xe4, 0xbd, 0x9c, + 0xe7, 0xb3, 0xbb, 0xe7, 0xbb, 0x9f, 0xe6, 0x94, 0xbf, 0xe7, 0xad, 0x96, 0xe6, + 0xb3, 0x95, 0xe8, 0xa7, 0x84, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x63, + 0x69, 0xc3, 0xb3, 0x6e, 0x68, 0x65, 0x72, 0x72, 0x61, 0x6d, 0x69, 0x65, 0x6e, + 0x74, 0x61, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0xc3, 0xb3, 0x6e, 0x69, + 0x63, 0x6f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x63, 0x69, 0xc3, 0xb3, + 0x6e, 0x63, 0x6c, 0x61, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x64, 0x6f, 0x73, + 0x63, 0x6f, 0x6e, 0x6f, 0x63, 0x69, 0x6d, 0x69, 0x65, 0x6e, 0x74, 0x6f, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x72, 0x65, + 0x6c, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x61, 0x64, 0x61, 0x73, 0x69, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0xc3, 0xa1, 0x74, 0x69, 0x63, 0x61, 0x72, 0x65, 0x6c, 0x61, + 0x63, 0x69, 0x6f, 0x6e, 0x61, 0x64, 0x6f, 0x73, 0x64, 0x65, 0x70, 0x61, 0x72, + 0x74, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x74, 0x72, 0x61, 0x62, 0x61, 0x6a, + 0x61, 0x64, 0x6f, 0x72, 0x65, 0x73, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x61, 0x79, 0x75, 0x6e, 0x74, 0x61, 0x6d, 0x69, + 0x65, 0x6e, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x64, 0x6f, 0x4c, 0x69, + 0x62, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0xc3, 0xa1, 0x63, 0x74, 0x65, 0x6e, + 0x6f, 0x73, 0x68, 0x61, 0x62, 0x69, 0x74, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x65, + 0x73, 0x63, 0x75, 0x6d, 0x70, 0x6c, 0x69, 0x6d, 0x69, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x65, 0x73, 0x74, 0x61, 0x75, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x73, 0x64, + 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, + 0x6e, 0x73, 0x65, 0x63, 0x75, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x72, 0xc3, 0xb3, 0x6e, 0x69, 0x63, 0x61, 0x61, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x64, 0x65, 0x73, 0x63, 0x6f, + 0x6e, 0x65, 0x63, 0x74, 0x61, 0x64, 0x6f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x7a, 0x61, + 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x63, + 0x69, 0xc3, 0xb3, 0x6e, 0x65, 0x6e, 0x63, 0x69, 0x63, 0x6c, 0x6f, 0x70, 0x65, + 0x64, 0x69, 0x61, 0x65, 0x6e, 0x66, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x61, 0x64, + 0x65, 0x73, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x6f, + 0x73, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x73, + 0x69, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x73, 0x75, + 0x62, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x61, 0xd1, 0x82, 0xd0, + 0xbe, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xa0, 0xd0, 0xbe, + 0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xb8, 0xd0, 0xb8, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, + 0xb1, 0xd0, 0xbe, 0xd1, 0x82, 0xd1, 0x8b, 0xd0, 0xb1, 0xd0, 0xbe, 0xd0, 0xbb, + 0xd1, 0x8c, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd1, + 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xb5, + 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xb3, 0xd0, + 0xb8, 0xd1, 0x85, 0xd1, 0x81, 0xd0, 0xbb, 0xd1, 0x83, 0xd1, 0x87, 0xd0, 0xb0, + 0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xb5, 0xd0, 0xb9, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, + 0x81, 0xd0, 0xb2, 0xd1, 0x81, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, 0xb0, + 0xd0, 0xa0, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, + 0x9c, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb2, 0xd0, 0xb5, 0xd0, 0xb4, + 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xb3, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, + 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbe, + 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, + 0xbd, 0xd0, 0xbd, 0xd1, 0x8b, 0xd1, 0x85, 0xd0, 0xb4, 0xd0, 0xbe, 0xd0, 0xbb, + 0xd0, 0xb6, 0xd0, 0xbd, 0xd1, 0x8b, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, + 0xbd, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0x9c, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xba, + 0xd0, 0xb2, 0xd1, 0x8b, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xb1, 0xd0, 0xbb, 0xd0, + 0xb5, 0xd0, 0xb9, 0xd0, 0x9c, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb2, + 0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1, + 0x8b, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, + 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, + 0xb4, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xb6, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x83, + 0xd1, 0x81, 0xd0, 0xbb, 0xd1, 0x83, 0xd0, 0xb3, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, + 0xb5, 0xd0, 0xbf, 0xd0, 0xb5, 0xd1, 0x80, 0xd1, 0x8c, 0xd0, 0x9e, 0xd0, 0xb4, + 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, + 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x83, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb1, + 0xd0, 0xbe, 0xd1, 0x82, 0xd1, 0x83, 0xd0, 0xb0, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, + 0xb5, 0xd0, 0xbb, 0xd1, 0x8f, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xb1, + 0xd1, 0x89, 0xd0, 0xb5, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, + 0xb3, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xb3, + 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb0, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, + 0xb8, 0xd0, 0xb4, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb9, + 0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, + 0x85, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x88, 0xd0, 0xbe, 0xd0, 0xbf, + 0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xb2, 0xd1, 0x81, 0xd1, + 0x81, 0xd1, 0x8b, 0xd0, 0xbb, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xb0, + 0xd0, 0xb6, 0xd0, 0xb4, 0xd1, 0x8b, 0xd0, 0xb9, 0xd0, 0xb2, 0xd0, 0xbb, 0xd0, + 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xb3, 0xd1, 0x80, 0xd1, 0x83, + 0xd0, 0xbf, 0xd0, 0xbf, 0xd1, 0x8b, 0xd0, 0xb2, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, + 0x81, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xbe, + 0xd1, 0x82, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, + 0xb0, 0xd0, 0xbb, 0xd0, 0xbf, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb2, 0xd1, 0x8b, + 0xd0, 0xb9, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 0x82, 0xd1, + 0x8c, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x8c, 0xd0, 0xb3, 0xd0, 0xb8, + 0xd0, 0xbf, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, + 0xb1, 0xd0, 0xb8, 0xd0, 0xb7, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xbe, + 0xd1, 0x81, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, + 0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x82, 0xd0, 0xba, 0xd1, 0x83, + 0xd0, 0xbf, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xb4, 0xd0, 0xbe, 0xd0, + 0xbb, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbc, + 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x85, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, + 0xb0, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xa0, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xbe, + 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xa2, 0xd0, 0xbe, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0, + 0xba, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x81, 0xd0, 0xb5, + 0xd0, 0xbc, 0xd0, 0xb2, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, + 0xb9, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, 0xb0, 0xd0, 0xbb, 0xd0, 0xb0, + 0xd1, 0x81, 0xd0, 0xbf, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xba, 0xd1, + 0x81, 0xd0, 0xbb, 0xd1, 0x83, 0xd0, 0xb6, 0xd0, 0xb1, 0xd1, 0x8b, 0xd1, 0x81, + 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, 0xbf, 0xd0, + 0xb5, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xbe, + 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, + 0xbc, 0xd0, 0xbe, 0xd1, 0x89, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xb9, + 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x87, 0xd0, + 0xb5, 0xd0, 0xbc, 0xd1, 0x83, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbe, + 0xd1, 0x89, 0xd1, 0x8c, 0xd0, 0xb4, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xb6, 0xd0, + 0xbd, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x81, 0xd1, 0x8b, 0xd0, 0xbb, 0xd0, 0xba, + 0xd0, 0xb8, 0xd0, 0xb1, 0xd1, 0x8b, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, + 0xbe, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xbd, 0xd1, 0x8b, 0xd0, 0xb5, + 0xd0, 0xbc, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, + 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xba, 0xd1, 0x82, 0xd0, 0xa1, + 0xd0, 0xb5, 0xd0, 0xb9, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbc, 0xd0, + 0xbe, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb0, + 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, + 0xbb, 0xd0, 0xb0, 0xd0, 0xb9, 0xd0, 0xbd, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, 0x80, + 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x80, 0xd1, + 0x81, 0xd0, 0xb8, 0xd1, 0x8f, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0, + 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x84, 0xd0, 0xb8, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0, + 0xbc, 0xd1, 0x8b, 0xd1, 0x83, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbd, + 0xd1, 0x8f, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, 0xbd, 0xd1, 0x8b, 0xd1, + 0x85, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x82, 0xd1, 0x8c, + 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd1, 0x8e, 0xd1, + 0x8f, 0xd0, 0xbd, 0xd0, 0xb2, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x8f, 0xd0, 0xbc, + 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x8c, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, + 0xbd, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb8, 0xd1, 0x85, 0xd0, 0xb4, 0xd0, 0xb0, + 0xd0, 0xbd, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, 0xb7, 0xd0, 0xbd, 0xd0, + 0xb0, 0xd1, 0x87, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xbb, + 0xd1, 0x8c, 0xd0, 0xb7, 0xd1, 0x8f, 0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, + 0x83, 0xd0, 0xbc, 0xd0, 0xb0, 0xd0, 0xa2, 0xd0, 0xb5, 0xd0, 0xbf, 0xd0, 0xb5, + 0xd1, 0x80, 0xd1, 0x8c, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x8f, 0xd1, + 0x86, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, 0xb0, 0xd1, 0x89, 0xd0, 0xb8, 0xd1, 0x82, + 0xd1, 0x8b, 0xd0, 0x9b, 0xd1, 0x83, 0xd1, 0x87, 0xd1, 0x88, 0xd0, 0xb8, 0xd0, + 0xb5, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x82, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0x85, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x85, 0xe0, + 0xa4, 0xa8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, + 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, + 0xb8, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb2, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, + 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x80, 0xe0, + 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xae, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, + 0x8b, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, + 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xb9, 0xe0, + 0xa5, 0x81, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0x87, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, + 0x9f, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0xaf, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xad, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, + 0xaa, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbf, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x81, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, + 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x98, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x9f, + 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa4, 0x85, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, + 0x85, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xae, 0xe0, + 0xa5, 0x81, 0xe0, 0xa4, 0x9d, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, + 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xa1, 0xe0, + 0xa4, 0xbc, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9f, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, + 0xa4, 0xa6, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x95, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb5, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa6, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, + 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xb8, 0xe0, + 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, + 0x97, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xa0, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x95, 0xe0, + 0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xb7, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb5, + 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8b, 0xe0, + 0xa4, 0x9c, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb9, 0xe0, + 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa5, 0x8d, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, + 0x9a, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, + 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xb2, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x80, + 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, + 0x9c, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x98, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbf, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x80, 0xe0, + 0xa4, 0x9a, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x97, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x97, 0xe0, + 0xa4, 0xb2, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, + 0x87, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, + 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa4, 0xb9, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, + 0xb8, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb9, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa1, 0xe0, + 0xa4, 0xbc, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x98, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, + 0xa4, 0x9a, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, + 0x80, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbc, 0xe0, 0xa5, 0x80, + 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, + 0xb6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x9c, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0x9c, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x9f, 0xe0, + 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbc, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, + 0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb2, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x96, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0x85, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0x9c, + 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa6, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbf, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbf, 0xe0, + 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, + 0x82, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, + 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xab, 0xe0, 0xa5, 0x80, 0xe0, + 0xa4, 0x9c, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, + 0xa4, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xae, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb5, 0xe0, + 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, + 0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa5, 0x8b, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, + 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xac, + 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x9c, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, + 0xaa, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xac, + 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, + 0xa5, 0x8c, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, + 0x87, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbf, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb9, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, + 0xb8, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x82, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, + 0xb2, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0x95, 0xe0, + 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, + 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa5, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xd8, 0xaa, 0xd8, 0xb3, 0xd8, + 0xaa, 0xd8, 0xb7, 0xd9, 0x8a, 0xd8, 0xb9, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, + 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xa9, 0xd8, 0xa8, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, + 0xb3, 0xd8, 0xb7, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb5, 0xd9, 0x81, + 0xd8, 0xad, 0xd8, 0xa9, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xb6, 0xd9, + 0x8a, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xae, 0xd8, 0xa7, 0xd8, 0xb5, + 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb2, 0xd9, 0x8a, 0xd8, + 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xa9, + 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa8, 0xd8, + 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xaf, 0xd9, 0x88, 0xd8, 0xaf, 0xd8, 0xa8, + 0xd8, 0xb1, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xac, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xaf, 0xd9, 0x88, 0xd9, 0x84, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, + 0x85, 0xd9, 0x88, 0xd9, 0x82, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, + 0xd8, 0xb1, 0xd8, 0xa8, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd8, + 0xb1, 0xd9, 0x8a, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd9, 0x88, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb0, 0xd9, 0x87, 0xd8, + 0xa7, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xad, 0xd9, 0x8a, 0xd8, 0xa7, + 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xad, 0xd9, 0x82, 0xd9, 0x88, 0xd9, + 0x82, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd8, 0xb1, 0xd9, 0x8a, 0xd9, 0x85, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x82, 0xd9, + 0x85, 0xd8, 0xad, 0xd9, 0x81, 0xd9, 0x88, 0xd8, 0xb8, 0xd8, 0xa9, 0xd8, 0xa7, + 0xd9, 0x84, 0xd8, 0xab, 0xd8, 0xa7, 0xd9, 0x86, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, + 0xb4, 0xd8, 0xa7, 0xd9, 0x87, 0xd8, 0xaf, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, + 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xa3, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, + 0x82, 0xd8, 0xb1, 0xd8, 0xa2, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb4, + 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xad, 0xd9, + 0x88, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd8, 0xaf, + 0xd9, 0x8a, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8, 0xb3, 0xd8, + 0xb1, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x88, + 0xd9, 0x85, 0xd9, 0x85, 0xd8, 0xac, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xb9, 0xd8, + 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xad, 0xd9, 0x85, 0xd9, 0x86, + 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x86, 0xd9, 0x82, 0xd8, 0xa7, 0xd8, 0xb7, 0xd9, + 0x81, 0xd9, 0x84, 0xd8, 0xb3, 0xd8, 0xb7, 0xd9, 0x8a, 0xd9, 0x86, 0xd8, 0xa7, + 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x88, 0xd9, 0x8a, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xaf, 0xd9, 0x86, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xb1, + 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, + 0xb1, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xb6, 0xd8, 0xaa, 0xd8, 0xad, 0xd9, 0x8a, + 0xd8, 0xa7, 0xd8, 0xaa, 0xd9, 0x8a, 0xd8, 0xa8, 0xd8, 0xaa, 0xd9, 0x88, 0xd9, + 0x82, 0xd9, 0x8a, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd9, 0x88, + 0xd9, 0x84, 0xd9, 0x89, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa8, 0xd8, 0xb1, 0xd9, + 0x8a, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x84, 0xd8, 0xa7, + 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, + 0xb7, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb4, 0xd8, 0xae, 0xd8, 0xb5, 0xd9, 0x8a, + 0xd8, 0xb3, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, + 0xa7, 0xd9, 0x84, 0xd8, 0xab, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xab, 0xd8, 0xa7, + 0xd9, 0x84, 0xd8, 0xb5, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xad, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xab, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xb2, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, + 0xae, 0xd9, 0x84, 0xd9, 0x8a, 0xd8, 0xac, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, + 0xd9, 0x85, 0xd9, 0x8a, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, + 0xa7, 0xd9, 0x85, 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd9, 0x85, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, + 0xb9, 0xd8, 0xa9, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd9, 0x87, 0xd8, 0xaf, + 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xa6, 0xd9, 0x8a, 0xd8, + 0xb3, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaf, 0xd8, 0xae, 0xd9, 0x88, 0xd9, 0x84, + 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x86, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, + 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa7, + 0xd9, 0x84, 0xd8, 0xaf, 0xd9, 0x88, 0xd8, 0xb1, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xaf, 0xd8, 0xb1, 0xd9, 0x88, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, 0xb3, + 0xd8, 0xaa, 0xd8, 0xba, 0xd8, 0xb1, 0xd9, 0x82, 0xd8, 0xaa, 0xd8, 0xb5, 0xd8, + 0xa7, 0xd9, 0x85, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa8, + 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, + 0xb8, 0xd9, 0x8a, 0xd9, 0x85, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x74, 0x61, 0x69, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6d, 0x70, 0x6f, + 0x72, 0x61, 0x72, 0x79, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x73, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, + 0x68, 0x69, 0x6c, 0x64, 0x28, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x22, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x69, 0x6e, 0x76, 0x65, 0x73, 0x74, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, + 0x69, 0x63, 0x6f, 0x22, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x73, 0x73, 0x61, 0x63, 0x68, 0x75, + 0x73, 0x65, 0x74, 0x74, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x20, 0x61, 0x73, 0x70, 0x72, 0x6f, 0x6e, 0x75, 0x6e, 0x63, 0x69, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x3a, 0x23, 0x66, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, + 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x6d, 0x69, 0x73, 0x63, 0x65, 0x6c, 0x6c, 0x61, + 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x26, 0x6c, 0x74, 0x3b, 0x2f, 0x6d, 0x61, 0x74, + 0x68, 0x26, 0x67, 0x74, 0x3b, 0x70, 0x73, 0x79, 0x63, 0x68, 0x6f, 0x6c, 0x6f, + 0x67, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x75, 0x6c, 0x61, 0x72, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x61, 0x73, 0x20, 0x6f, 0x70, 0x70, 0x6f, 0x73, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x53, 0x75, 0x70, 0x72, 0x65, 0x6d, 0x65, 0x20, + 0x43, 0x6f, 0x75, 0x72, 0x74, 0x6f, 0x63, 0x63, 0x61, 0x73, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x61, 0x70, 0x78, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x6f, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x6e, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x74, 0x61, 0x69, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72, + 0x43, 0x61, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, + 0x75, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x46, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x3d, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x63, 0x69, 0x6f, 0x75, + 0x73, 0x6e, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x64, 0x69, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x6e, 0x65, 0x61, 0x6e, 0x65, 0x78, 0x74, 0x72, 0x61, 0x6f, 0x72, 0x64, + 0x69, 0x6e, 0x61, 0x72, 0x79, 0x61, 0x73, 0x73, 0x61, 0x73, 0x73, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, + 0x6e, 0x73, 0x69, 0x76, 0x65, 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x0a, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70, + 0x68, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x68, 0x72, 0x65, 0x66, 0x77, 0x61, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x53, 0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, + 0x63, 0x69, 0x73, 0x63, 0x6f, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x70, 0x68, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x6d, 0x61, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x73, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x54, 0x68, 0x69, 0x73, 0x20, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, + 0x63, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x47, 0x72, 0x65, 0x61, 0x74, 0x20, 0x42, 0x72, + 0x69, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, + 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x3d, 0x22, 0x3b, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x75, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x61, 0x72, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x09, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, + 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x27, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x22, + 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x72, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x70, 0x6f, 0x70, + 0x75, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3a, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x3c, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x6c, 0x79, 0x70, 0x61, 0x72, 0x6c, 0x69, 0x61, 0x6d, 0x65, + 0x6e, 0x74, 0x61, 0x72, 0x79, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x74, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x70, 0x72, 0x65, 0x64, 0x6f, 0x6d, 0x69, 0x6e, + 0x61, 0x6e, 0x74, 0x6c, 0x79, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x7c, 0x26, + 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61, + 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6f, 0x72, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x3d, 0x22, 0x6f, 0x67, 0x3a, 0x2f, 0x78, 0x2d, 0x73, 0x68, 0x6f, 0x63, 0x6b, + 0x77, 0x61, 0x76, 0x65, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x4e, 0x65, 0x76, 0x65, 0x72, 0x74, 0x68, 0x65, + 0x6c, 0x65, 0x73, 0x73, 0x2c, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x41, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x62, 0x65, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, 0x20, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x64, 0x20, 0x61, 0x73, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x63, 0x74, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x75, 0x61, 0x6c, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x76, 0x69, 0x65, 0x77, 0x68, 0x6f, 0x6d, 0x6f, 0x73, 0x65, 0x78, 0x75, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x20, 0x6f, 0x66, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x72, 0x73, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6c, 0x79, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x20, 0x6f, 0x66, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x6e, 0x74, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x3d, 0x22, 0x30, 0x22, 0x3e, 0x72, 0x65, 0x76, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x72, 0x79, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x49, 0x6e, 0x64, 0x6f, 0x2d, 0x45, 0x75, 0x72, + 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x6f, 0x66, 0x61, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x4e, 0x65, 0x77, 0x20, 0x59, 0x6f, 0x72, 0x6b, + 0x20, 0x43, 0x69, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74, + 0x69, 0x63, 0x69, 0x61, 0x6e, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x3d, 0x22, 0x30, 0x22, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, + 0x67, 0x69, 0x63, 0x61, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x28, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d, + 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, + 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x2e, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6e, 0x64, + 0x61, 0x73, 0x68, 0x3b, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x65, 0x71, 0x75, 0x69, 0x70, 0x70, 0x65, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x67, 0x65, 0x20, 0x6f, 0x66, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, + 0x73, 0x73, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x26, + 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x65, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, + 0x67, 0x65, 0x20, 0x6f, 0x66, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x20, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x6a, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x74, 0x77, 0x6f, 0x20, 0x64, 0x69, 0x66, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x69, 0x64, 0x65, 0x20, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x20, 0x6f, 0x66, 0x09, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x6c, 0x79, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x77, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6d, 0x64, + 0x61, 0x73, 0x68, 0x3b, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x65, 0x66, 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x6e, 0x74, 0x6c, 0x79, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6f, + 0x76, 0x65, 0x72, 0x3d, 0x22, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x3b, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x73, 0x65, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x61, 0x72, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x70, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x29, 0x20, 0x7b, 0x74, 0x6f, 0x6f, 0x6b, 0x20, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x20, 0x69, 0x6e, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x6d, 0x65, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, + 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x67, 0x72, 0x65, 0x61, 0x74, 0x20, 0x64, 0x65, + 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, + 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x32, 0x30, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x75, 0x72, 0x79, 0x2c, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, + 0x79, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x44, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x72, 0x79, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x74, 0x6c, 0x79, 0x2c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, + 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x62, 0x65, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x27, 0x73, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x20, 0x61, 0x73, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x28, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, + 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x22, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x6c, 0x79, 0x62, 0x61, 0x73, 0x69, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, + 0x74, 0x79, 0x20, 0x6f, 0x66, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6a, 0x75, 0x72, 0x69, 0x73, 0x64, 0x69, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, 0x73, 0x65, + 0x6f, 0x75, 0x74, 0x3d, 0x22, 0x4e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, + 0x6e, 0x69, 0x74, 0x65, 0x64, 0x66, 0x69, 0x6c, 0x6d, 0x20, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2e, + 0x64, 0x74, 0x64, 0x22, 0x3e, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, + 0x6f, 0x74, 0x68, 0x65, 0x72, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x61, 0x72, 0x65, 0x75, 0x6e, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x65, 0x64, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, + 0x61, 0x72, 0x20, 0x74, 0x6f, 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, + 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x09, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x6e, 0x20, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x6c, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, + 0x79, 0x20, 0x66, 0x6f, 0x72, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, + 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x20, 0x74, 0x6f, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, + 0x20, 0x79, 0x65, 0x61, 0x72, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, + 0x79, 0x65, 0x61, 0x72, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x09, 0x09, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x39, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x75, 0x72, 0x79, 0x2c, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x65, 0x20, + 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x64, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x74, 0x65, 0x62, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, + 0x61, 0x62, 0x6f, 0x75, 0x74, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, + 0x65, 0x66, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x73, 0x53, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x73, 0x65, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x20, 0x6f, 0x66, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x2d, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x63, 0x61, 0x73, 0x65, 0x2c, 0x77, 0x61, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x64, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x65, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x44, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, + 0x61, 0x72, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x61, 0x6c, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x61, 0x72, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70, + 0x68, 0x79, 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x61, 0x6e, 0x63, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x22, 0x22, 0x20, 0x2f, 0x3e, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x4d, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x73, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, + 0x6e, 0x69, 0x74, 0x65, 0x64, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x64, 0x69, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x6c, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x52, 0x65, 0x76, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x72, 0x79, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x69, 0x73, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, + 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x74, + 0x6f, 0x72, 0x69, 0x65, 0x73, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x61, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x74, 0x73, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a, + 0x65, 0x64, 0x20, 0x61, 0x73, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x65, 0x64, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x20, 0x74, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x61, + 0x64, 0x75, 0x61, 0x74, 0x65, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, + 0x65, 0x20, 0x74, 0x77, 0x6f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x64, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x61, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x66, 0x75, 0x6e, 0x64, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x6c, 0x79, 0x2c, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x6c, 0x69, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x20, 0x6f, 0x66, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x32, 0x30, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x75, 0x72, 0x79, 0x2e, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x73, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x68, 0x61, + 0x6c, 0x66, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x61, 0x6c, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, + 0x72, 0x69, 0x7a, 0x65, 0x64, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x77, 0x61, 0x73, 0x20, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x65, 0x64, 0x65, 0x64, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x65, 0x73, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x64, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, 0x66, + 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x65, 0x64, 0x61, 0x77, 0x61, 0x79, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x79, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x70, 0x6f, 0x77, + 0x65, 0x72, 0x66, 0x75, 0x6c, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x61, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x74, 0x79, 0x20, 0x6f, 0x66, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, + 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x73, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, + 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x69, 0x73, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67, + 0x68, 0x74, 0x20, 0x74, 0x6f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x6e, 0x64, 0x77, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x6e, 0x6f, + 0x75, 0x6e, 0x63, 0x65, 0x64, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x61, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x73, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x74, 0x68, 0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x4f, 0x20, 0x4e, 0x4f, 0x54, 0x20, + 0x41, 0x4c, 0x54, 0x45, 0x52, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x2f, 0x3f, + 0x73, 0x6f, 0x72, 0x74, 0x3d, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x64, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x73, 0x69, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x68, 0x61, 0x73, 0x20, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x75, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x6c, 0x79, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, + 0x74, 0x68, 0x6f, 0x73, 0x65, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x69, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x73, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, + 0x6f, 0x74, 0x68, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, + 0x72, 0x69, 0x63, 0x61, 0x6e, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x61, 0x6d, 0x65, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x6e, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x63, 0x61, 0x73, 0x65, 0x3b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, + 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x3b, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x62, 0x61, 0x68, 0x61, 0x73, 0x61, 0x20, 0x4d, + 0x65, 0x6c, 0x61, 0x79, 0x75, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x62, 0x6f, + 0x6b, 0x6d, 0xc3, 0xa5, 0x6c, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6e, 0x79, + 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0xc5, 0xa1, + 0xc4, 0x8d, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x63, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x63, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, + 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, + 0x67, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x27, 0x2c, 0x20, 0x27, 0x61, 0x64, 0x6d, 0x69, 0x6e, + 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x6d, 0x75, + 0x6c, 0x74, 0x61, 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x3c, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d, 0x2d, 0x2d, 0x3e, + 0x0a, 0x3c, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3d, 0x68, 0x74, 0x74, 0x70, + 0x25, 0x33, 0x41, 0x25, 0x32, 0x46, 0x25, 0x32, 0x46, 0x3c, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x2f, 0x66, + 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x20, 0x7d, + 0x29, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, + 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x28, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, + 0x28, 0x29, 0x3b, 0x3c, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d, 0x2d, + 0x2d, 0x3e, 0x0d, 0x0a, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x55, 0x6e, 0x66, 0x6f, 0x72, 0x74, 0x75, 0x6e, + 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, + 0x3b, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x2f, 0x66, 0x61, 0x76, 0x69, 0x63, + 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x3e, 0x3d, 0x27, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x27, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x3c, 0x6c, + 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x61, + 0x6e, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, + 0x66, 0x70, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x22, 0x20, 0x0a, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x41, 0x63, 0x63, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x69, 0x64, + 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x6c, + 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, + 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x6c, 0x79, + 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x2d, 0x2d, 0x3c, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, + 0x66, 0x5d, 0x2d, 0x2d, 0x3e, 0x50, 0x72, 0x69, 0x6d, 0x65, 0x20, 0x4d, 0x69, + 0x6e, 0x69, 0x73, 0x74, 0x65, 0x72, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, + 0x65, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x74, 0x68, 0x65, 0x20, 0x68, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x6d, + 0x6f, 0x75, 0x73, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x3d, 0x22, 0x74, 0x68, 0x65, + 0x20, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, + 0x61, 0x73, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, + 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, + 0x64, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x3c, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d, + 0x2d, 0x2d, 0x3e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x73, 0x20, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, + 0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, + 0x7b, 0x42, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0x0a, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x29, 0x3b, + 0x20, 0x6a, 0x73, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x22, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x72, + 0x65, 0x67, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x20, 0x43, 0x61, 0x74, 0x68, 0x6f, 0x6c, 0x69, + 0x63, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x31, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x61, 0x65, 0x6f, + 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x20, + 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x6a, 0x73, 0x22, 0x3e, + 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x63, 0x6f, 0x6d, 0x62, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x77, + 0x2e, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x28, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, + 0x3e, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x61, 0x49, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, + 0x61, 0x72, 0x2c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, + 0x66, 0x74, 0x22, 0x20, 0x43, 0x7a, 0x65, 0x63, 0x68, 0x20, 0x52, 0x65, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, + 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x63, 0x6f, 0x6d, + 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x3c, + 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, + 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, + 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x27, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, + 0x3c, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x28, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x09, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x76, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x61, 0x72, 0x62, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x6f, 0x78, 0x69, + 0x64, 0x65, 0x0a, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x2d, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x6f, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x6e, + 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x54, 0x69, 0xe1, 0xba, + 0xbf, 0x6e, 0x67, 0x20, 0x56, 0x69, 0xe1, 0xbb, 0x87, 0x74, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, + 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, + 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x77, 0x61, 0x73, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x65, 0x64, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x3e, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x63, 0x63, 0x6c, 0x65, 0x73, 0x69, 0x61, + 0x73, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x68, + 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x3c, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x68, 0x61, 0x73, 0x20, + 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x69, 0x6e, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x61, + 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x69, 0x77, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, + 0x65, 0x64, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x22, 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x65, 0x64, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6e, + 0x6f, 0x74, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, + 0x6c, 0x73, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x6d, 0x61, 0x6e, 0x79, 0x61, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x2e, 0x20, 0x48, 0x6f, + 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x64, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x41, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x62, + 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x73, + 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x70, 0x6f, + 0x73, 0x74, 0x22, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, + 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, + 0x61, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x6c, + 0x73, 0x6f, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x61, 0x6e, 0x6e, 0x6f, 0x75, + 0x6e, 0x63, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x6c, 0x69, 0x67, + 0x6e, 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x6d, 0x61, 0x6e, + 0x79, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x66, 0x6f, + 0x72, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x65, + 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, + 0x73, 0x70, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x0d, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, + 0x70, 0x22, 0x20, 0x69, 0x6e, 0x68, 0x61, 0x62, 0x69, 0x74, 0x61, 0x6e, 0x74, + 0x73, 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, + 0x20, 0x79, 0x65, 0x61, 0x72, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, + 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x65, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x61, 0x72, 0x67, 0x75, + 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x67, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x61, 0x20, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x72, 0x65, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x20, 0x66, 0x6f, 0x72, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, + 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x63, + 0x69, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x20, 0x3c, + 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, + 0x77, 0x61, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x6f, 0x66, 0x69, 0x6e, 0x76, 0x65, 0x73, 0x74, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, + 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x64, 0x65, 0x73, 0x63, 0x65, + 0x6e, 0x64, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x3c, 0x73, 0x70, 0x61, + 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x20, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3c, 0x2f, + 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x61, + 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x68, 0x61, 0x73, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x65, + 0x6e, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x20, 0x55, 0x6e, 0x69, + 0x6f, 0x6e, 0x72, 0x65, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x63, 0x65, 0x6e, 0x74, + 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x69, + 0x63, 0x75, 0x6c, 0x74, 0x56, 0x69, 0x63, 0x65, 0x20, 0x50, 0x72, 0x65, 0x73, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x66, 0x6f, 0x6e, 0x74, 0x2d, + 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x31, 0x70, 0x78, 0x65, 0x78, 0x70, 0x6c, + 0x61, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x20, 0x6f, 0x66, 0x77, 0x72, + 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x09, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20, + 0x74, 0x6f, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x73, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x73, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x69, + 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x73, + 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x28, + 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, + 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x6e, + 0x74, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x6f, + 0x70, 0x6c, 0x65, 0x77, 0x65, 0x72, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x73, 0x65, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x31, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, + 0x09, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x6f, + 0x66, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x68, + 0x61, 0x76, 0x65, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x62, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x61, 0x73, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x20, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x69, 0x64, + 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x63, 0x61, + 0x70, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0d, + 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x78, 0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x74, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x6c, 0x61, + 0x72, 0x67, 0x65, 0x73, 0x74, 0x76, 0x65, 0x72, 0x79, 0x20, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x69, 0x67, 0x6e, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x73, 0x65, + 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x65, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x69, + 0x73, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x49, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x69, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x65, 0x64, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x65, 0x66, + 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0d, + 0x69, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, + 0x66, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x41, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x0a, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, + 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x28, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, + 0x61, 0x6c, 0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x6f, 0x73, 0x74, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, + 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72, + 0x70, 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, 0x0a, 0x2e, 0x0a, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x66, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x3e, + 0x0d, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x64, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x63, 0x65, 0x6c, 0x65, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x20, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x6f, 0x74, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x3e, 0x3c, 0x21, + 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d, 0x2d, 0x2d, 0x3e, 0x0a, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x69, + 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x6f, 0x66, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x77, 0x61, 0x73, 0x20, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x68, 0x72, 0x6f, 0x75, + 0x67, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x73, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x6f, 0x6d, + 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x70, + 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x73, + 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x6c, 0x79, 0x20, + 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x0d, + 0x0a, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x66, 0x6f, 0x72, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x65, 0x73, 0x73, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x77, 0x65, 0x72, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x69, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x22, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x6f, 0x66, + 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x6e, 0x6f, 0x22, + 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, + 0x6f, 0x66, 0x49, 0x49, 0x2c, 0x20, 0x48, 0x6f, 0x6c, 0x79, 0x20, 0x52, 0x6f, + 0x6d, 0x61, 0x6e, 0x69, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69, + 0x72, 0x20, 0x6f, 0x77, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x74, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x64, + 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x20, 0x6f, + 0x66, 0x74, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x74, 0x6f, 0x20, 0x65, + 0x6e, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x67, 0x72, + 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x61, + 0x72, 0x65, 0x20, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x6e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, + 0x2f, 0x75, 0x6c, 0x3e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, + 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x3e, 0x0a, 0x3c, 0x6d, + 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x6e, + 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x63, 0x61, + 0x72, 0x72, 0x69, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x62, 0x79, 0x48, + 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, + 0x66, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, + 0x6c, 0x20, 0x6f, 0x66, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x66, 0x66, 0x69, 0x63, + 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, + 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x64, 0x69, 0x66, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x74, 0x6f, 0x20, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x67, + 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x68, + 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x74, 0x79, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x71, 0x22, 0x09, 0x09, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x72, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x6d, 0x61, + 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x69, 0x61, 0x6e, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, + 0x6e, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x63, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, + 0x6c, 0x61, 0x72, 0x2c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x29, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, + 0x70, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x6f, + 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x74, 0x69, 0xe1, 0xba, 0xbf, + 0x6e, 0x67, 0x20, 0x56, 0x69, 0xe1, 0xbb, 0x87, 0x74, 0xd0, 0xa0, 0xd1, 0x83, + 0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xb9, 0xd1, 0x80, 0xd1, + 0x83, 0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xb9, 0x69, 0x6e, + 0x76, 0x65, 0x73, 0x74, 0x69, 0x67, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, + 0xd0, 0xba, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, 0x8b, 0xd0, + 0xb5, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, + 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, + 0x8b, 0xd0, 0xb9, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xb2, + 0xd0, 0xb5, 0xd0, 0xba, 0xd1, 0x81, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x82, 0xd0, + 0xb5, 0xd0, 0xbc, 0xd1, 0x8b, 0xd0, 0x9d, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbe, + 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, + 0xbe, 0xd1, 0x80, 0xd1, 0x8b, 0xd1, 0x85, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, 0xbb, + 0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xb2, 0xd1, 0x80, 0xd0, + 0xb5, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xbe, + 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xb0, 0xd1, 0x8f, 0xd1, 0x81, 0xd0, + 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd1, 0x8f, 0xd1, 0x81, + 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, + 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, + 0xd0, 0xa3, 0xd0, 0xba, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, + 0x8b, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x81, + 0xd1, 0x8b, 0xd0, 0xba, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, + 0xbe, 0xd0, 0xb9, 0xd1, 0x81, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xb0, + 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbe, 0xd1, + 0x89, 0xd1, 0x8c, 0xd1, 0x8e, 0xd1, 0x81, 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb4, + 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x80, 0xd0, + 0xb0, 0xd0, 0xb7, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, + 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xbd, 0xd1, 0x8b, 0xd1, 0x83, 0xd1, 0x87, 0xd0, + 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb5, + 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0x93, 0xd0, + 0xbb, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x8f, 0xd0, 0xb8, + 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xb8, 0xd1, + 0x81, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, 0xb0, + 0xd1, 0x80, 0xd0, 0xb5, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, + 0x8f, 0xd0, 0xa1, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x82, + 0xd1, 0x8c, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, + 0xbc, 0xd1, 0x83, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x83, + 0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, + 0xb0, 0xd1, 0x82, 0xd1, 0x8c, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xb0, + 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, + 0xb5, 0xd1, 0x87, 0xd0, 0xbd, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xb5, 0xd1, 0x88, + 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0xba, 0xd0, 0xbe, 0xd1, + 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xbe, 0xd1, 0x80, + 0xd0, 0xb3, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xba, 0xd0, + 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xa0, + 0xd0, 0xb5, 0xd0, 0xba, 0xd0, 0xbb, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xb0, 0xd8, + 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xaf, 0xd9, 0x89, + 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, + 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xb6, 0xd9, 0x88, + 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa8, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, + 0x85, 0xd8, 0xac, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xa7, + 0xd9, 0x82, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xb3, 0xd8, + 0xa7, 0xd8, 0xa6, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, 0xb1, + 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8, + 0xb9, 0xd8, 0xb6, 0xd8, 0xa7, 0xd8, 0xa1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, + 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xb6, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, + 0xaa, 0xd8, 0xb5, 0xd9, 0x85, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xa7, 0xd8, 0xb9, 0xd8, 0xb6, 0xd8, 0xa7, 0xd8, 0xa1, 0xd8, 0xa7, 0xd9, + 0x84, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xa6, 0xd8, 0xac, 0xd8, 0xa7, + 0xd9, 0x84, 0xd8, 0xa3, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, + 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd8, 0xb3, 0xd8, 0xac, 0xd9, 0x8a, 0xd9, 0x84, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd9, 0x82, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, + 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb6, 0xd8, 0xba, 0xd8, 0xb7, 0xd8, 0xa7, + 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x8a, 0xd8, 0xaf, 0xd9, + 0x8a, 0xd9, 0x88, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd8, 0xb1, 0xd8, 0xad, + 0xd9, 0x8a, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd8, 0xaf, 0xd9, + 0x8a, 0xd8, 0xaf, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd8, 0xb9, + 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8, + 0xae, 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, + 0xd9, 0x81, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, + 0xa3, 0xd9, 0x81, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xb1, 0xd9, 0x8a, 0xd8, 0xae, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xaa, 0xd9, 0x82, 0xd9, 0x86, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, + 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, + 0xa7, 0xd9, 0x84, 0xd8, 0xae, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xb7, 0xd8, 0xb1, + 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xac, 0xd8, 0xaa, 0xd9, 0x85, 0xd8, + 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x83, 0xd9, 0x88, + 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, + 0xad, 0xd8, 0xa9, 0xd8, 0xb9, 0xd8, 0xa8, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, + 0xd9, 0x84, 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd8, 0xb1, 0xd8, + 0xa8, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd9, 0x88, + 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xb7, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8, + 0xaf, 0xd8, 0xa8, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, + 0xd8, 0xae, 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, + 0x85, 0xd8, 0xaa, 0xd8, 0xad, 0xd8, 0xaf, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xa7, 0xd8, 0xba, 0xd8, 0xa7, 0xd9, 0x86, 0xd9, 0x8a, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x3c, + 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, + 0x20, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x2f, 0x61, + 0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x3c, 0x21, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65, + 0x65, 0x6e, 0x22, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, + 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x68, 0x61, + 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, + 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x20, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0x0a, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, + 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, + 0x67, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x72, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x73, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x22, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6f, 0x75, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6f, 0x6e, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, 0x3e, + 0x3c, 0x77, 0x61, 0x73, 0x20, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x29, 0x3b, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x22, 0x3e, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x65, 0x63, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, + 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, + 0x22, 0x2f, 0x7d, 0x62, 0x6f, 0x64, 0x79, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x3a, 0x30, 0x3b, 0x45, 0x6e, 0x63, 0x79, 0x63, 0x6c, 0x6f, 0x70, 0x65, + 0x64, 0x69, 0x61, 0x20, 0x6f, 0x66, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x0a, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x72, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x49, 0x6e, 0x20, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x2f, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20, + 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x63, + 0x65, 0x6e, 0x74, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x0d, 0x0a, 0x09, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x69, 0x6e, 0x73, 0x70, 0x69, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, + 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x2e, 0x6a, 0x73, + 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x20, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, + 0x65, 0x65, 0x6e, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x20, 0x6c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, + 0x69, 0x73, 0x74, 0x20, 0x50, 0x61, 0x72, 0x74, 0x79, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x62, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, + 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3d, 0x22, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x20, 0x6f, 0x66, 0x22, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, + 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x4f, 0x72, 0x74, + 0x68, 0x6f, 0x64, 0x6f, 0x78, 0x20, 0x43, 0x68, 0x75, 0x72, 0x63, 0x68, 0x73, + 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, + 0x3d, 0x22, 0x73, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x68, 0x69, + 0x73, 0x20, 0x64, 0x65, 0x61, 0x74, 0x68, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0a, + 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, + 0x61, 0x6e, 0x64, 0x73, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x75, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x63, 0x72, + 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x20, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, + 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x76, 0x65, 0x72, 0x79, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, + 0x72, 0x20, 0x74, 0x6f, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x77, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x3d, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x64, + 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x6e, 0x61, + 0x6d, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x73, + 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, + 0x64, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x61, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x77, 0x61, 0x73, 0x20, + 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x61, 0x6e, + 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x69, 0x6e, 0x73, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x6f, 0x72, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x65, 0x64, 0x20, 0x61, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, + 0x73, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x61, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, + 0x65, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x55, 0x6e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x64, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3e, 0x0a, 0x09, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, + 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x20, 0x6f, 0x66, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, + 0x6d, 0x61, 0x67, 0x6e, 0x65, 0x74, 0x69, 0x63, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x49, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, + 0x74, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x46, 0x6f, + 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, + 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x74, + 0x22, 0x20, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6d, 0x64, 0x61, 0x73, + 0x68, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, + 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x75, 0x6c, 0x3e, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x61, + 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x61, 0x74, + 0x68, 0x77, 0x69, 0x74, 0x68, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x64, + 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x75, 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x69, 0x73, + 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, + 0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87, 0x20, 0x28, 0xe7, 0xae, 0x80, 0xe4, 0xbd, + 0x93, 0x29, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x64, 0x61, 0x64, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, + 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x63, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x65, 0xe0, 0xa4, 0x89, + 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0, + 0xa4, 0xaa, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xb5, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0, + 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, + 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb8, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, + 0xaa, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa4, 0x96, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, + 0xbf, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0xad, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9c, + 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, + 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x9c, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa3, 0xe0, + 0xa4, 0xac, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, + 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, + 0xa5, 0x89, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb9, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, + 0xa5, 0x83, 0xe0, 0xa4, 0xb7, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa0, 0xe0, 0xa4, + 0xac, 0xe0, 0xa4, 0xa2, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, + 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xaa, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, + 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0xbf, 0xe0, + 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xab, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, + 0x8c, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xae, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0xae, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xaa, 0xe0, + 0xa4, 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, + 0xac, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xa6, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9b, + 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, + 0xa4, 0xb6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0x89, + 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa4, 0xae, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, + 0x88, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8b, + 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x95, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa2, 0xe0, 0xa4, + 0xbc, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xab, 0xe0, + 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, + 0xae, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x96, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, + 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0x9a, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9b, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0x9b, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, + 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, + 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x8f, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, + 0xbf, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0x98, + 0xe0, 0xa4, 0xa3, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0xa6, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, + 0x87, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8b, + 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, 0xe0, + 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa7, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, + 0xa4, 0xbf, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, + 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, + 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, + 0xa4, 0xb8, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xb6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, + 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa6, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, + 0xbf, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaa, + 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb7, 0xe0, + 0xa4, 0xb9, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, + 0x80, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, + 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, + 0xaa, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, + 0xae, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x83, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, + 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0x98, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb5, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa4, 0xb8, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, + 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xae, 0xe0, + 0xa5, 0x88, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0xa4, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, + 0xa5, 0x87, 0x72, 0x73, 0x73, 0x2b, 0x78, 0x6d, 0x6c, 0x22, 0x20, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x3e, 0x0a, 0x3c, 0x22, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, + 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, + 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x74, + 0x2f, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x6a, + 0x73, 0x22, 0x3e, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, + 0x22, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x7d, 0x29, 0x28, 0x29, + 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, + 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x29, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, + 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x73, + 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x6e, 0x6f, 0x22, + 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6c, 0x61, + 0x70, 0x73, 0x65, 0x3a, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42, 0x61, 0x68, 0x61, 0x73, 0x61, + 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x45, 0x6e, 0x67, + 0x6c, 0x69, 0x73, 0x68, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x3c, 0x74, 0x65, 0x78, 0x74, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x3d, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x6f, 0x76, 0x65, 0x72, + 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x69, + 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x2e, 0x6a, 0x73, 0x22, + 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x2f, 0x66, + 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x20, 0x2f, + 0x3e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, + 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6c, 0x65, + 0x66, 0x74, 0x3b, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x29, + 0x3b, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, + 0x0a, 0x3c, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3a, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, + 0x77, 0x3a, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x6d, 0x6f, 0x72, 0x65, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6e, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, + 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, + 0x3b, 0x22, 0x3e, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x65, 0x20, + 0x31, 0x35, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x2e, + 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x28, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x79, 0x7a, 0x61, 0x6e, 0x74, 0x69, 0x6e, + 0x65, 0x20, 0x45, 0x6d, 0x70, 0x69, 0x72, 0x65, 0x2e, 0x6a, 0x70, 0x67, 0x7c, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x7c, 0x6c, 0x65, 0x66, 0x74, 0x7c, 0x76, 0x61, + 0x73, 0x74, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, + 0x66, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x74, 0x79, 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x64, 0x6f, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x20, + 0x57, 0x61, 0x72, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x22, 0x3e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x73, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x72, 0x61, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x20, + 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3a, 0x31, 0x30, 0x30, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x2d, 0x73, + 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x72, 0x20, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, + 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x6f, 0x66, 0x44, 0x65, 0x6d, 0x6f, 0x63, 0x72, 0x61, 0x74, 0x69, 0x63, + 0x20, 0x50, 0x61, 0x72, 0x74, 0x79, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x46, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2c, 0x2e, + 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, + 0x0a, 0x09, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, + 0x73, 0x29, 0x5b, 0x30, 0x5d, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x2e, 0x6a, 0x73, 0x22, 0x3e, + 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x6c, 0x69, + 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x22, + 0x20, 0x27, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x27, 0x27, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x27, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x2f, 0x61, + 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x2f, 0x70, 0x61, 0x67, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x67, + 0x65, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x62, 0x61, 0x68, 0x61, + 0x73, 0x61, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x65, + 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x20, 0x28, 0x73, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x29, 0xce, 0x95, 0xce, 0xbb, 0xce, 0xbb, 0xce, 0xb7, 0xce, 0xbd, 0xce, + 0xb9, 0xce, 0xba, 0xce, 0xac, 0xd1, 0x85, 0xd1, 0x80, 0xd0, 0xb2, 0xd0, 0xb0, + 0xd1, 0x82, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, + 0xbc, 0xd0, 0xbf, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb8, 0xd1, 0x8f, + 0xd0, 0xb2, 0xd0, 0xbb, 0xd1, 0x8f, 0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x81, 0xd1, + 0x8f, 0xd0, 0x94, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xb8, + 0xd1, 0x82, 0xd1, 0x8c, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, + 0xb2, 0xd0, 0xb5, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb7, + 0xd0, 0xb2, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0x98, 0xd0, + 0xbd, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x82, + 0xd0, 0x9e, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, + 0x82, 0xd1, 0x8c, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb8, + 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x82, 0xd0, + 0xb5, 0xd1, 0x80, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xba, 0xd0, 0xbe, + 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, + 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x86, + 0xd1, 0x8b, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, + 0x82, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x83, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xbe, + 0xd0, 0xb2, 0xd0, 0xb8, 0xd1, 0x8f, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, + 0xbe, 0xd0, 0xb1, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xbc, 0xd1, 0x8b, 0xd0, 0xbf, + 0xd0, 0xbe, 0xd0, 0xbb, 0xd1, 0x83, 0xd1, 0x87, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, + 0x8c, 0xd1, 0x8f, 0xd0, 0xb2, 0xd0, 0xbb, 0xd1, 0x8f, 0xd1, 0x8e, 0xd1, 0x82, + 0xd1, 0x81, 0xd1, 0x8f, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb8, 0xd0, 0xb1, 0xd0, + 0xbe, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbc, + 0xd0, 0xbf, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0xb2, 0xd0, + 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb5, + 0xd1, 0x81, 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x81, 0xd1, 0x82, 0xd0, + 0xb2, 0xd0, 0xb0, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xa7, + 0xd8, 0xb6, 0xd9, 0x8a, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, + 0xa6, 0xd9, 0x8a, 0xd8, 0xb3, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, + 0xd8, 0xa7, 0xd9, 0x86, 0xd8, 0xaa, 0xd9, 0x82, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, + 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, + 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, + 0xb1, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x83, + 0xd8, 0xaa, 0xd9, 0x88, 0xd8, 0xa8, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, + 0xb3, 0xd8, 0xb9, 0xd9, 0x88, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, + 0xd8, 0xad, 0xd8, 0xb5, 0xd8, 0xa7, 0xd8, 0xa6, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, + 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, + 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb5, 0xd9, 0x88, 0xd8, + 0xaa, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, + 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xb1, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xaa, 0xd8, 0xb5, 0xd8, 0xa7, 0xd9, 0x85, 0xd9, 0x8a, 0xd9, 0x85, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa5, 0xd8, 0xb3, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, + 0x85, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, + 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, + 0xb1, 0xd8, 0xa6, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xaa, 0x72, 0x6f, 0x62, 0x6f, + 0x74, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x6f, 0x74, + 0x65, 0x72, 0x22, 0x3e, 0x74, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65, + 0x64, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x3c, 0x69, 0x6d, 0x67, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x2e, + 0x6a, 0x70, 0x67, 0x7c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x7c, 0x74, 0x68, 0x75, + 0x6d, 0x62, 0x7c, 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x20, 0x73, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, + 0x3b, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x26, + 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x3a, 0x30, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, + 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x22, 0x20, 0x50, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x77, 0x65, 0x6e, 0x74, + 0x69, 0x65, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x70, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x45, + 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x61, 0x2e, 0x61, 0x73, 0x79, 0x6e, + 0x63, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x69, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, + 0x75, 0x74, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x72, 0x69, + 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x27, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, + 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, + 0x7a, 0x65, 0x3a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x6c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x41, 0x72, 0x69, 0x61, 0x6c, 0x2c, + 0x20, 0x48, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x2c, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x3d, 0x22, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x74, 0x64, 0x3e, + 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0x3c, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x6c, 0x3d, + 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x28, 0x27, 0x3c, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x62, 0x65, 0x67, 0x69, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x74, 0x65, 0x6c, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, + 0x22, 0x6e, 0x6f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x3e, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, + 0x22, 0x3e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x68, 0x74, 0x74, 0x70, 0x25, 0x33, 0x41, + 0x25, 0x32, 0x46, 0x25, 0x32, 0x46, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, + 0x66, 0x50, 0x72, 0x69, 0x6d, 0x65, 0x20, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, 0x22, 0x3e, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2d, 0x64, 0x69, 0x6d, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x68, 0x75, 0x72, 0x63, + 0x68, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x6f, + 0x66, 0x20, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x43, 0x61, 0x72, 0x6f, 0x6c, + 0x69, 0x6e, 0x61, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x6b, 0x69, 0x6c, + 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x65, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x64, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x74, 0x69, + 0x63, 0x20, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x64, 0x65, 0x63, + 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x42, 0x65, 0x6e, 0x6a, 0x61, 0x6d, 0x69, 0x6e, + 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, 0x72, 0x6f, 0x6c, 0x65, + 0x2d, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x67, 0x61, 0x6d, 0x65, + 0x74, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, + 0x79, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, + 0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x70, 0x65, 0x72, 0x73, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x47, 0x75, 0x74, 0x65, 0x6e, 0x62, + 0x65, 0x72, 0x67, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, + 0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x74, 0x6f, + 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x6d, 0x69, 0x6e, + 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, + 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3c, 0x69, 0x6d, 0x67, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x63, + 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x20, 0x6d, 0x65, + 0x63, 0x68, 0x61, 0x6e, 0x69, 0x63, 0x73, 0x4e, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x68, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x20, 0x61, + 0x67, 0x6f, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0xce, 0x95, 0xce, 0xbb, 0xce, 0xbb, 0xce, + 0xb7, 0xce, 0xbd, 0xce, 0xb9, 0xce, 0xba, 0xce, 0xac, 0x0a, 0x74, 0x61, 0x6b, + 0x65, 0x20, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x20, 0x6f, + 0x66, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x4d, 0x69, 0x63, 0x72, + 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x63, 0x65, 0x6e, + 0x74, 0x75, 0x72, 0x79, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x64, 0x69, 0x76, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, + 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x74, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x20, 0x6d, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x72, 0x79, 0x69, 0x73, 0x6f, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x6c, 0x64, 0x20, + 0x54, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x66, 0x72, 0x69, + 0x63, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x73, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x6f, + 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x61, 0x6d, + 0x61, 0x6b, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, + 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x72, 0x67, 0x75, 0x61, 0x62, + 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, + 0x3e, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x3d, + 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x2f, 0x3e, + 0x0a, 0x63, 0x6f, 0x69, 0x6e, 0x63, 0x69, 0x64, 0x65, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x74, 0x77, 0x6f, 0x2d, 0x74, 0x68, 0x69, 0x72, + 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x44, 0x75, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2c, + 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, + 0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x6e, + 0x74, 0x6c, 0x79, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x63, 0x69, + 0x6f, 0x75, 0x73, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x72, 0x6c, 0x79, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, + 0x61, 0x73, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, + 0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x6f, 0x63, 0x63, + 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, + 0x64, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x62, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x20, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, + 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x78, 0x2f, 0x6c, + 0x69, 0x62, 0x73, 0x2f, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x31, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x3d, 0x22, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, + 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x76, 0x61, 0x63, + 0x79, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3c, 0x2f, 0x61, 0x3e, 0x65, + 0x28, 0x22, 0x25, 0x33, 0x43, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x27, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, + 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x4f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, + 0x2c, 0x2e, 0x6a, 0x70, 0x67, 0x7c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x7c, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x7c, 0x32, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x3a, 0x6e, 0x69, 0x6e, 0x65, 0x74, 0x65, 0x65, 0x6e, 0x74, 0x68, + 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x3c, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, + 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x73, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, + 0x69, 0x67, 0x6e, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c, + 0x64, 0x3b, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x22, + 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, + 0x22, 0x30, 0x22, 0x20, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x6c, 0x69, 0x6e, 0x6b, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, + 0x64, 0x74, 0x64, 0x22, 0x3e, 0x0a, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6c, 0x79, 0x20, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, + 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x3c, 0x73, 0x70, + 0x61, 0x6e, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x09, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x20, 0x77, 0x69, + 0x64, 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, + 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x22, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x63, 0x65, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x3d, 0x68, 0x74, 0x74, 0x70, 0x25, 0x33, 0x41, 0x25, 0x32, 0x46, 0x25, 0x32, + 0x46, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, + 0x61, 0x72, 0x20, 0x63, 0x75, 0x6c, 0x74, 0x75, 0x72, 0x65, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, + 0x2f, 0x3e, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x48, 0x61, 0x72, 0x76, 0x61, 0x72, + 0x64, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x74, + 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2f, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x4f, 0x78, 0x66, 0x6f, + 0x72, 0x64, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, + 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6b, 0x65, 0x79, 0x77, 0x6f, + 0x72, 0x64, 0x73, 0x22, 0x20, 0x63, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x74, 0x68, + 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, 0x69, 0x6e, 0x67, + 0x64, 0x6f, 0x6d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x67, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6c, 0x79, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x74, 0x65, 0x6c, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, + 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x61, 0x66, 0x74, 0x65, 0x72, 0x65, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x20, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x48, 0x6f, 0x77, 0x65, 0x76, + 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x22, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x22, 0x20, 0x74, 0x48, 0x6f, 0x6c, 0x79, 0x20, 0x52, 0x6f, 0x6d, 0x61, + 0x6e, 0x20, 0x45, 0x6d, 0x70, 0x65, 0x72, 0x6f, 0x72, 0x61, 0x6c, 0x6d, 0x6f, + 0x73, 0x74, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x6c, + 0x79, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x61, + 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x63, 0x75, + 0x6c, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x43, 0x49, 0x41, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x20, + 0x46, 0x61, 0x63, 0x74, 0x62, 0x6f, 0x6f, 0x6b, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x6f, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, + 0x61, 0x6e, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x72, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x3c, 0x6c, 0x69, + 0x3e, 0x3c, 0x65, 0x6d, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x2f, 0x74, 0x68, 0x65, 0x20, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, + 0x63, 0x20, 0x4f, 0x63, 0x65, 0x61, 0x6e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x6c, 0x79, 0x20, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2c, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, + 0x4f, 0x74, 0x74, 0x6f, 0x6d, 0x61, 0x6e, 0x20, 0x45, 0x6d, 0x70, 0x69, 0x72, + 0x65, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x41, 0x6e, 0x20, 0x49, 0x6e, 0x74, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x63, 0x6f, + 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x69, 0x6e, 0x64, 0x69, 0x67, 0x65, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x70, 0x65, + 0x6f, 0x70, 0x6c, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x65, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x64, + 0x69, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x72, 0x65, 0x65, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x69, 0x73, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x64, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x77, 0x69, + 0x64, 0x65, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x65, 0x64, + 0x20, 0x61, 0x73, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6d, + 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x65, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, + 0x6f, 0x66, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x72, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x6c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x69, 0x73, 0x20, 0x61, + 0x6c, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x6c, + 0x79, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, + 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, + 0x6e, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x63, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x69, + 0x64, 0x65, 0x6f, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x69, 0x63, 0x20, 0x6c, + 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, + 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, 0x20, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x20, + 0x6f, 0x66, 0x20, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x7c, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x49, 0x6e, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x2c, 0x20, 0x74, 0x68, + 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x6f, + 0x74, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x74, 0x68, + 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x79, 0x65, + 0x61, 0x72, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, 0x64, 0x69, 0x76, + 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x70, 0x68, 0x70, 0x77, 0x61, 0x73, 0x20, 0x65, 0x73, 0x74, 0x61, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x6d, 0x69, 0x6e, + 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x3e, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x61, 0x20, 0x73, 0x74, 0x72, 0x6f, + 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, + 0x74, 0x6f, 0x70, 0x3a, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x67, 0x72, 0x61, 0x64, + 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x54, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, + 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x28, 0x22, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x29, 0x3b, 0x48, 0x6f, + 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3b, + 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x67, + 0x61, 0x69, 0x6e, 0x73, 0x74, 0x30, 0x3b, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x55, 0x6e, 0x66, + 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, + 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, + 0x69, 0x78, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x09, 0x09, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x0a, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0xd0, 0x91, 0xd1, 0x8a, 0xd0, 0xbb, 0xd0, + 0xb3, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xb1, + 0xd1, 0x8a, 0xd0, 0xbb, 0xd0, 0xb3, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x81, 0xd0, + 0xba, 0xd0, 0xb8, 0xd0, 0xa4, 0xd0, 0xb5, 0xd0, 0xb4, 0xd0, 0xb5, 0xd1, 0x80, + 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, + 0x81, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0, 0xba, 0xd0, 0xbe, + 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x89, 0xd0, 0xb5, 0xd0, + 0xbd, 0xd0, 0xb8, 0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xb1, + 0xd1, 0x89, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0xbf, 0xd1, + 0x80, 0xd0, 0xbe, 0xd0, 0xb3, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xbc, + 0xd1, 0x8b, 0xd0, 0x9e, 0xd1, 0x82, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, + 0xb2, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xb1, 0xd0, 0xb5, 0xd1, 0x81, + 0xd0, 0xbf, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, + 0xbc, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xb0, + 0xd0, 0xbb, 0xd1, 0x8b, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xb7, 0xd0, 0xb2, 0xd0, + 0xbe, 0xd0, 0xbb, 0xd1, 0x8f, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xbf, 0xd0, 0xbe, + 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, + 0xb5, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x87, + 0xd0, 0xbd, 0xd1, 0x8b, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, + 0xb4, 0xd1, 0x83, 0xd0, 0xba, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xbf, + 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb3, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, + 0xbc, 0xd0, 0xb0, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xbd, 0xd0, 0xbe, + 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x8c, 0xd1, 0x8e, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, + 0x85, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x81, 0xd1, 0x8f, + 0xd0, 0xb8, 0xd0, 0xb7, 0xd0, 0xb1, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, + 0xbd, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xb5, + 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0xb8, 0xd0, + 0xb7, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, + 0xd1, 0x8f, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, + 0xbe, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0x90, 0xd0, 0xbb, 0xd0, 0xb5, + 0xd0, 0xba, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb4, 0xd1, 0x80, 0xe0, + 0xa4, 0xa6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xaa, 0xe0, + 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, + 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa5, 0x81, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa6, + 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa1, 0xe0, + 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, + 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, + 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, + 0xa1, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9a, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa0, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0x9a, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0x82, + 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0xa6, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, + 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0x85, 0xe0, + 0xa4, 0xa8, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xb0, 0xe0, 0xa4, 0x91, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, + 0xb6, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8b, + 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x95, 0xe0, + 0xa4, 0xb8, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xab, 0xe0, 0xa4, + 0xbc, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xb6, + 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, + 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xb0, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xaa, + 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xaf, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, + 0xa6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbf, 0xe0, + 0xa4, 0x89, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, + 0xa4, 0xbf, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa0, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8d, 0xe0, + 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xaa, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa1, 0xe0, + 0xa4, 0xbc, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, + 0xa8, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, + 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0xa3, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, + 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, 0xe0, 0xa5, + 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, + 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0x82, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x9a, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0x9a, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x89, 0xe0, + 0xa4, 0xaa, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xa7, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, + 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, + 0x89, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x80, + 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa7, 0xe0, + 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa6, 0xe0, + 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, + 0xa1, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x86, + 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x8f, 0xe0, + 0xa4, 0xb2, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, + 0xe0, 0xa4, 0x96, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, + 0xb6, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x81, + 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xac, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xb0, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, + 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbf, 0xe0, + 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, + 0x81, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, + 0xa4, 0xa5, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, + 0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xb0, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, + 0xb1, 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, + 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, + 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xa8, 0xd9, 0x8a, 0xd9, 0x88, + 0xd8, 0xaa, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, + 0xa7, 0xd9, 0x87, 0xd8, 0xaf, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xb9, 0xd8, 0xaf, + 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb2, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, + 0xb1, 0xd8, 0xb9, 0xd8, 0xaf, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, + 0xd8, 0xaf, 0xd9, 0x88, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa5, 0xd8, + 0xb3, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x85, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, + 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x88, 0xd8, 0xaa, 0xd9, 0x88, 0xd8, 0xb4, 0xd9, + 0x88, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb3, 0xd8, 0xa7, + 0xd8, 0xa8, 0xd9, 0x82, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, + 0x85, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x88, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, 0xaa, + 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb3, 0xd9, 0x84, 0xd8, 0xb3, 0xd9, + 0x84, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd8, 0xb1, + 0xd8, 0xa7, 0xd9, 0x81, 0xd9, 0x8a, 0xd9, 0x83, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, + 0x84, 0xd8, 0xa7, 0xd8, 0xb3, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x85, 0xd9, 0x8a, + 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xb5, 0xd8, + 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xaa, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x78, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, + 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x3c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3d, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x3d, 0x22, 0x6f, 0x66, 0x66, 0x22, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3b, 0x74, 0x6f, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x20, 0x23, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, + 0x3d, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x22, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x69, 0x6d, 0x67, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x2f, + 0x2f, 0x45, 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x77, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, + 0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x27, + 0x3c, 0x73, 0x63, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, + 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, + 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, + 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, + 0x0a, 0x0d, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x2f, + 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, + 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x65, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, + 0x22, 0x3f, 0x3e, 0x0a, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x20, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x63, 0x73, 0x73, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3d, 0x22, 0x6f, 0x67, 0x3a, + 0x74, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, + 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, + 0x65, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x68, + 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, + 0x75, 0x74, 0x66, 0x2d, 0x38, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, + 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, + 0x30, 0x25, 0x22, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x2f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x20, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, + 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x67, 0x62, + 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, + 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x6d, 0x45, + 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x79, 0x20, + 0x6f, 0x66, 0x20, 0x53, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x64, 0x69, + 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, + 0x69, 0x64, 0x29, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x28, 0x27, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27, 0x29, + 0x3b, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3d, 0x22, 0x6f, 0x67, 0x3a, 0xd0, 0x91, 0xd1, 0x8a, 0xd0, + 0xbb, 0xd0, 0xb3, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, + 0x0a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x3e, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x63, 0x79, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3c, 0x2f, 0x61, 0x3e, + 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x3e, 0x3c, + 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x69, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x70, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x57, + 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x2c, 0x20, 0x44, 0x2e, + 0x43, 0x2e, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x61, 0x6d, 0x6f, 0x6e, 0x67, + 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, + 0x2c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x66, + 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x4f, 0x78, 0x66, 0x6f, 0x72, 0x64, 0x20, + 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x69, + 0x73, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x66, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, + 0x2c, 0x20, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x2f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x62, 0x69, 0x61, 0x20, 0x55, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x65, 0x78, 0x70, 0x61, + 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x69, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, + 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x20, 0x6f, 0x66, 0x20, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x0a, 0x3c, + 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x77, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x61, 0x64, + 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x61, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6d, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, + 0x6c, 0x20, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x6f, 0x66, + 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, + 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x79, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x4e, + 0x6f, 0x74, 0x65, 0x2c, 0x20, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e, 0x63, + 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x75, 0x6e, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x68, 0x69, 0x73, 0x20, 0x79, + 0x6f, 0x75, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x62, 0x72, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, + 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x58, 0x2d, 0x55, 0x41, 0x2d, + 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x6f, 0x66, 0x20, 0x42, 0x72, 0x69, 0x74, + 0x69, 0x73, 0x68, 0x20, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x62, 0x69, 0x61, 0x68, + 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x72, 0x69, 0x74, 0x69, + 0x63, 0x69, 0x7a, 0x65, 0x64, 0x28, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x30, 0x22, 0x20, + 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, + 0x30, 0x22, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x72, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x20, 0x46, + 0x6f, 0x72, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x25, 0x33, 0x45, 0x25, 0x33, + 0x43, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x25, 0x33, 0x45, 0x22, 0x29, + 0x29, 0x3b, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x3c, 0x6c, 0x69, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3c, 0x6d, + 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, + 0x76, 0x3d, 0x22, 0x58, 0x2d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, + 0x28, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, + 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, + 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x6a, 0x61, 0x76, + 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, + 0x66, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, + 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, + 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x74, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x68, 0x74, + 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x68, 0x6f, 0x72, 0x74, + 0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x3d, 0x22, 0x58, 0x2d, 0x55, 0x41, 0x2d, 0x43, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, + 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x2f, 0x75, + 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x61, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67, + 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, + 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x71, 0x22, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x20, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, + 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, + 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x36, 0x3e, 0x3c, 0x75, 0x6c, + 0x3e, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, + 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x73, 0x73, 0x22, 0x20, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x22, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x68, 0x74, 0x6d, + 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, + 0x66, 0x2d, 0x38, 0x22, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, + 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x3e, + 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x3e, + 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x65, 0x63, + 0x65, 0x73, 0x73, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x46, 0x6f, 0x72, 0x20, 0x6d, + 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x21, 0x44, 0x4f, + 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c, 0x68, + 0x74, 0x6d, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, + 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x3d, 0x22, 0x6f, 0x66, 0x66, 0x22, 0x20, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, + 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, + 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, + 0x68, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, + 0x64, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x6d, 0x69, 0x73, 0x63, 0x6f, + 0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x64, 0x75, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, + 0x6d, 0x65, 0x2c, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, + 0x6f, 0x6e, 0x22, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x64, 0x69, + 0x70, 0x6c, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x20, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x65, + 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x6d, + 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x22, 0x3e, 0x3c, 0x69, 0x6d, 0x67, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x69, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x65, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x6f, 0x66, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x26, 0x61, 0x6d, 0x70, + 0x3b, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6e, 0x62, + 0x73, 0x70, 0x3b, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x65, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x71, 0x75, 0x69, + 0x74, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x64, 0x69, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, + 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x77, 0x69, 0x64, 0x65, 0x6c, 0x79, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x77, 0x61, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76, + 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, + 0x73, 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x28, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x64, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, + 0x20, 0x2f, 0x3e, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6d, 0x6f, + 0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6c, 0x79, 0x20, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x74, 0x68, + 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x70, 0x65, 0x72, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x72, 0x65, 0x73, + 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x20, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x65, 0x63, 0x6f, 0x6e, + 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x66, 0x6f, 0x72, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, + 0x6c, 0x20, 0x6f, 0x63, 0x63, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x75, 0x67, 0x75, 0xc3, 0xaa, 0x73, 0x20, 0x28, 0x45, 0x75, 0x72, + 0x6f, 0x70, 0x65, 0x75, 0x29, 0xd0, 0xa3, 0xd0, 0xba, 0xd1, 0x80, 0xd0, 0xb0, + 0xd1, 0x97, 0xd0, 0xbd, 0xd1, 0x81, 0xd1, 0x8c, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, + 0x83, 0xd0, 0xba, 0xd1, 0x80, 0xd0, 0xb0, 0xd1, 0x97, 0xd0, 0xbd, 0xd1, 0x81, + 0xd1, 0x8c, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xa0, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, + 0x81, 0xd0, 0xb8, 0xd0, 0xb9, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb9, + 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, + 0xb0, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x84, + 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, + 0xb8, 0xd1, 0x83, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbb, + 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, + 0xbe, 0xd0, 0xb1, 0xd1, 0x85, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb8, 0xd0, 0xbc, + 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, + 0xbc, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0x98, 0xd0, 0xbd, + 0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, + 0xb8, 0xd1, 0x8f, 0xd0, 0xa0, 0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xbf, 0xd1, 0x83, + 0xd0, 0xb1, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, + 0xbe, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x87, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82, + 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x84, 0xd0, 0xbe, 0xd1, + 0x80, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd1, 0x8e, 0xd1, 0x82, + 0xd0, 0xb5, 0xd1, 0x80, 0xd1, 0x80, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, + 0x80, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xb4, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82, + 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x87, 0xd0, 0xbd, 0xd0, 0xbe, 0xd8, + 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xaa, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xac, + 0xd8, 0xaf, 0xd9, 0x88, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, + 0xb4, 0xd8, 0xaa, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, + 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x82, 0xd8, 0xaa, 0xd8, 0xb1, 0xd8, + 0xa7, 0xd8, 0xad, 0xd8, 0xa7, 0xd8, 0xaa, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x55, 0x54, 0x46, 0x2d, 0x38, + 0x22, 0x20, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2f, + 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x3c, 0x69, 0x6d, 0x67, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x22, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x3d, 0x22, 0x6f, 0x66, 0x66, 0x22, + 0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, + 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x63, 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x3c, + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x61, + 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x22, 0x20, 0x0d, 0x0a, 0x3c, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2f, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, + 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, + 0x28, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x29, 0x2e, 0x67, 0x65, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x7d, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, + 0x31, 0x22, 0x20, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x52, + 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x6f, 0x66, 0x20, 0x20, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, + 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, + 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x75, 0x6e, 0x64, 0x65, + 0x72, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, + 0x69, 0x76, 0x3e, 0x0a, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x23, 0x76, 0x69, 0x65, 0x77, 0x70, + 0x6f, 0x72, 0x74, 0x7b, 0x6d, 0x69, 0x6e, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, + 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20, + 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x3c, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x3c, 0x21, 0x44, 0x4f, 0x43, + 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x21, + 0x2d, 0x2d, 0x5b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x41, 0x69, 0x72, 0x70, 0x6f, 0x72, 0x74, 0x3e, 0x0a, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0xe0, 0xb8, 0xa0, 0xe0, 0xb8, 0xb2, 0xe0, 0xb8, 0xa9, 0xe0, 0xb8, 0xb2, + 0xe0, 0xb9, 0x84, 0xe0, 0xb8, 0x97, 0xe0, 0xb8, 0xa2, 0xe1, 0x83, 0xa5, 0xe1, + 0x83, 0x90, 0xe1, 0x83, 0xa0, 0xe1, 0x83, 0x97, 0xe1, 0x83, 0xa3, 0xe1, 0x83, + 0x9a, 0xe1, 0x83, 0x98, 0xe6, 0xad, 0xa3, 0xe9, 0xab, 0x94, 0xe4, 0xb8, 0xad, + 0xe6, 0x96, 0x87, 0x20, 0x28, 0xe7, 0xb9, 0x81, 0xe9, 0xab, 0x94, 0x29, 0xe0, + 0xa4, 0xa8, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8b, 0xe0, + 0xa4, 0xa1, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb7, 0xe0, 0xa5, + 0x87, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x9c, + 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, + 0xac, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, + 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, + 0x8d, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb8, 0xe0, + 0xa5, 0x8d, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, + 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0x97, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xbf, 0xe0, + 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa0, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, + 0x82, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0x9e, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x85, 0xe0, + 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, + 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xad, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0x97, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, + 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x95, 0xe0, + 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, + 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, + 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0x9a, 0xe0, + 0xa4, 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xb0, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xa8, + 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, + 0xa4, 0xaa, 0xe0, 0xa4, 0xa3, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, + 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, + 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, + 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, + 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, + 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xab, 0xe0, 0xa4, 0xbc, 0xe0, 0xa5, 0x8d, + 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa8, 0xe0, + 0xa4, 0xbf, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, + 0xbe, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xae, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa1, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x3c, 0x6d, 0x65, 0x74, + 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, + 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x3a, 0x75, 0x72, 0x6c, 0x22, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, + 0x2f, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, + 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x3d, 0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x20, + 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, + 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, + 0x22, 0x20, 0x2f, 0x3e, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, + 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, + 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x22, 0x31, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x31, + 0x22, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x22, 0x3e, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x74, 0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 0x2f, 0x44, 0x54, 0x44, + 0x20, 0x58, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x65, 0x6c, + 0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, + 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3d, 0x22, 0x2f, 0x61, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, + 0x73, 0x70, 0x61, 0x6e, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x0a, + 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x3d, 0x22, 0x4a, 0x61, 0x76, 0x61, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x22, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, + 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61, + 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x3d, 0x22, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x27, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x27, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, + 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3d, 0x22, 0x31, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, + 0x22, 0x20, 0x3d, 0x27, 0x2b, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52, + 0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x3c, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x61, 0x6c, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x74, 0x65, 0x22, 0x20, 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x2c, + 0x20, 0x74, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x3e, 0x0a, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, + 0x77, 0x77, 0x77, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, + 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, + 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x22, 0x3e, 0x61, 0x72, 0x69, 0x61, 0x2d, 0x68, 0x69, 0x64, + 0x64, 0x65, 0x6e, 0x3d, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x3e, 0xc2, 0xb7, + 0x3c, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x6c, 0x3d, 0x30, + 0x3b, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0a, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, + 0x75, 0x6e, 0x64, 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x75, 0x72, + 0x6c, 0x28, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, + 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x09, 0x09, + 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x20, + 0x61, 0x72, 0x69, 0x61, 0x2d, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3d, 0x22, + 0x74, 0x72, 0x75, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6c, + 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x2f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x3e, 0x0a, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, + 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x20, 0x61, 0x72, 0x69, 0x61, 0x2d, 0x68, + 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x3d, 0x28, 0x6e, + 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x28, 0x29, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xc3, + 0xaa, 0x73, 0x20, 0x28, 0x64, 0x6f, 0x20, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, + 0x29, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xb3, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, + 0xd0, 0xb7, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xb2, 0xd0, + 0xbe, 0xd0, 0xb7, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, 0xbe, + 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x80, 0xd0, + 0xb0, 0xd0, 0xb7, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, + 0xd1, 0x8f, 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, + 0x82, 0xd1, 0x80, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xb2, + 0xd0, 0xbe, 0xd0, 0xb7, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, + 0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x8f, + 0xd0, 0xb7, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0, + 0xbd, 0xd0, 0xb0, 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x22, + 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x3c, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, + 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 0x4e, 0x22, 0x20, 0x22, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x78, 0x6d, 0x6c, + 0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 0x2f, 0x44, 0x54, 0x44, 0x20, + 0x58, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x54, 0x44, 0x54, + 0x44, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x31, 0x2d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x78, 0x68, + 0x74, 0x6d, 0x6c, 0x31, 0x2f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x27, 0x3b, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x3c, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x68, 0x69, 0x64, 0x64, + 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6a, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, + 0x63, 0x72, 0x69, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x29, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x55, 0x41, 0x2d, 0x43, 0x6f, 0x6d, + 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3d, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, + 0x0a, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x3c, 0x6c, + 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x3c, 0x2f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, + 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, + 0x63, 0x72, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, + 0x22, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x78, 0x6d, 0x6c, 0x6e, + 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, + 0x2f, 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x34, 0x2e, + 0x30, 0x31, 0x20, 0x54, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67, + 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x27, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27, + 0x29, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x3c, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, + 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x22, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x79, 0x49, 0x64, 0x28, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x28, 0x27, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x27, 0x74, 0x65, + 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64, + 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, + 0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x73, 0x6e, 0x69, 0x63, + 0x61, 0x6c, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x43, 0x2f, 0x2f, 0x44, 0x54, + 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, + 0x73, 0x22, 0x3e, 0x0a, 0x0a, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, + 0x22, 0x3e, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x64, 0x74, 0x64, 0x22, 0x3e, + 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3d, + 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x64, 0x69, + 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, + 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x68, 0x74, 0x6d, 0x6c, + 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, + 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x22, 0x3e, 0x3c, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x27, 0x74, 0x65, 0x78, + 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27, + 0x3e, 0xd0, 0xb4, 0xd0, 0xb5, 0xd1, 0x8f, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbb, + 0xd1, 0x8c, 0xd0, 0xbd, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, + 0x81, 0xd0, 0xbe, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x82, + 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xbf, 0xd1, + 0x80, 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xb7, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb4, + 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xb5, 0xd0, + 0xb7, 0xd0, 0xbe, 0xd0, 0xbf, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbd, 0xd0, 0xbe, + 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x81, 0xe0, + 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, + 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, + 0xe0, 0xa4, 0x97, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, + 0xa4, 0xb8, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, + 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0xa8, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0xab, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb8, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb8, 0xe0, + 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, + 0xb7, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x89, + 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, + 0xa4, 0x87, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, + 0x9c, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9e, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, + 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, + 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, + 0x88, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, + 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, +}; + +static const int kBrotliDictionaryOffsetsByLength[] = { + 0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032, + 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536, + 115968, 118528, 119872, 121280, 122016, +}; + +static const int kBrotliDictionarySizeBitsByLength[] = { + 0, 0, 0, 0, 10, 10, 11, 11, 10, 10, + 10, 10, 10, 9, 9, 8, 7, 7, 8, 7, + 7, 6, 6, 5, 5, +}; + +static const int kMinDictionaryWordLength = 4; +static const int kMaxDictionaryWordLength = 24; + +#endif // BROTLI_ENC_DICTIONARY_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/dictionary_hash.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/dictionary_hash.h new file mode 100644 index 0000000..9c1200e --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/dictionary_hash.h @@ -0,0 +1,4125 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Hash table on the 4-byte prefixes of static dictionary words. + +#ifndef BROTLI_ENC_DICTIONARY_HASH_H_ +#define BROTLI_ENC_DICTIONARY_HASH_H_ + +#include + +namespace brotli { + +static const uint16_t kStaticDictionaryHash[] = { + 0x7d48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5564, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9e26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x114b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1364, 0x1aac, 0x1ea4, 0x0000, 0x4e04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x46a9, 0x4b65, 0x0000, 0x0000, + 0x0000, 0x3d84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6867, 0x08cd, 0x0000, 0x0000, 0x4364, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e26, + 0x0000, 0x0000, 0x0000, 0x0000, 0x59c8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xbc26, 0x0000, 0x85c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xbd66, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x09cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4c4c, 0x0000, 0x0000, 0x5dc4, + 0x0000, 0x0000, 0x0000, 0x2664, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7885, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ce6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50aa, 0x0964, + 0x0000, 0x5125, 0x3968, 0x2286, 0x0000, 0x1904, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xcaa7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1a69, 0x1c26, 0x0000, 0x0000, 0x55e8, 0x59c7, 0x0000, 0x0000, + 0x0dc9, 0x0000, 0x0748, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2b26, 0x0000, 0x0000, 0x5fe8, 0x0000, 0x0000, 0x0000, + 0x196b, 0x0000, 0x0000, 0x9046, 0x5448, 0xf3a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2066, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f67, + 0x0000, 0x0000, 0x0000, 0x99e6, 0x1fc8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x22ab, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1f05, 0x0000, 0x0000, 0x6409, 0x0000, 0x0000, 0x0000, + 0x03a8, 0x0e84, 0x0c8d, 0x3d47, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xcd27, 0x0000, 0x43e5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0528, 0x16a5, 0x0000, 0x5225, 0x0000, 0x0000, 0x1948, 0x0327, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x34e9, 0x0000, 0x0000, 0x0000, 0x0e28, 0x0000, + 0x0000, 0x0000, 0x73ea, 0x7864, 0x0000, 0x7a05, 0x0000, 0x19c4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xfa46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5706, 0x0000, 0x9246, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1c48, 0x01a7, 0x0000, 0x6024, + 0x54c9, 0x44e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0729, 0x0000, 0x0000, 0x0000, 0x0148, 0x1785, 0x0000, 0x0000, + 0x0000, 0x4e06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf2a7, 0x1052, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2f44, 0x21a9, 0x0000, 0x0000, 0x4204, 0x0000, 0x8f46, + 0x0000, 0x0000, 0x0000, 0x8a26, 0x0000, 0xca06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5206, 0x0000, 0xf286, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d05, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3925, 0x1148, 0x6547, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4d89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x78e8, 0x0be6, 0x332a, 0x32c6, 0x0000, 0x0000, 0x0000, 0x3ba4, + 0x0000, 0x9e86, 0x7608, 0xf2a6, 0x0000, 0x0000, 0x0000, 0x4ea4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ec4, 0x0000, 0x0000, + 0x0000, 0xcc86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0629, 0x0000, + 0x31cb, 0x2344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6704, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ec5, 0x0000, 0x0000, + 0x4608, 0x2507, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7e29, 0x6fc5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb846, 0x2dcb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x09e8, 0xc7e7, 0x0000, 0x0000, + 0x190a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xdbe6, 0x2e8a, 0x0000, 0x0211, 0x0000, 0x75e8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2045, 0x0000, 0x0000, 0x7088, 0xe0c6, 0x10c8, 0x03c5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf387, 0x0000, 0x0000, 0x26e8, 0x0e64, + 0x0000, 0x0645, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x410a, 0x0025, 0x0000, 0x5c46, + 0x0c48, 0x3c45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1fa8, 0x0045, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x45a8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2b69, 0x0000, 0x0000, 0x0000, 0x0000, 0x4785, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6806, + 0x0000, 0x0000, 0x63a8, 0x0184, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4205, + 0x0000, 0x0000, 0x0000, 0x6ba6, 0x0000, 0x0000, 0x24ca, 0x0000, + 0x0000, 0x0000, 0x0db4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9466, 0x2449, 0x2145, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0f29, 0x0644, 0x5d88, 0x0000, 0x0000, 0x3a44, + 0x31ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2f49, 0x0000, 0x40e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5364, + 0x2be8, 0x70c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x168c, 0x0000, 0x0000, 0x6ca4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2084, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x32e8, 0x04e4, 0x0000, 0x0000, 0x496a, 0x3fc4, + 0x3cea, 0x03a7, 0x208d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4746, 0x0000, 0x46a6, 0x0000, 0xb706, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e89, 0x0000, + 0x0000, 0x6264, 0x31ec, 0x2f86, 0x1909, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4084, 0x0000, 0x6984, 0x6eeb, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x66a8, 0x0000, 0x0000, 0x0000, + 0x2628, 0xcee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x624b, 0x0144, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7f04, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5585, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7fa6, + 0x0000, 0x0000, 0x0000, 0x0366, 0x0000, 0x0000, 0x0000, 0x3166, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x65a4, 0x3fe8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0711, 0x0000, 0x0000, 0x0000, + 0x2268, 0x2ac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x71a4, + 0x0000, 0x6f64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x55e4, 0x0000, 0x0000, 0x0000, 0xa7c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x140d, 0x0526, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6c6, + 0x6148, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xc946, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0e65, 0x0000, 0x0000, 0x0000, 0x0000, 0x274e, 0x24c4, + 0x0000, 0x0000, 0x0000, 0x7ae4, 0x164c, 0x1825, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7c46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6a08, 0xe086, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1bac, 0x0000, 0x46e8, 0x0f44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x48eb, 0x0000, 0x0000, 0x1665, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0844, 0x0000, 0x60a6, 0x0000, 0x2c07, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x046d, 0x0000, 0x1309, 0x0000, 0x0000, 0x95a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4a0a, 0x0000, 0x0000, 0x4685, 0x0000, 0x0000, + 0x0000, 0x63a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4586, 0x0000, 0x6666, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x59e8, 0x4407, 0x4fa8, 0x00a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x73e5, 0x0000, 0x9026, 0x0000, 0x0000, + 0x0000, 0x6fa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1dc5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xa206, 0x0000, 0x0000, 0x7928, 0xd826, + 0x2748, 0x0784, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f06, + 0x0000, 0x8f67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3468, 0xe7a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6785, 0x0000, 0x64c5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3649, 0x0664, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13e7, 0x0000, 0x0000, + 0x0000, 0x70c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x21c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6429, 0x4584, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3404, 0x448a, 0x1305, 0x2e2b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0388, 0x0447, + 0x0000, 0x5ea5, 0x0000, 0x0000, 0x7048, 0xc227, 0x0000, 0x5a25, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7e88, 0x0000, 0x0000, 0x0000, + 0x0000, 0x62a4, 0x0000, 0x7044, 0x16ea, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1109, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1eed, 0x22a5, 0x0000, 0x0000, 0x0000, 0x3664, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xa3e6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1a6e, 0x36a5, 0x0000, 0x0000, 0x0000, 0x2125, + 0x0000, 0x0000, 0x5dca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb86, + 0x0000, 0x57c4, 0x0000, 0x6505, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5c68, 0x14c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2ca9, 0x0ee4, 0x3e89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6526, 0x28e9, 0x0000, 0x0000, 0x3844, + 0x0000, 0x0000, 0x0000, 0x4aa6, 0x0000, 0x0000, 0x0000, 0xc846, + 0x0000, 0x0000, 0x296a, 0x5e44, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xab06, 0x0000, 0x0000, 0x45aa, 0x0000, 0x0000, 0x0000, + 0x63e8, 0x6a45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x718a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0272, 0x07c4, 0x396c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe146, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xaea6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f08, 0x1dc7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xa4c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4b48, 0x1924, 0x0000, 0x0000, + 0x1488, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4ce5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b67, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6e46, 0x0000, 0x0000, 0x0000, 0x7164, 0x292a, 0x0c85, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1604, 0x0348, 0x4f85, 0x0000, 0x0000, + 0x2128, 0x2006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5064, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fea, 0x4c46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0ee8, 0xf966, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x414c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x452a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5c6, + 0x0000, 0xc547, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6366, 0x0000, 0x0000, + 0x0000, 0x3607, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0a88, 0x0fc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x62c8, 0x0000, + 0x2f2c, 0x0806, 0x0000, 0xbf26, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4249, 0x2826, 0x21ab, 0x8a07, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7a2b, 0x0000, 0x0000, 0x0000, 0x0449, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0308, 0xd486, 0x0000, 0x0000, 0x72ca, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1608, 0x2f66, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6305, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf007, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6066, 0x0000, 0x0000, 0x0000, 0xf767, 0x0000, 0x70a4, + 0x1fce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x118e, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3708, 0x04a4, 0x0000, 0x3f84, 0x0000, 0x0000, + 0x0000, 0x5004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1ecc, 0x0000, 0x0000, 0x42a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e0c, 0x7305, + 0x0000, 0x8307, 0x0000, 0x1325, 0x0000, 0x0000, 0x30ea, 0x0000, + 0x0000, 0xf407, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0fce, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5006, 0x0000, 0x3c64, 0x08a9, 0xca07, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5bc7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3c0a, 0x0000, 0x3de9, 0x0000, 0x3b09, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d44, + 0x1ca9, 0x0000, 0x0000, 0x0000, 0x0000, 0x7686, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e2b, 0x5d84, + 0x0000, 0x4566, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1828, 0x0000, 0x3b08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b04, 0x0000, 0x0000, + 0x0000, 0x1585, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0a6d, 0xc406, 0x0000, 0x0000, 0x300b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1489, 0x2085, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2de6, 0x0f32, 0x0000, 0x0000, 0x6784, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ae5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x14e8, 0x3704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x73c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x6769, 0x0000, + 0x1848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6504, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x700b, 0x4fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc9c6, + 0x0000, 0x0000, 0x0000, 0x6b87, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x788b, 0x0cc4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7064, 0x0000, 0x4724, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6368, 0xffa6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0d09, 0x0686, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x25a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0413, 0x0000, 0x0000, 0x0000, 0x0000, 0x3dc6, 0x0000, 0x54a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f87, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7ec6, 0x0000, 0x77a6, 0x0000, 0x0000, 0x0908, 0x26c6, + 0x0000, 0x0000, 0x0000, 0x4747, 0x0000, 0x0000, 0x3828, 0x0000, + 0x0808, 0x16a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1e84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x57ca, 0xce46, 0x39ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2a49, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fe6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7005, 0x0000, 0x0000, + 0x1652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6509, 0x56e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4368, 0x8ba7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x202c, 0x0000, + 0x7d6c, 0x0000, 0x0000, 0x0000, 0x1e88, 0x19e4, 0x0000, 0x4085, + 0x0000, 0x0000, 0x780c, 0x0000, 0x1288, 0x0085, 0x0000, 0x9e87, + 0x03cb, 0x5d86, 0x0000, 0x0000, 0x43cb, 0x0000, 0x0000, 0x0000, + 0x00cc, 0x0000, 0x0000, 0x6a04, 0x48cb, 0xad27, 0x6bc8, 0x7624, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5748, 0x73a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c44, 0x7c0b, 0x0000, + 0x0000, 0x6dc6, 0x0000, 0xe6e7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2fe5, 0x0000, 0xaf86, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7b48, 0x0000, 0x5289, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4a09, 0x4787, 0x0000, 0xb067, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x080b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4bc7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x578b, 0x5d87, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0ae9, 0x0000, 0x0000, 0x0fe5, 0x0000, 0x0000, + 0x0a6c, 0x18c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6c0a, 0x2285, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ac8, 0xdb06, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8547, 0x0000, 0x5f85, + 0x0000, 0x0000, 0x0000, 0x0000, 0x556b, 0x0000, 0x44ca, 0x26a6, + 0x0000, 0x0000, 0x6d48, 0x9786, 0x0000, 0x0000, 0x0000, 0xaa86, + 0x0000, 0x7b47, 0x2faa, 0x5a66, 0x0000, 0x0000, 0x0000, 0xc4a7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc2e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x3daa, 0x1846, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3508, 0x0305, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4328, 0x01c5, 0x43ab, 0x0000, + 0x4f68, 0x0fc4, 0x0000, 0x0000, 0x0000, 0x2784, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6ba9, 0x7cc4, 0x7e28, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2ceb, 0x0804, 0x0000, 0x0000, + 0x0000, 0x0000, 0x260a, 0xc527, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8a66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7426, + 0x0000, 0x0000, 0x0000, 0x8ec7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2429, 0x15e6, 0x0000, 0x3605, 0x0000, 0x22e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6227, 0x0000, 0x0000, 0x4a6b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7465, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa566, + 0x0000, 0x0000, 0x0000, 0x0000, 0x41cb, 0x0000, 0x45e8, 0x60c5, + 0x0fed, 0x0000, 0x0000, 0x0000, 0x74cb, 0x91e7, 0x0000, 0x7867, + 0x0000, 0x2086, 0x0000, 0x0000, 0x0000, 0x47a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4889, 0x2484, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9186, 0x0000, 0x0000, 0x7ac9, 0xf046, 0x0000, 0x07e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6325, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0865, 0x62c9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30e4, + 0x3769, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x21e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e86, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2a89, 0x1fa4, 0x0000, 0x7027, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6f4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x6645, 0x6288, 0x7304, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3a84, 0x0000, 0x1e67, 0x0000, 0x6cc6, 0x0000, 0x0000, + 0x0000, 0xdca6, 0x6aaa, 0x0000, 0x0000, 0x0000, 0x168a, 0x4ba4, + 0x0000, 0x66c5, 0x728b, 0x4f44, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7046, 0x0000, 0x0000, + 0x0000, 0x0000, 0x38c8, 0x0486, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x64c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa5c6, 0x0000, 0x0d04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xa666, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x43c9, 0x05a7, + 0x0000, 0x0000, 0x20eb, 0xbd86, 0x124e, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3a8a, 0x0000, 0x7da8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x240e, 0x0ae7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0809, 0x7b87, 0x10ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x11a7, 0x0000, 0x0000, 0x6d08, 0xe646, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9, 0x4d64, + 0x0000, 0x0000, 0x0000, 0x0000, 0x17a8, 0x1ec5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x54c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23a8, 0x0465, + 0x0000, 0x40a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x438c, 0x1ac6, 0x5368, 0x0000, + 0x094c, 0x0000, 0x0000, 0x0fa7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5f25, 0x106a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x29a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa747, 0x0bce, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3825, 0x0000, 0x50c5, 0x0ce8, 0x0ac7, + 0x502a, 0xfd87, 0x0000, 0x0000, 0x0000, 0x0026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6ca6, 0x0af2, 0x22a6, 0x2f88, 0x1766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x754b, 0x6224, + 0x0000, 0x0000, 0x0000, 0x0000, 0x45c8, 0x3a07, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6da8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc906, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2a6, + 0x0000, 0x0000, 0x5bab, 0x7e47, 0x0000, 0x0000, 0x2e29, 0xcf07, + 0x0000, 0x0000, 0x0000, 0x81c6, 0x7a68, 0xfb46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7da6, 0x0000, 0x0000, + 0x0f33, 0x0000, 0x0000, 0x0000, 0x1b69, 0x0285, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6acb, 0xb407, 0x0000, 0x0000, + 0x0000, 0x3d45, 0x0000, 0x85c6, 0x0000, 0x0000, 0x414b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x36e4, 0x53a8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fc6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5386, 0x0000, 0x0000, 0x4468, 0x1d24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3c44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6ec4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6365, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e67, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4dc7, 0x0000, 0x4e27, + 0x0000, 0x0000, 0x0000, 0x1964, 0x03af, 0x0000, 0x0000, 0x2a45, + 0x0000, 0x0000, 0x0000, 0x0000, 0x104a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54cb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xff87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2689, 0x6046, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9e47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3204, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x564b, 0x5c67, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7bc6, 0x0000, 0x0000, + 0x0000, 0x6106, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4ca4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f65, 0x0000, 0x6dc4, + 0x0000, 0x0000, 0x0000, 0x7a24, 0x0000, 0x0c84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4deb, 0x2d45, 0x0000, 0x0000, + 0x2508, 0x39e5, 0x112e, 0x0000, 0x0000, 0x38c4, 0x0000, 0x0000, + 0x0000, 0xbee7, 0x0751, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4aa8, 0x0605, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5b25, 0x0000, 0x0000, 0x0000, 0x3745, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0510, 0x3826, 0x0000, 0x6aa4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1c6c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xba66, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x142c, 0x06e5, + 0x0000, 0x3845, 0x0000, 0x92c6, 0x07ca, 0x0000, 0x19ec, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ca7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0a08, 0x1aa4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2c48, 0x2fa7, 0x0000, 0x0000, 0x5d68, 0x0000, 0x0000, 0x0000, + 0x7748, 0x0000, 0x0000, 0x8626, 0x0000, 0x4587, 0x0000, 0x0000, + 0x0000, 0x5685, 0x0000, 0x17e6, 0x0000, 0x6484, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67e8, 0x5844, + 0x0000, 0x0000, 0x354a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9a67, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9a46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0c0d, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x12b2, 0x0000, 0x0000, 0x0000, + 0x70c9, 0x1984, 0x0000, 0x0000, 0x6828, 0x0000, 0x23e9, 0x2dc7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7c08, 0xfc86, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2c85, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6206, 0x0000, 0x0000, 0x46e9, 0x4ec7, + 0x0000, 0x0000, 0x0000, 0x4366, 0x0000, 0x0000, 0x036e, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5e66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x65cb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7b68, 0x0000, 0x0000, 0x1d64, + 0x5f2a, 0x1844, 0x0000, 0x87c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7f08, 0x0000, 0x0000, 0xae87, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4645, 0x21e9, 0x17e5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x57aa, 0x3ac4, 0x05ac, 0x3b67, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5926, + 0x0000, 0x28e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4b89, 0x4506, 0x006b, 0x1be4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3908, 0x0a05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xfc06, 0x00c8, 0x38a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x79e8, 0x0000, 0x782a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7289, 0xec66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ba8, 0x0ca5, + 0x6369, 0x26c4, 0x0000, 0x0000, 0x0000, 0x4965, 0x7ae8, 0xf2c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x50a6, 0x0000, 0x0000, 0x0000, 0x6a66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e44, 0x1188, 0x1b27, + 0x0000, 0x0000, 0x0000, 0xb506, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7125, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5068, 0x3904, 0x0000, 0x6306, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0716, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda87, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4365, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0b71, 0x0000, 0x0000, 0xc3a6, 0x0000, 0x0b66, + 0x630c, 0x7564, 0x14c8, 0x0204, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0bf0, 0x0000, 0x0000, 0x0000, 0x0000, 0x44e7, 0x446a, 0x7ce4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6e86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x53e7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f04, 0x2e0a, 0x12a4, + 0x0000, 0x0000, 0x0d28, 0x1344, 0x0000, 0x7ae7, 0x0000, 0x0000, + 0x3949, 0x03e4, 0x0000, 0x5066, 0x0000, 0x0000, 0x0000, 0x2704, + 0x0000, 0x5c85, 0x0000, 0x0000, 0x0000, 0xcd47, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6885, 0x088a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6c6b, 0x0a24, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5148, 0x7d24, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8f86, 0x0000, 0x60e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7948, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x532a, 0x08e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x676b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3be4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0c68, 0x4be7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf506, 0x0000, 0x0000, 0x0000, 0x6324, + 0x0000, 0x0000, 0x6ceb, 0x0524, 0x0000, 0x0000, 0x292b, 0x0bc7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1a29, 0x0000, 0x0000, 0xbb26, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0c45, 0x0000, 0x0000, 0x0000, 0x39e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x246e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b05, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x16c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x19a9, 0x0544, 0x0000, 0x6426, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4f64, 0x0000, 0x0000, 0x42ab, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2204, 0x0000, 0xa046, + 0x0000, 0x0000, 0x0000, 0x6725, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ca7, 0x6de9, 0x3a66, + 0x0000, 0x27a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7386, 0x0000, 0x0000, 0x0000, 0x0000, 0x6988, 0xe066, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2669, 0x7604, 0x056b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xe387, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x41a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0dc6, + 0x0000, 0x3da5, 0x0000, 0x15c4, 0x3428, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x48e9, 0x5ba7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x020a, 0x0404, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3ba8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2685, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2528, 0x0fc5, 0x0000, 0x0000, 0x2d2b, 0xc1e7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ce8, 0x7644, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x15e4, 0x0000, 0x55a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63a5, + 0x0000, 0x5d26, 0x0000, 0x46a5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x364a, 0x1f84, 0x6749, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x62e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x3faa, 0x1ce5, + 0x22a9, 0x4b27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0570, 0xc6e7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd267, 0x0000, 0x0000, 0x0000, 0x0000, 0x2428, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8c07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4589, 0x31e4, 0x0000, 0x31c4, + 0x0000, 0x0000, 0x0000, 0x80c7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x150d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79a7, 0x0000, 0x5044, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc9e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3369, 0x4a47, 0x0000, 0x88a7, 0x0000, 0x54e4, + 0x7228, 0x0000, 0x0000, 0x0000, 0x0000, 0xba86, 0x4388, 0xabc7, + 0x5949, 0xb9c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x6728, 0xbce6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7706, 0x0000, 0x0000, + 0x5c08, 0x11e5, 0x0000, 0x5784, 0x0000, 0xc086, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc2a7, 0x0000, 0x0000, 0x0000, 0x6b85, 0x4ba9, 0x34c6, + 0x0000, 0x0000, 0x64eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1069, 0x4065, 0x0000, 0x50c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0ea9, 0x3184, 0x1448, 0x0f26, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2caa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1da5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xdf07, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5924, + 0x2b8a, 0xc006, 0x0000, 0x4166, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3645, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2dca, 0x4767, 0x4029, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4884, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6d29, 0x0000, 0x0000, 0x0000, 0x0000, 0x1567, + 0x0000, 0x4e26, 0x44c8, 0x0d67, 0x498b, 0x75e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6005, 0x0ceb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63e4, 0x0000, 0x0000, + 0x0000, 0x6fc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xd127, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8386, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2206, + 0x0000, 0x3724, 0x0000, 0x0000, 0x3c0b, 0x0124, 0x0000, 0x0000, + 0x0000, 0x93c7, 0x0000, 0xa846, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5548, 0x0000, 0x0000, 0x7d86, + 0x030f, 0x0000, 0x0000, 0x7906, 0x0000, 0x0000, 0x0000, 0x0044, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6029, 0x0000, + 0x0000, 0x0000, 0x4849, 0x3b47, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0e2e, 0x4245, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4585, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0208, 0xa4a6, 0x0000, 0x0000, 0x0c32, 0x0000, 0x0000, 0x0000, + 0x57ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6f86, 0x0000, 0x0000, 0x0000, 0xc466, 0x0000, 0x0000, + 0x3549, 0x1746, 0x0000, 0x89a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7529, 0x4924, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x44c9, 0x0ba4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5da9, 0x0000, 0x1449, 0x0000, + 0x0000, 0x2fa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5f46, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4e89, 0x6b24, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72eb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4f2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x2987, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xba27, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6804, 0x31c8, 0x0000, 0x50a8, 0x0000, 0x0000, 0x0000, + 0x62e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0286, 0x0000, 0x6404, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf926, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6028, 0x0000, 0x0000, 0x0000, 0x244b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb246, + 0x0000, 0x0000, 0x0000, 0x0000, 0x078b, 0x0000, 0x0000, 0x0000, + 0x5029, 0xea47, 0x0000, 0x5086, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xdba7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7527, 0x0000, 0xce87, 0x0000, 0x51c6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41e7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4864, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb9c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa826, 0x0000, 0x0000, + 0x0b72, 0x0000, 0x3288, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79a5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10e6, + 0x0000, 0x44a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7a08, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x02b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0670, 0x0000, 0x0000, 0x0000, 0x0000, 0x2747, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0092, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2348, 0x2326, 0x0000, 0x88a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xde07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbf06, + 0x0000, 0x3464, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0989, 0x1144, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4fcc, 0x03a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb147, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5c6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2feb, 0x0224, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6bc5, 0x0000, 0x0000, 0x764a, 0x4a06, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x08c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6589, 0x0000, 0x0000, 0x0000, + 0x1d2a, 0x0000, 0x0000, 0x7b86, 0x0000, 0x3746, 0x0000, 0x0000, + 0x0000, 0x7007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3c68, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0ef3, 0x0000, 0x0000, 0x0000, + 0x08ab, 0x0000, 0x26a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1249, 0x4c07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6004, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x40c4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5628, 0x0000, + 0x0000, 0x0000, 0x0628, 0x0244, 0x7f8c, 0x0000, 0x0000, 0x7ca4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5246, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x746a, 0xe466, 0x0000, 0x7e45, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a0a, 0x0ae5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2164, + 0x0000, 0x0000, 0x0000, 0x57e5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3e09, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c27, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1f2a, 0x4624, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5f04, 0x0000, 0x0000, 0x1349, 0x0000, + 0x0000, 0x0000, 0x1fe8, 0x0000, 0x346c, 0x2864, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2e04, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4148, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x44e8, 0x4647, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0b89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x64c8, 0x41a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x77cb, 0x0000, 0x0000, 0x4a45, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00cd, 0x3be6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07b1, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6688, 0xcd26, + 0x0000, 0xc286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x25c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1286, + 0x0000, 0x0000, 0x5489, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x164b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x11c9, 0x30a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b68, 0x0106, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0e09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d66, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda47, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0307, 0x0000, 0xa906, 0x13ca, 0xbf47, + 0x0000, 0x0000, 0x4c49, 0x3ee4, 0x12aa, 0xaf26, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf347, 0x52e8, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc8e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6e4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3425, 0x0000, 0x0000, + 0x0000, 0x3104, 0x4f29, 0x3625, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0249, 0x1d46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5508, 0x1187, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f2b, 0x00a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9806, 0x0000, 0x7865, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3fa8, 0x1687, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7d44, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7464, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4ccb, 0x75e7, 0x0000, 0xe5a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2309, 0x0000, 0x0000, 0x0000, 0x02d6, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1749, 0x0b44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5cc4, + 0x0000, 0x0000, 0x2929, 0x12e7, 0x6aa8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7326, 0x0000, 0x0000, 0x40a8, 0x6827, 0x0000, 0x3f44, + 0x0000, 0x0000, 0x3688, 0x1f67, 0x4908, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5609, 0x1ac4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1872, 0xdde6, 0x4048, 0x30a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ce4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x248b, 0x0000, 0x0000, 0x0000, + 0x1c69, 0xa067, 0x60cc, 0x7724, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x06a8, 0x0a25, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7229, 0xeec6, + 0x0000, 0x0000, 0x0000, 0xe447, 0x3d4b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9146, 0x0ac8, 0x03c7, + 0x0000, 0x0000, 0x0000, 0x5a26, 0x68ea, 0x0000, 0x0000, 0x0000, + 0x4d29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1528, 0x3586, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xce06, 0x4faa, 0x96a7, 0x0000, 0x0000, 0x0000, 0xc787, + 0x0000, 0x0000, 0x0088, 0x2144, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6bc4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0213, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x22e8, 0x13a7, 0x30e8, 0x4b86, + 0x0000, 0x0000, 0x592b, 0x7627, 0x6daa, 0x79a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6b69, 0x46e4, 0x4e88, 0xe6c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5f45, 0x0000, 0x0000, 0x620a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2545, 0x0000, 0x0000, 0x5fe9, 0x4f27, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6364, 0x0000, 0x0000, + 0x25ab, 0x0000, 0x0000, 0xf647, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a86, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x508c, 0x2e27, 0x01f3, 0x0000, + 0x1408, 0x08e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5bea, 0x9ce6, 0x0988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x692a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6886, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xcac7, 0x0000, 0x0000, 0x5bec, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc826, 0x6489, 0xadc6, 0x314e, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0c06, 0x0000, 0x5164, 0x0000, 0x0000, + 0x0468, 0x5607, 0x0000, 0x0000, 0x0000, 0x5366, 0x0000, 0x4024, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5804, 0x0000, 0xbe86, + 0x0000, 0x86c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5a04, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x35e5, 0x0000, 0x9587, 0x0000, 0x0000, 0x06ca, 0x0000, + 0x01e9, 0x3a05, 0x0000, 0xb146, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7166, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x184c, 0xdce6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6905, 0x0000, 0x7086, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb386, 0x0000, 0x0000, 0x0000, 0x0000, 0x5049, 0x5466, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2228, 0x0884, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x67cb, 0x0be4, 0x0000, 0x0000, 0x028d, 0x5b67, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6a4a, 0x0000, 0x0000, 0x52c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ba4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ce6, 0x510a, 0x6c05, + 0x0000, 0x7405, 0x0b4b, 0x0000, 0x2988, 0x0000, 0x0000, 0x0000, + 0x0000, 0x83e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7b4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0588, 0x0987, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x258b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2a8a, 0x40c5, 0x67e9, 0x8a86, 0x0000, 0x0000, + 0x0000, 0x6884, 0x0000, 0xe787, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6948, 0x77a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1eca, 0x0000, 0x0000, 0x0000, 0x4c48, 0x74c4, 0x0000, 0x0000, + 0x0c08, 0x0000, 0x0000, 0x0000, 0x1e08, 0x51c7, 0x01a9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30e7, + 0x0000, 0x3266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x096b, 0x0000, 0x2dcd, 0x65e6, + 0x0000, 0x0000, 0x4ee9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2b25, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7707, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5425, + 0x6a49, 0x52c6, 0x0000, 0x23e4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5a8a, 0x6e84, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x12ea, 0x0000, 0x3568, 0x0000, + 0x0000, 0x2fc6, 0x0000, 0x0000, 0x0000, 0x2924, 0x0000, 0x0000, + 0x22e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7144, 0x0000, 0x0000, 0x2dc8, 0x6966, + 0x0000, 0xb466, 0x0000, 0xab87, 0x7c0a, 0x0000, 0x0488, 0x0f64, + 0x0000, 0x5124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fe5, + 0x0000, 0x7f46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2224, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0906, 0x3c6a, 0x0000, 0x0000, 0xa827, + 0x0000, 0x0000, 0x0000, 0x49a5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf886, 0x0000, 0x0000, + 0x1b88, 0x0ea5, 0x0000, 0x0000, 0x0000, 0x55c5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5faa, 0x1887, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2fa5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb586, + 0x0000, 0x0000, 0x2de8, 0x4d07, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x23c8, 0x0f06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8f47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c04, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1804, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x74e6, 0x0000, 0x8346, 0x0000, 0x1264, 0x184b, 0x0000, + 0x0000, 0x2a66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74c5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1a6d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2aa8, 0x1bc7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x24a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4fa4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90e6, 0x0000, 0x0000, + 0x0000, 0x69e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5569, 0x0000, 0x6c69, 0x7606, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xe227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3168, 0x1546, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4d48, 0x42e4, 0x0000, 0xcb27, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x02f6, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6144, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05c4, 0x0000, 0x6565, + 0x0000, 0x0000, 0x32e9, 0xb647, 0x0000, 0x7547, 0x5888, 0x0446, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3728, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f27, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x39c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a8, 0x0000, + 0x0000, 0x0925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5484, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3e48, 0x5aa7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x02ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x60a7, 0x0000, 0x0000, + 0x0000, 0x1484, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7509, 0x48e4, 0x526b, 0xb6c7, 0x0000, 0x1b85, + 0x0000, 0x0000, 0x0000, 0x0000, 0x646b, 0x0000, 0x0000, 0x4404, + 0x0c50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x16ab, 0x1605, 0x0000, 0x9507, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0355, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7607, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6ae6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4ca8, 0x10e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5e09, 0x1cc6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0888, 0x1445, + 0x0000, 0x51c4, 0x0609, 0x1384, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e04, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x18a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x77c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4bc4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5488, 0xf747, + 0x0000, 0x0000, 0x0ccb, 0x7987, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2d24, 0x0000, 0x39a4, 0x0000, 0x0000, + 0x0000, 0x3b04, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5d6a, 0x7126, 0x0000, 0x0000, 0x0000, 0x1365, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x27e8, 0x3b65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6a06, 0x0000, 0x0000, 0x68c9, 0x4ee6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7605, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1204, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e2e, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4569, 0x1ee6, + 0x0000, 0x0000, 0x7c88, 0x0000, 0x0000, 0x17a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x230a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x41c8, 0x5d47, 0x0000, 0x0000, + 0x2b2b, 0x0000, 0x0000, 0x0000, 0x7f28, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x516a, 0x3585, 0x0000, 0x0000, + 0x0000, 0x9147, 0x1ccd, 0x28e7, 0x444a, 0x6304, 0x0000, 0x0000, + 0x0000, 0x9666, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5405, 0x17aa, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0c65, 0x0000, 0x0000, 0x0000, 0x83a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4568, 0x31a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x31cc, 0x3ca4, 0x0000, 0x2dc6, 0x0000, 0x0000, 0x626a, 0x0000, + 0x0000, 0x0000, 0x2349, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x13a4, 0x0000, 0x75a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xa707, 0x0000, 0x0000, 0x0e88, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6266, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x154a, 0x1405, + 0x0000, 0xe2e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5624, 0x0000, 0x0000, 0x0000, 0x0000, 0x6689, 0x0000, + 0x3e4b, 0x0d84, 0x0000, 0x0000, 0x0000, 0x8be6, 0x0000, 0x0000, + 0x0000, 0x1e85, 0x4c2c, 0x7da7, 0x0000, 0x3384, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6fe4, 0x0000, 0x0000, 0x0000, 0xed47, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4344, 0x4e08, 0x24c6, 0x25aa, 0x0000, + 0x0000, 0x0000, 0x2549, 0x0000, 0x0000, 0x5ea4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9de6, 0x0000, 0x6684, 0x0000, 0x5a45, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7be4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0f8b, 0xea67, 0x0000, 0x0000, 0x0000, 0x2885, 0x0000, 0x0000, + 0x0000, 0xa886, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x71e6, 0x0000, 0x7744, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2928, 0x0000, 0x0000, 0x0000, 0x0000, 0x40a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6604, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5929, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0429, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4b68, 0x12c5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5d85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0d8c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3487, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xde27, 0x0000, 0x0000, + 0x06f0, 0x3da4, 0x0000, 0x0000, 0x0a2b, 0x0000, 0x2828, 0x7a86, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d48, 0x4706, + 0x0000, 0x0944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4e24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2288, 0x0206, 0x0000, 0x0000, 0x07a8, 0x0024, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x18e8, 0x24e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0669, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1a6c, 0x26a5, 0x09a8, 0x0fa5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x62aa, 0x15a5, 0x0000, 0x36e5, 0x148b, 0x5107, 0x0000, 0x0000, + 0x0dec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2ec9, 0x0104, 0x0000, 0x8967, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x47e5, 0x0000, 0x0000, 0x0000, 0x40c6, + 0x0000, 0x0000, 0x0000, 0x57c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0ae8, 0x0000, 0x0000, 0x0000, 0x36ca, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5209, 0x08a4, 0x0000, 0x0000, 0x0000, 0xe147, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3e6b, 0x0000, 0x0000, 0x0000, + 0x0aea, 0x3b87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6904, 0x236e, 0x0000, 0x0000, 0x0000, 0x0000, 0xca86, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d68, 0x6b65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b05, + 0x286e, 0x0ea4, 0x0000, 0x0000, 0x0000, 0x0000, 0x3aeb, 0x5a44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3baa, 0x4044, 0x0000, 0xddc6, + 0x0000, 0x0000, 0x0b09, 0x0000, 0x36c9, 0x0185, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2369, 0x2d46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4fe8, 0x2044, + 0x0000, 0x0000, 0x61c8, 0x5525, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7eab, 0x5304, + 0x0000, 0x75c6, 0x0000, 0xa8a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2c8b, 0x0000, 0x0000, 0x0405, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1aec, 0x2424, 0x0000, 0xf6e6, 0x0da8, 0x3846, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5828, 0x0000, 0x0000, 0x5305, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ac7, 0x0000, 0x0000, + 0x27cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74c9, 0xea06, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ce9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1cac, 0x6127, 0x0000, 0x0346, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x51c9, 0x33c4, 0x0000, 0x0227, 0x0000, 0x0000, 0x0000, 0xa8c7, + 0x0000, 0x7767, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6eea, 0x7804, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3589, 0x1b24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x72e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x3eca, 0x2306, + 0x380b, 0x05a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x6128, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3344, 0x0000, 0x8ac7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x33cb, 0x2aa5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6267, 0x0000, 0x0000, 0x0000, 0x3684, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc667, 0x4ca9, 0x2f26, + 0x0c0b, 0x0000, 0x0000, 0x0000, 0x0000, 0x3864, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5506, 0x0000, 0x3c67, 0x728a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7526, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0a53, 0x0000, 0x0000, 0x52e7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x87e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3ee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x73a8, 0x0e24, 0x0d0a, 0x2884, 0x0000, 0x3987, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74e4, 0x2a68, 0x21a5, + 0x3ca9, 0xd626, 0x76aa, 0x34e4, 0x0000, 0x7087, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc46, 0x47cc, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7886, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1aae, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7fc6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x11ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfda7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4168, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4e25, 0x0000, 0x0000, 0x3528, 0x04a7, + 0x0000, 0x0000, 0x0000, 0xf2e7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5fa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x44eb, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1504, 0x0000, 0x0000, 0x7e48, 0x0000, 0x0000, 0xf946, + 0x0000, 0x0000, 0x0000, 0x0b67, 0x0000, 0x0000, 0x0000, 0x0000, + 0x428a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb87, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1e0a, 0x01e6, 0x0000, 0x0000, 0x0000, 0x9966, 0x0000, 0xbfc6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x310b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x51e7, 0x4649, 0x1224, 0x0000, 0x0000, + 0x0000, 0x3ea4, 0x7f68, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fa6, + 0x216b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8966, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x768a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3d89, 0x0e44, 0x0000, 0x0000, + 0x22eb, 0x09a4, 0x0000, 0xd6a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0a48, 0x6087, 0x0000, 0x5a87, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8da6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7c2a, 0x6926, 0x0000, 0x7fa4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x29e8, 0x2ea7, + 0x04b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x4684, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4026, 0x0000, 0x0000, 0x0000, 0x6724, + 0x0000, 0x0000, 0x7069, 0x0000, 0x0000, 0x6146, 0x0000, 0x0000, + 0x2fcc, 0xb127, 0x0000, 0x8b87, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0e4a, 0x4426, 0x0000, 0x00a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57a6, 0x0000, 0x0000, + 0x5f68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5e6a, 0x5ee5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2e47, 0x0000, 0x9aa7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x254d, 0x0ae4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0d6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x65c7, 0x7bec, 0x0000, 0x5ea9, 0x0724, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4384, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4c08, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ec4, 0x0000, 0x0000, + 0x0000, 0x1a24, 0x0000, 0x0000, 0x0000, 0x0000, 0x4528, 0x25e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x45e4, 0x41e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3fea, 0x0000, 0x0000, 0x5465, 0x0000, 0x0000, 0x138b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x58a5, 0x0000, 0x5746, + 0x0000, 0x0000, 0x0000, 0xda26, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5945, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19c8, 0x0107, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6104, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9f07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8466, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x32c8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7664, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x15e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6cc4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x454c, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6205, 0x7188, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3188, 0x2cc6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x604a, 0x1c87, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x69a4, 0x01c9, 0x0000, 0x598c, 0x78e4, + 0x4a48, 0x0000, 0x1529, 0xb287, 0x0000, 0x1425, 0x0000, 0x61c4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0811, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7cca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8266, + 0x0000, 0xbb06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x61ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6629, 0x4fe6, 0x0000, 0xe2c7, 0x7caa, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6584, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1d88, 0x5067, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9286, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa746, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x06c5, 0x0000, 0x0000, 0x0000, 0x2004, + 0x0000, 0x0000, 0x2be9, 0x0000, 0x776c, 0xeba6, 0x0000, 0x5944, + 0x0000, 0x0000, 0x0000, 0x9ec6, 0x0000, 0x5d04, 0x0000, 0x2726, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x324a, 0x7927, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0648, 0x0000, 0x0000, 0x0000, 0x0000, 0x4784, 0x0000, 0x0000, + 0x0000, 0x0000, 0x69ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1f08, 0x0566, 0x0000, 0x2e25, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5fc5, 0x0000, 0x2d65, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x54c6, 0x0000, 0x0000, 0x332c, 0x2046, 0x0a54, 0x1f25, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0409, 0x3125, 0x0000, 0x6285, + 0x0000, 0x0000, 0x0000, 0xa026, 0x3fad, 0xa1e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x416b, 0x07a4, 0x0000, 0x0000, 0x0000, 0x49a6, + 0x0000, 0x0000, 0x06cd, 0x8467, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6709, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72a4, 0x0000, 0xc7c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x068a, 0x1fe4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2906, 0x0000, 0x0000, + 0x0000, 0x0000, 0x15a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0833, 0xb066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x374d, 0x0000, 0x694b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x42c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x69aa, 0x1a46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6f8a, 0x0000, 0x0000, 0x2384, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4228, 0x0000, 0x0000, 0x0000, 0x64e9, 0x0000, 0x112f, 0x1b44, + 0x0000, 0xb486, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21c4, + 0x52ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4aab, 0xbda7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3445, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c28, 0x2f67, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d65, 0x20c8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5cc7, + 0x2608, 0x11c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x63e9, 0x73a7, 0x3c88, 0x3ae4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5608, 0x0000, 0x0000, 0x0000, 0x0000, 0x5724, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9226, 0x5dec, 0x0000, + 0x0000, 0x0000, 0x388a, 0x7427, 0x0000, 0x1ba5, 0x0000, 0xb3a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7768, 0x7b84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1806, 0x0000, 0x1084, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0de4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5fe4, 0x1068, 0x0546, 0x0000, 0x0000, + 0x0000, 0x8347, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2e08, 0x0586, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4744, 0x03ac, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1c66, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4145, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xbf27, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5c6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x108c, 0x3fe6, 0x0000, 0x4705, 0x2048, 0x7f84, 0x0000, 0x0000, + 0x02e8, 0x46a4, 0x0000, 0x2b06, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1e06, 0x0000, 0x0000, 0x33e9, 0x1566, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3248, 0x0000, 0x0000, 0x5e46, 0x03ed, 0x5984, 0x0000, 0x7ac5, + 0x5668, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6f08, 0x0000, 0x0000, 0x0000, 0x6909, 0x69e5, 0x0000, 0x0000, + 0x66e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6226, + 0x0000, 0x0000, 0x1308, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4288, 0x0000, 0x0000, 0x5527, 0x0000, 0x0000, + 0x274c, 0x0000, 0x3008, 0x5584, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2448, 0x0dc7, + 0x0000, 0xe346, 0x7de8, 0x0000, 0x282a, 0x0000, 0x0849, 0x2d07, + 0x0000, 0x0000, 0x0000, 0x3025, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7084, 0x0928, 0x1fc5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5568, 0xf4e7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0ad3, 0x0000, 0x0000, 0x5aa4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1886, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67e5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5a68, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7c48, 0x7c04, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f88, 0x6a05, + 0x0000, 0x0000, 0x0000, 0x0000, 0x19aa, 0x0484, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x76c6, 0x0000, 0x0000, + 0x0000, 0x6ee4, 0x384e, 0x0000, 0x0000, 0x4d87, 0x308a, 0x14a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x59e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x618a, 0x42a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5329, 0x2c24, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x05a4, 0x00ec, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4be4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6608, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b0b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4da9, 0x4b04, 0x0000, 0x2de5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4626, + 0x0000, 0x45e6, 0x0000, 0x4926, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x47a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5406, + 0x13a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x5947, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3906, 0x0000, 0x73a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0269, 0x0000, + 0x0000, 0x0000, 0x0000, 0x66c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e2b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x08b1, 0x39e7, 0x0000, 0x0000, + 0x066a, 0x1826, 0x336b, 0x3ae6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4f28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f87, + 0x102c, 0x4546, 0x43c8, 0x6467, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x36c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d64, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1da4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3106, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x466c, 0x0000, 0x0000, 0x0000, 0x124a, 0x3784, 0x0000, 0x0000, + 0x1bc9, 0x9d87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5f29, 0x0000, 0x0000, 0x5766, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8b86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67a4, + 0x1e4c, 0x0000, 0x0000, 0x4a26, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1928, 0x0487, 0x1c0c, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2c6, 0x0000, 0xe1c6, + 0x0000, 0x4164, 0x0000, 0x0000, 0x77c9, 0xec26, 0x0000, 0x0000, + 0x0000, 0x6766, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff66, + 0x0d08, 0x1e46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2388, 0x1287, 0x014e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9c26, 0x0000, 0x0000, 0x0000, 0x64e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0bd3, 0x0000, 0x0000, 0x0000, 0x3dc8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcc7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3f28, 0xa347, 0x0000, 0x0000, 0x5f8a, 0x2185, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3004, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x13e9, 0x7884, 0x48e8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4064, 0x0000, 0x0000, 0x4f08, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8c66, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1104, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xdec6, 0x0000, 0x0000, 0x0589, 0xa0e7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5b85, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2728, 0x54e7, 0x0000, 0x0000, 0x2d2a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4a66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5e29, 0x1266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x112a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x33c5, 0x0000, 0xdc47, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4ae6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xdaa6, 0x0000, 0x0000, 0x0000, 0xcb66, 0x0000, 0x3d04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a64, 0x0000, 0x0000, + 0x0000, 0x0000, 0x548c, 0x0000, 0x0000, 0xcce7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c2c, 0x0000, + 0x01d0, 0x87a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x61ab, 0x3087, 0x0000, 0x6a24, 0x0768, 0x1ca7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8b66, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0bd0, 0x0000, 0x0000, 0x0000, 0x0000, 0x5786, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb0c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5284, 0x5c2a, 0x8167, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1b29, 0x5647, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x220a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e64, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1849, 0x5ba4, + 0x0000, 0x0000, 0x072a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2b8b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7508, 0xf7a6, 0x0435, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2647, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c65, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1645, 0x0000, 0x0000, 0x0000, 0x7e44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5306, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30c4, + 0x0000, 0x0000, 0x0000, 0xbcc6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3da7, + 0x0000, 0x0000, 0x04b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a86, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c0e, 0xc027, + 0x0000, 0x0000, 0x150b, 0x3b25, 0x0000, 0x0000, 0x0000, 0x0d25, + 0x0000, 0x0000, 0x0000, 0x0000, 0x56c9, 0x36c5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0178, 0x9d06, 0x0000, 0x0000, 0x0000, 0xcb47, 0x0000, 0x6164, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0328, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2684, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5ca7, 0x0000, 0x53e4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5128, 0x12c7, 0x0000, 0x0000, 0x0c69, 0x4126, 0x0000, 0x0000, + 0x006e, 0x2a65, 0x0000, 0x0000, 0x0000, 0x43e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d4c, 0x1366, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcb86, + 0x0000, 0x5fc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67a7, + 0x0000, 0x0000, 0x0000, 0xb4a7, 0x0000, 0x0000, 0x0000, 0x3cc5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0228, 0xcc67, 0x0000, 0x0000, + 0x0000, 0x0000, 0x45ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4ae5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xac06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0ba9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x37e6, + 0x0000, 0x0000, 0x3b69, 0x4827, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x266e, 0x0000, 0x4409, 0x4c24, 0x0000, 0x0000, + 0x0000, 0x7444, 0x0000, 0x0000, 0x0000, 0x0000, 0x02ae, 0x7565, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7845, 0x1548, 0x5165, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3d8c, 0x32c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4aa7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7aa4, 0x0000, 0x0000, 0x0000, 0x4424, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2c6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6ec9, 0x0226, 0x0000, 0x0000, + 0x0231, 0x0000, 0x716a, 0x0000, 0x0000, 0x0000, 0x0dc8, 0x0000, + 0x0000, 0x0000, 0x06b3, 0x3945, 0x0008, 0xf7e7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x24e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x738a, 0xe686, 0x0000, 0x9a06, + 0x0000, 0x0000, 0x0000, 0x0000, 0x08ca, 0x40e4, 0x0000, 0x7c24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a08, 0x03e6, + 0x0000, 0x7165, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ba6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x06e8, 0x0000, 0x3308, 0x1a04, 0x070c, 0x0000, 0x0000, 0xd3a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x372c, 0x0000, 0x3829, 0x7406, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1e24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbea7, 0x0000, 0x2064, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x15a4, 0x172d, 0x0000, 0x3a09, 0xc867, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8b27, 0x1428, 0x3884, 0x0000, 0x0000, + 0x5a48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01b6, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x072c, 0x2426, + 0x056e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3488, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3327, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x268a, 0x0000, + 0x0000, 0xe8e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x62c6, 0x0000, 0x0000, 0x5d28, 0x7d45, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2427, 0x088b, 0x1de4, 0x01b5, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c25, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2de4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4206, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x56c4, 0x0749, 0x4487, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x55ec, 0x0000, 0x0000, 0x0000, 0x0000, 0xdaa7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7d8a, 0x52a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x37a9, 0x0000, 0x0000, 0x0000, 0x0954, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1aa7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f06, + 0x0000, 0x0000, 0x17ab, 0xd107, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xc186, 0x7909, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x30cb, 0x5de4, 0x0000, 0x3324, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x202a, 0xc847, 0x0d31, 0x3b26, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x138f, 0xf3a6, + 0x0000, 0xde67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f66, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ae, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6e67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3d06, 0x0000, 0x4d25, 0x0000, 0x0000, 0x064b, 0x0000, + 0x56cb, 0xbdc7, 0x6229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4444, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x02d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f06, + 0x0000, 0x0000, 0x0000, 0x2724, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1708, 0x74e7, 0x0e49, 0x5a06, 0x0000, 0x0000, + 0x174c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x324b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0be8, 0x6ec5, 0x0000, 0x7924, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5ae6, 0x0000, 0x7fa5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x94c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1324, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x63c5, 0x0000, 0x4964, 0x0000, 0x0000, + 0x56e8, 0x4ac6, 0x0000, 0xf126, 0x4829, 0x77a5, 0x0000, 0x1024, + 0x5e69, 0x3ac7, 0x0000, 0x0000, 0x3848, 0x1285, 0x0000, 0x0000, + 0x0000, 0x91c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1faa, 0x0000, + 0x7d6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x05c9, 0x0000, 0x0000, 0x6de4, + 0x0000, 0x64c6, 0x0000, 0xe987, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xe5a6, 0x0000, 0x0000, 0x0000, 0x5b46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x78a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3f48, 0x0000, 0x0000, 0x0000, 0x014f, 0x0000, + 0x0000, 0x0000, 0x02ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7408, 0x2506, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ac4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4f8b, 0x0000, 0x0000, 0x0000, 0x040a, 0x7ac7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x75a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x3665, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08e8, 0x0aa5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x560c, 0x5c87, + 0x0bc9, 0x5665, 0x0000, 0x0000, 0x54ea, 0x16e5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7626, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4369, 0x0000, 0x5588, 0xf927, 0x0000, 0x0000, + 0x0000, 0x5266, 0x0000, 0x48e6, 0x0000, 0x6464, 0x0000, 0x5805, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1664, 0x16a8, 0x2b67, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1e64, 0x32aa, 0x1965, 0x0000, 0x0000, + 0x0c6b, 0x6746, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3d86, 0x0000, 0x10c5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008e, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5324, 0x2ba9, 0x1f04, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4c8b, 0x9ec7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2e65, 0x0000, 0x0000, 0x0000, 0x6747, 0x0000, 0x0000, + 0x0000, 0x0000, 0x02b7, 0xbfe6, 0x6b4b, 0x2ec4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x26e9, 0x0000, 0x0000, 0x0000, + 0x7bea, 0xf606, 0x0000, 0x0000, 0x0000, 0x0000, 0x3dc9, 0xcde6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6026, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5046, 0x0000, 0x0000, 0x5b09, 0x0f66, 0x0000, 0x0000, + 0x0000, 0xb367, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x09f4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xb226, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0d4d, 0x5864, 0x3ccb, 0x1a66, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5e8a, 0x1764, 0x0000, 0x0000, 0x0000, 0xacc6, + 0x0000, 0x0000, 0x0000, 0x15e5, 0x0000, 0xbaa6, 0x0000, 0x7de6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1b66, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4068, 0x48c5, 0x0000, 0x6a65, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9fc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7d04, 0x7aca, 0x0000, 0x5f48, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b68, 0x0c44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x714a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd846, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9426, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x050a, 0x0000, + 0x0000, 0x0000, 0x1269, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x514c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x070b, 0x1a25, 0x0000, 0x4524, 0x0000, 0x0000, 0x028e, 0x4aa5, + 0x0000, 0xc9c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x12c4, + 0x0630, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1808, 0x0000, 0x0000, 0x6247, 0x10cf, 0x0000, 0x0000, 0x0000, + 0x1149, 0xccc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0548, 0x1987, 0x0000, 0x4cc4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1272, 0x0064, + 0x0000, 0x0000, 0x0000, 0x0000, 0x75c8, 0x0000, 0x0000, 0x7f64, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0869, 0x23a5, + 0x0000, 0x0000, 0x0117, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2bc9, 0x03a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd387, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4529, 0x3ea5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7b88, 0x0000, 0x0000, 0x0000, 0x1bee, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f8c, 0x8c67, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdc87, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbe6, + 0x0000, 0x0000, 0x0000, 0xc7e6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x42c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x000c, 0x0324, 0x4dab, 0x9c07, 0x2829, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2f64, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x372d, 0x0ec4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6929, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56ac, 0x0000, + 0x514a, 0x2745, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7224, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e0a, 0x0000, + 0x3b68, 0x0000, 0x0000, 0x7f05, 0x1668, 0x4b47, 0x0dea, 0x2926, + 0x0000, 0x0000, 0x0000, 0xe907, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7729, 0xec06, 0x0000, 0x0000, 0x6189, 0x0000, 0x0000, 0x0000, + 0x0a4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x66a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7784, 0x0e0a, 0x0000, 0x0000, 0x0000, 0x5809, 0x4264, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a29, 0x3026, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7269, 0xe926, + 0x0000, 0x0000, 0x2028, 0x0205, 0x0000, 0x3cc4, 0x0000, 0x0000, + 0x0000, 0x0904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4da5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d49, 0x0000, + 0x0000, 0x65e5, 0x0000, 0x0000, 0x5ce8, 0xf867, 0x19a8, 0x18a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2746, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1b6a, 0x3886, 0x49aa, 0x0000, 0x1609, 0x29a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ac6, 0x05eb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6be8, 0x0000, 0x0000, 0x2586, 0x0000, 0x9aa6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xd2a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x00e8, 0x10e7, 0x3169, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4ee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x686a, 0x0000, 0x0000, 0x0000, 0x4bc8, 0x32c7, 0x0000, 0x7a66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c85, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13c8, 0x2e84, + 0x0000, 0x6ac5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xba87, 0x0000, 0x0000, 0x0000, 0x6826, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5dc6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1865, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5b48, 0xf9a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39ee, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2148, 0x5de5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x66a7, + 0x0000, 0x0000, 0x0000, 0x5966, 0x0000, 0x0000, 0x0000, 0x6c86, + 0x0000, 0x77e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83a7, 0x0000, 0x0000, + 0x0000, 0x76c5, 0x0000, 0x8726, 0x0000, 0xc767, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05e7, 0x5589, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8c6, 0x0000, 0x6126, + 0x0000, 0x7f87, 0x0000, 0x0000, 0x0000, 0x88c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2bc4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x206d, 0xe287, 0x0000, 0x0000, + 0x0000, 0x78e5, 0x0000, 0x0000, 0x6508, 0x3b24, 0x23ca, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63c4, 0x4ea8, 0x1bc4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x402b, 0x2a25, 0x264d, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1248, 0x0000, + 0x0000, 0xcdc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a24, + 0x0000, 0x0000, 0x0000, 0x41a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x256a, 0x14a7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8506, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4a84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1dcb, 0x0a46, 0x0000, 0x9a27, 0x6fc8, 0x7844, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5ba9, 0x3de5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9686, 0x0000, 0x0000, 0x0000, 0x45e5, 0x3e69, 0x0000, + 0x1c08, 0x02a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0c29, 0xb4c7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5b26, 0x0000, 0x0000, 0x46a8, 0x5ae4, + 0x0000, 0xf386, 0x0000, 0x0000, 0x0000, 0x40e5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9526, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62cc, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2868, 0x3244, 0x488b, 0x0000, 0x0000, 0x0765, 0x0000, 0x0000, + 0x0452, 0x0000, 0x7008, 0x7824, 0x0000, 0xa0a6, 0x0000, 0x0000, + 0x05d4, 0x0000, 0x3bed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aa4, + 0x0000, 0x52e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x61e4, + 0x0828, 0x5544, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0166, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4144, 0x0000, 0x0000, + 0x0000, 0x0684, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2fe4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2aeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31a9, 0x2324, + 0x0000, 0x0000, 0x4f69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0e94, 0x0000, 0x066e, 0x0000, 0x0000, 0x6b44, 0x0000, 0x8666, + 0x42e8, 0x3805, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c47, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x17e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2167, + 0x542a, 0x27e4, 0x38a8, 0x2a06, 0x0000, 0x44e6, 0x0000, 0x0000, + 0x1b49, 0xafc7, 0x08aa, 0x2005, 0x0000, 0x0000, 0x7708, 0xf786, + 0x0000, 0x6824, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04f1, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a32, 0x0000, + 0x0000, 0x0000, 0x2c0e, 0x4f47, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4d44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0931, 0x2a64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x152d, 0x5ee4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8667, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c48, 0x5126, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3048, 0x2a05, 0x0000, 0x0000, 0x0000, 0x8166, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7385, 0x0000, 0x0927, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xf667, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xb646, 0x0000, 0x3185, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05c8, 0x7424, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2287, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f84, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xb306, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0337, 0x0000, + 0x0000, 0xfa27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3bc4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b6c, 0xb6a7, + 0x1a68, 0x4b44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8586, 0x0000, 0x0000, 0x0f89, 0x01a4, + 0x0000, 0x0000, 0x0000, 0x7dc7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5be4, 0x658a, 0x0000, + 0x0000, 0x1544, 0x0000, 0x0000, 0x0000, 0x2605, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1284, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4165, 0x0000, 0x0000, 0x1212, 0x5b47, 0x0000, 0x0000, + 0x7aa8, 0x0000, 0x0000, 0x0de5, 0x0000, 0x0000, 0x108a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3785, 0x0000, 0xdf67, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0f68, 0x0000, 0x0000, 0x0000, 0x0000, 0xff26, 0x7488, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7525, 0x0000, 0x7c66, 0x0000, 0x0000, 0x1fea, 0x0000, + 0x0000, 0x1145, 0x6bea, 0x78a4, 0x0000, 0x0000, 0x4eec, 0x0000, + 0x0000, 0x0000, 0x0000, 0xae46, 0x2808, 0x5184, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7026, 0x0000, 0x5684, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7347, 0x0000, 0x4d65, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x77a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x72a5, 0x0000, 0x8987, 0x0000, 0x0000, 0x0000, 0x92a6, + 0x0000, 0xf146, 0x2188, 0x1f65, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30c8, 0x2b45, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e05, + 0x0000, 0x0000, 0x0000, 0x61e5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ca6, + 0x0000, 0x0000, 0x0000, 0x4a44, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2184, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4665, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x52c8, 0x04a5, 0x0000, 0x0000, 0x0000, 0xa686, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f86, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2968, 0x38a7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x41e9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0c46, 0x0000, 0x0000, 0x480b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0a8d, 0x0000, 0x1868, 0x04a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2444, 0x0000, 0x0000, 0x5f4a, 0x08c6, 0x0000, 0x0000, + 0x0000, 0xa467, 0x0000, 0xf466, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a48, 0x1067, + 0x0000, 0x0000, 0x0000, 0x0000, 0x63ab, 0x0000, 0x04cf, 0x0000, + 0x166e, 0x3d07, 0x0000, 0x7504, 0x0000, 0x38a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4a67, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7be6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51a4, + 0x0000, 0x3f27, 0x0000, 0x0000, 0x0000, 0x70e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0a12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x360e, 0x0000, 0x0000, 0x2744, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1d08, 0xab07, 0x42c9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0369, 0x0000, 0x0000, 0x0000, + 0x018e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x210b, 0x5c07, 0x0000, 0xcf26, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6986, 0x0000, 0x0fe7, + 0x0000, 0x0000, 0x0000, 0x9406, 0x0000, 0xa1c6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2d88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0fab, 0xb0e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6309, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6a29, 0x4ec4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7904, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb4c6, 0x0f88, 0x19c7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0fe8, 0x0c64, 0x0000, 0x0000, + 0x40a9, 0x7264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0a6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x80e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb7c6, 0x0000, 0x7745, 0x0000, 0x0000, 0x3448, 0x2606, + 0x3349, 0x0000, 0x0000, 0x0000, 0x0000, 0x5bc6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xe3c6, 0x0000, 0x0000, 0x0000, 0xe0c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01c6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x142b, 0x0e25, 0x08ac, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2244, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x43a4, 0x0000, 0x4e65, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x14c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a26, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x59a5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b08, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51c5, 0x0000, 0x0000, + 0x178a, 0x2226, 0x0000, 0x0000, 0x0000, 0x43e4, 0x0000, 0x3347, + 0x0c4b, 0x0000, 0x0000, 0x75a4, 0x0000, 0x0000, 0x174b, 0x1f44, + 0x0000, 0xdf26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa766, + 0x39c8, 0x7827, 0x0000, 0x6184, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4225, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3b48, 0x9f87, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3a8c, 0x7685, 0x0000, 0x0000, + 0x0000, 0x0000, 0x522c, 0x5e26, 0x0000, 0x0000, 0x0000, 0x0000, + 0x75ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4284, 0x7b2b, 0x68a5, 0x0000, 0xe8a7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2488, 0x2944, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5fe7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5024, 0x0000, 0x0000, 0x0000, 0x9a26, 0x1e49, 0x0000, + 0x6e69, 0x0000, 0x224a, 0xfb06, 0x0000, 0x57e4, 0x23ac, 0x0000, + 0x0000, 0x4764, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x66e8, 0x6d25, 0x3e4a, 0x4d27, + 0x0000, 0x35e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x236b, 0x0000, 0x3229, 0x0000, + 0x10c9, 0x61a6, 0x350b, 0x0425, 0x0000, 0xfac7, 0x0000, 0x0000, + 0x2248, 0x0000, 0x0000, 0xeb47, 0x0000, 0x6344, 0x0000, 0x0000, + 0x0000, 0xe707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3808, 0x05e6, 0x0000, 0x0000, 0x0000, 0x95e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3429, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x24e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7f65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d84, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3a0b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1a06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x374a, 0x0000, 0x744a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3748, 0x0886, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8d06, 0x698b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6265, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3d68, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x58e6, 0x0000, 0x0000, 0x0130, 0x0000, + 0x690a, 0x3264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x140a, 0x3187, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x54e5, 0x28c9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d07, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c26, 0x0000, 0xe087, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2a48, 0x47c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8906, 0x3d6a, 0x32a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8727, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd187, 0x0000, 0x96e6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7609, 0x2c45, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4ac8, 0x0000, 0x2529, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xdd87, 0x5dea, 0x0000, 0x04ad, 0x0000, + 0x0000, 0xe486, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2026, 0x17e9, 0x48c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x62ca, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3aa8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x10a8, 0x2646, 0x7e6b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2569, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x68a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2088, 0x2925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa506, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13d2, 0x5224, + 0x0000, 0x94e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00f8, 0x0000, 0x79c8, 0xf266, 0x0000, 0xd027, 0x0000, 0x0000, + 0x0000, 0x0000, 0x010f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2408, 0x0845, 0x0000, 0x0000, 0x0000, 0x0000, 0x3dca, 0x15e7, + 0x0000, 0xcd66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4748, 0x02a4, 0x284a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0fa8, 0x0000, 0x0000, 0x9be6, 0x0000, 0x0000, + 0x06c8, 0xd286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x69c8, 0x76e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3364, 0x0000, 0x0a04, + 0x03ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x53a7, 0x0000, 0x5427, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xa2e6, 0x580a, 0x2565, 0x0000, 0x0000, 0x0000, 0x2266, + 0x0000, 0x0000, 0x1b08, 0x1b64, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa4e7, + 0x0000, 0x0000, 0x358c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4045, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x062e, 0x06e4, 0x0cd2, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d85, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2f6b, 0x0000, 0x2649, 0x0984, 0x0689, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d46, 0x0000, 0x0000, + 0x0000, 0x8446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5204, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1207, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xaba7, 0x014d, 0x4547, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x68c5, 0x0000, 0x7e85, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1348, 0x1f66, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a85, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6546, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3deb, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a8, 0x0000, + 0x4449, 0x1f06, 0x0000, 0x2cc4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x46e6, 0x37a8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5726, 0x0000, 0x0000, 0x0000, 0x4824, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72aa, 0x15c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6dc5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2be4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x23c4, 0x0000, 0x0000, 0x0508, 0x36c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x792a, 0xffe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6646, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6c45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb766, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7984, + 0x0000, 0x2c66, 0x0000, 0x0000, 0x0000, 0x3924, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2168, 0x41e5, 0x0d0b, 0x0000, + 0x0000, 0x0000, 0x0000, 0xc9a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0e86, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6ec6, 0x0000, 0x0ac4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05b6, 0x0000, 0x0000, 0x6be6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf426, 0x384a, 0x09e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2fae, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8ec6, 0x0000, 0x94a6, 0x0000, 0x0000, 0x0000, 0x52e5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x69c5, + 0x0000, 0x0000, 0x420a, 0x0000, 0x3a28, 0x2f45, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x28ae, 0x7067, 0x5509, 0xeb07, + 0x0000, 0xdd46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5104, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6708, 0x7625, + 0x0000, 0xffc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2c08, 0xcda7, 0x0000, 0x1304, 0x0000, 0x0000, 0x0000, 0x4c66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7dc5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3485, 0x0000, 0x0000, 0x0000, 0x6807, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2be5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x09c8, 0x0505, 0x0000, 0x0000, 0x0788, 0x0000, + 0x0000, 0x0000, 0x0000, 0xa946, 0x5d29, 0x5a84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fa8, 0xf3e7, + 0x1b68, 0x0d87, 0x4fe9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3e88, 0x01e5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xebc6, 0x58e9, 0x19a5, 0x0000, 0x0000, 0x78a8, 0x6c26, + 0x0000, 0x0000, 0x0000, 0x42c5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5669, 0x0000, 0x0000, 0x0000, 0x1da9, 0x3766, 0x0000, 0xc266, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb046, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7c64, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4844, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e2a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x66c4, + 0x0000, 0x7365, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7384, 0x0000, 0x0000, + 0x0000, 0x5325, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeda7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0x216c, 0x0ba5, + 0x0000, 0x0000, 0x0000, 0xb567, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5d67, 0x6789, 0x6286, 0x266b, 0x1707, 0x0000, 0x18c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7c47, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x24e8, 0x1d25, 0x0000, 0x0000, + 0x0000, 0x7a45, 0x6969, 0x7124, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6a48, 0x79c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x00d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3fa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa366, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1926, 0x0000, 0x0000, + 0x0000, 0x8227, 0x0000, 0x0000, 0x0000, 0x8206, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56a5, + 0x1d4b, 0x60c6, 0x0000, 0x2a04, 0x0000, 0xaee7, 0x02d4, 0x0000, + 0x64a8, 0x6445, 0x6129, 0x14e5, 0x62a9, 0x0000, 0x0000, 0xd526, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0147, 0x48c9, 0x0165, 0x0000, 0x0000, + 0x1988, 0x2104, 0x0000, 0x0000, 0x070a, 0x0000, 0x0000, 0xefa6, + 0x0000, 0x3ac5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7eeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5965, + 0x0000, 0x0000, 0x72e9, 0x0000, 0x0000, 0x0000, 0x6348, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c64, + 0x0000, 0x0000, 0x5a88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x17c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8546, 0x0000, 0x0000, + 0x0000, 0x0000, 0x086e, 0x0000, 0x15d2, 0x7684, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5f84, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0969, 0x1126, 0x0000, 0x5e84, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7e08, 0x6944, 0x506b, 0x0000, 0x0000, 0x0000, + 0x086b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x10e8, 0x66a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c0c, 0x0000, + 0x30aa, 0x27e7, 0x0000, 0x0000, 0x624a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xff86, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x80c6, 0x0000, 0x0000, 0x0000, 0x8766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9946, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2c88, 0x0744, 0x16a9, 0x30a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b45, + 0x0000, 0x0000, 0x0000, 0x3564, 0x0000, 0x33a6, 0x0000, 0x5b44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ea5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63e7, + 0x0000, 0x0000, 0x0000, 0xe027, 0x0000, 0x0000, 0x0000, 0x2844, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0b31, 0x2447, 0x004b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5404, 0x7128, 0xe886, 0x0000, 0x0000, 0x0000, 0x5c25, + 0x0000, 0x0000, 0x0000, 0x5d46, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1225, + 0x0f8c, 0x6e87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3064, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x54e6, 0x0000, 0x44c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa327, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4804, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x55c6, 0x0000, 0x72e5, + 0x0000, 0x0000, 0x04b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0ca8, 0x0a44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x77c4, 0x0000, 0x0000, 0x0000, 0x70e5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x126c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2dea, 0x0000, 0x0000, 0x0000, 0x0000, 0x5646, 0x0000, 0x5824, + 0x5169, 0x0000, 0x0000, 0x6ee7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7186, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9da6, + 0x0000, 0x0000, 0x3e2c, 0x9a66, 0x0000, 0x35a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x710a, 0x0000, 0x6089, 0x0fa6, 0x0000, 0x0000, + 0x0000, 0x6924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b86, + 0x7648, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x600a, 0x0000, 0x6049, 0x1406, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x21ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x59eb, 0x0000, 0x5089, 0x48a7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50c9, 0x2607, + 0x0000, 0x4ee4, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e08, 0xbd27, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7aa7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3644, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x44c6, 0x0000, 0x0000, 0x3b8a, 0x7447, + 0x670a, 0x4525, 0x0000, 0x0000, 0x3888, 0x0000, 0x12e8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6084, 0x0000, 0x2485, + 0x10ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3f09, 0x0000, 0x0000, 0x8826, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x61e7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b6a, 0x3067, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1d09, 0x7204, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a26, + 0x0000, 0x0000, 0x5988, 0x0c47, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5ba5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x026a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5385, + 0x0000, 0x2d04, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x520c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0138, 0x5ac7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0909, 0x0000, + 0x0000, 0x9ea6, 0x0000, 0x0000, 0x39e9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xb5c7, 0x0000, 0xa0e6, 0x4b0b, 0x0000, + 0x7ba8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0d69, 0x1487, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x84a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0048, 0x0364, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8ce6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3984, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7484, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4986, + 0x4e28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0986, 0x0b88, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x012d, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5f64, 0x0000, 0x4dc4, 0x0000, 0x0000, + 0x0000, 0x1fa5, 0x0000, 0x4447, 0x0000, 0x0000, 0x0929, 0x0000, + 0x200a, 0x4e07, 0x0000, 0x0000, 0x046c, 0x1a85, 0x0000, 0x0000, + 0x5d49, 0x0000, 0x0000, 0x0000, 0x12ca, 0x0000, 0x0000, 0xb746, + 0x0000, 0x0000, 0x0000, 0xa266, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdc6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x99a6, 0x0000, 0x0000, 0x0000, 0x6605, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13ec, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5bc8, 0x6ca5, 0x0708, 0x43c4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1949, 0x1d04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1a88, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0de8, 0x0d86, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd606, + 0x0000, 0x0000, 0x1b0e, 0x0000, 0x0000, 0x0000, 0x0000, 0x10a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5146, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0731, 0x0c66, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6329, 0x1ec6, 0x0000, 0x0000, 0x0000, 0x0000, 0x7fe8, 0x0000, + 0x0000, 0x25c7, 0x0000, 0xe9e7, 0x0000, 0x5b04, 0x1f89, 0x0000, + 0x0000, 0x39a6, 0x0000, 0x0000, 0x0000, 0x2866, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x60e8, 0x39a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x158b, 0x0000, 0x0000, 0x3a04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0932, 0x5ae7, 0x0000, 0x7fe4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4828, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x81a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3608, 0x33a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x63e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x13e8, 0x0000, + 0x37cb, 0x50c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3164, 0x0000, 0x0000, 0x0000, 0x0000, + 0x122b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x15c9, 0x0000, 0x0000, 0x3546, 0x4c0a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7a29, 0x0000, 0x1f4a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0c8b, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b85, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5249, 0x0985, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x37e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x41c4, 0x0000, 0x0000, + 0x7ce9, 0x4f84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1787, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d49, 0x22e4, + 0x0000, 0x0000, 0x0000, 0xd9e7, 0x0000, 0x1644, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d04, + 0x0000, 0x67e6, 0x0000, 0x0000, 0x6809, 0x1946, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf446, 0x0000, 0x0000, + 0x0000, 0x0000, 0x408a, 0x6d07, 0x0000, 0x0000, 0x2729, 0x1c04, + 0x0000, 0x0000, 0x030b, 0x0000, 0x0168, 0x4445, 0x0000, 0x0000, + 0x0000, 0xf227, 0x1e48, 0x1e25, 0x05d6, 0x0000, 0x0000, 0x0000, + 0x67c9, 0x9f26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6726, 0x28ea, 0x7dc4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc587, 0x4089, 0x2dc4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd906, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e6, 0x0000, 0x6744, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4de8, 0x2966, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2407, 0x0000, 0x7286, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xec07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb7e6, 0x0000, 0xc446, 0x0000, 0x3144, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf167, 0x0000, 0x47c7, + 0x0000, 0x5244, 0x61a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2ec8, 0x0000, 0x0000, 0x0000, 0x0000, 0x5be7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x286b, 0x2b04, 0x0000, 0x4947, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1369, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7145, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8e66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d8a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4d04, 0x6b28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5688, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x66e6, + 0x0000, 0x0000, 0x0000, 0x2624, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5526, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4c68, 0x1ac5, 0x7d88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x02ee, 0x0000, 0x0000, 0xd4e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb467, + 0x0000, 0x0000, 0x0271, 0x5946, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0c4a, 0x5c24, 0x0000, 0x0000, 0x4108, 0xdbc6, 0x0000, 0x0000, + 0x1e4a, 0x05e5, 0x0000, 0x0000, 0x436a, 0x1165, 0x0000, 0x0000, + 0x0000, 0x0000, 0x308d, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fa6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f8a, 0x0000, + 0x5d2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x36e8, 0x0d64, 0x0000, 0x6ce4, + 0x0000, 0x0000, 0x0000, 0x1ca4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x70e4, 0x0000, 0x0000, 0x08ec, 0x0000, 0x0000, 0x44a5, + 0x00c9, 0x05e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7a85, 0x6c28, 0x5825, 0x0000, 0x0000, + 0x0000, 0x1427, 0x0000, 0x0000, 0x0000, 0x0000, 0x11e8, 0x4307, + 0x0000, 0x0000, 0x0000, 0xad86, 0x262a, 0x5a85, 0x0000, 0x0000, + 0x0000, 0x0265, 0x0000, 0x0000, 0x0000, 0x3165, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x69c4, 0x094a, 0x0000, 0x0000, 0x0000, + 0x2e88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x56e4, 0x7528, 0x3e27, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x59c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc5a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0248, 0x2385, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4aa4, 0x0000, 0x0000, 0x0000, 0x7e04, + 0x0000, 0x0000, 0x0000, 0x6564, 0x718b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7e7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2888, 0xf1e7, 0x0000, 0x0000, 0x0000, 0xfbc7, + 0x0ca9, 0xfae7, 0x0000, 0x0000, 0x494b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x038b, 0x86a7, + 0x0000, 0x0000, 0x0000, 0x98a6, 0x0000, 0x0000, 0x07cb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xdcc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x53cb, 0x0000, + 0x3e6a, 0xd026, 0x0000, 0x0000, 0x0c28, 0x02c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3c25, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04a9, 0x10c6, + 0x1368, 0x3cc7, 0x0000, 0xade6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x49e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x26c8, 0x2f85, 0x0000, 0x0000, 0x0000, 0x0000, 0x3329, 0x2d84, + 0x0000, 0x0000, 0x0000, 0x3c46, 0x0000, 0x0000, 0x20e8, 0x61a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6486, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0bc4, 0x0000, 0x33e4, 0x0000, 0x2b85, + 0x0000, 0x0000, 0x0000, 0x7e84, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x14b2, 0xe166, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3304, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2029, 0xa526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e46, + 0x0000, 0x0000, 0x0000, 0x1f24, 0x0000, 0x0000, 0x0000, 0x4805, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1cee, 0x0000, 0x0000, 0x0000, + 0x2409, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3629, 0x7ba6, 0x762b, 0x9e07, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0aec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x616c, 0x4347, 0x0000, 0x0000, 0x0000, 0x33a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3de8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2708, 0x06c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4248, 0x3a86, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x65e9, 0x4c26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c86, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7089, 0x0000, 0x0000, 0x0000, 0x0000, 0xa6e7, + 0x0000, 0xd786, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5005, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xe4e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x89e6, 0x0000, 0xbc07, 0x51ec, 0x7826, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2625, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a87, 0x0000, 0x0000, + 0x35a8, 0x3c04, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c6a, 0x22c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5886, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe606, 0x1d2c, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc26, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xba06, 0x0000, 0x0000, + 0x0000, 0xc6c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d66, + 0x0390, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x05a9, 0x0000, 0x0491, 0x0000, 0x02ce, 0xb447, + 0x2f48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x04eb, 0x0000, 0x0000, 0x83c6, 0x5aa8, 0x2d66, + 0x0000, 0xfe86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x74e9, 0xe9e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x64a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x65a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x022b, 0x5905, 0x0000, 0x4d24, 0x06e9, 0x2806, + 0x21e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x37aa, 0x0000, 0x170b, 0x0ce7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5269, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5486, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2a2b, 0x0000, 0x0000, 0x0000, + 0x3f4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x696a, 0x09a5, + 0x0000, 0x3944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb187, + 0x2fca, 0x0da6, 0x11cb, 0x2946, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0b70, 0x0000, 0x0000, 0x0000, 0x3d8b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ae6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a6b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8326, 0x0000, 0x2827, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf827, 0x0000, 0x0000, 0x0f48, 0x0000, + 0x0000, 0x1d44, 0x0000, 0x0000, 0x0000, 0x7a06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x44a8, 0x1fa7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4149, 0x35c5, + 0x0000, 0x0000, 0x12ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3f64, 0x0000, 0x0000, 0x0000, 0x0000, 0x6569, 0x4ec6, + 0x0000, 0x0000, 0x0000, 0x2ae4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3804, 0x49ea, 0x38e7, 0x0000, 0xaca7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x47e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x92e6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51a6, 0x0000, 0x0000, + 0x0000, 0xdc26, 0x0000, 0x95c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x252a, 0x8ce7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x54c4, 0x0000, 0x0000, 0x0c70, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x046e, 0x0000, 0x05ad, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0f2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0fa4, 0x0000, 0x0000, 0x0000, 0xcac6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a24, 0x1228, 0x0000, + 0x0000, 0x0000, 0x1268, 0x6307, 0x0000, 0x0000, 0x0000, 0x5964, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9e7, 0x0000, 0x0000, + 0x0948, 0x1505, 0x0000, 0x0000, 0x0830, 0x0000, 0x0000, 0x0000, + 0x0d2d, 0x1b86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7806, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, 0x0000, + 0x358b, 0x7da4, 0x0000, 0x0000, 0x3228, 0x0c07, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xc766, 0x0e91, 0x0000, 0x7fa8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x12c8, 0xf527, 0x0000, 0x0000, + 0x6408, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x256d, 0x0000, + 0x0000, 0xace6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4ac4, 0x0000, 0x4465, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x98c6, 0x0000, 0x0000, 0x0000, 0x6d84, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x10a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x1768, 0x0000, + 0x0108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x35ab, 0x0000, 0x55a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1088, 0x3b06, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7546, 0x0000, 0x0000, 0x6d49, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x60c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0b92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67c4, + 0x57a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3548, 0x0fe4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b69, 0x0766, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x24ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3727, 0x1468, 0x0de6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x64c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1d2e, 0x0000, 0x0000, 0x0000, + 0x0000, 0xf947, 0x0000, 0xd966, 0x0000, 0x0000, 0x3128, 0x0000, + 0x2cee, 0x2525, 0x0000, 0x0000, 0x0000, 0x26a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2d68, 0x0000, 0x0000, 0x0000, + 0x15ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5348, 0x0000, 0x0000, 0xd167, 0x0000, 0x51e6, 0x0000, 0x0000, + 0x0000, 0x6507, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2304, 0x06cc, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x34a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1f27, 0x0000, 0x0000, 0x0da9, 0x1fc6, + 0x0000, 0x20c5, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x64a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbc6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x53e5, 0x7988, 0x7ba4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f24, 0x0000, 0x0000, + 0x0000, 0xacc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4e64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2d4b, 0x1947, 0x0000, 0x0000, + 0x0000, 0x0000, 0x30a8, 0x4606, 0x0000, 0x0000, 0x0000, 0x6927, + 0x0000, 0x0000, 0x46c8, 0x0000, 0x0000, 0x0000, 0x7548, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7205, 0x0000, 0x0000, 0x0000, 0xaa27, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3d88, 0x1d85, 0x0000, 0xe7c6, + 0x0000, 0x0000, 0x27c8, 0x17c5, 0x0000, 0xac07, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ba7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x76e8, 0xf686, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2b09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6a44, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x71c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x026e, 0x0000, + 0x4928, 0x0aa7, 0x0000, 0x3ce4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x122a, 0x0000, 0x0a73, 0x0000, 0x0000, 0x7ea4, + 0x0000, 0x0000, 0x0000, 0xf047, 0x0000, 0x0000, 0x392a, 0x0f84, + 0x084b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9527, + 0x0a50, 0x0000, 0x2c0a, 0x38c5, 0x0732, 0x0000, 0x0000, 0xa6a7, + 0x3189, 0x0d66, 0x0000, 0x2e45, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1985, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7945, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3148, 0x0464, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7324, + 0x0000, 0x0000, 0x0000, 0xd407, 0x0000, 0xbde6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7aa9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8606, 0x0000, 0x0000, 0x0000, 0x5904, 0x0000, 0xcba6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b06, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9326, 0x0000, 0x0000, 0x0000, 0xc907, + 0x0217, 0x0000, 0x0000, 0x0000, 0x0000, 0x3ca5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1328, 0x23a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf326, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x068e, 0x0000, 0x02b4, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6668, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72ab, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6207, 0x0000, 0x0000, 0x0000, 0x0000, + 0x10ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x38ca, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x68a8, 0xd6e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a87, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7704, 0x0000, 0x0000, + 0x0000, 0x0000, 0x470a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3809, 0x0000, 0x0000, 0x0000, 0x0868, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xe446, 0x522a, 0x0000, 0x5b2b, 0x5346, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x53a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3245, + 0x0000, 0x0000, 0x130b, 0x0000, 0x0000, 0x0000, 0x0000, 0x7207, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0668, 0x2807, + 0x0000, 0x37a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x456a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x304b, 0x0000, 0x0000, 0x1de5, + 0x0000, 0x0000, 0x1048, 0x0a67, 0x0000, 0x11e4, 0x0000, 0x0f65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x35c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x00ea, 0x1aa5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6427, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7506, 0x0000, 0x0d85, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6ea4, 0x496b, 0x1b65, 0x31ca, 0x1824, 0x0000, 0x91a7, + 0x0000, 0x0000, 0x6808, 0x1e26, 0x25e9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7466, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1fc9, 0x4644, 0x0000, 0x6244, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3da8, 0x1b06, 0x0000, 0x0000, 0x0000, 0x0000, 0x1b6b, 0x2aa7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x104b, 0xd8c7, 0x0e6a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57a8, 0x4b85, + 0x0000, 0x0000, 0x6b08, 0x0000, 0x1869, 0x06c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd0a6, 0x0000, 0x0000, 0x0000, 0xdfe6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x9987, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4de4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2069, 0x0f47, 0x0000, 0x0000, + 0x0000, 0x68a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7ea8, 0x0000, 0x0000, 0x4826, 0x0000, 0x0000, 0x0000, 0x3986, + 0x6f68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x03e8, 0x0a45, 0x0000, 0x0000, + 0x0000, 0x4ba6, 0x0000, 0x0000, 0x0000, 0x9bc6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0889, 0x22c5, 0x14a8, 0x1464, 0x61a8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0426, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8b26, 0x0000, 0x0000, 0x5a08, 0xf427, 0x196a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3529, 0x28c6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x49a9, 0xa487, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3405, 0x0000, 0x0000, 0x0000, 0xa286, 0x0000, 0x69e7, + 0x0000, 0x0000, 0x52ca, 0x2cc5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x68e8, 0xe3e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x51cc, 0xbe46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x146b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x274d, 0x7a44, + 0x0000, 0x0000, 0x0000, 0x4b24, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7645, 0x3648, 0x0000, 0x0000, 0x0000, 0x4ee8, 0x3367, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2908, 0xb767, 0x3feb, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6865, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x54a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c9, 0x0000, + 0x0000, 0x0000, 0x0000, 0xafa7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0d89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2964, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x088e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3f24, 0x0000, 0x28c5, 0x0000, 0x0000, + 0x0469, 0x5664, 0x51ca, 0x0000, 0x0000, 0x0000, 0x04a8, 0x0406, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0e08, 0x1306, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x48a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x31a8, 0x0fc6, + 0x0b2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xbf66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x196c, 0x73c5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4269, 0x9a07, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x75e6, 0x0000, 0x53c5, 0x1ceb, 0x6e04, + 0x0000, 0xca26, 0x0000, 0x0000, 0x0000, 0xf4a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1e47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x34a5, 0x0000, 0x0000, 0x01c8, 0x6845, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3a2a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6849, 0x5606, 0x33a9, 0x2ca4, 0x0000, 0x0000, + 0x0000, 0x49c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0e4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05a8, 0x1525, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x18c4, 0x0000, 0x0000, 0x46ab, 0x0304, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5666, 0x0000, 0x0000, + 0x0000, 0x29c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7227, 0x0e8c, 0x0000, 0x0000, 0x0000, + 0x0000, 0xaa06, 0x0000, 0x0000, 0x0000, 0x6444, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5429, 0x2686, 0x0000, 0x58a4, + 0x7c49, 0xea86, 0x0000, 0x1c84, 0x0000, 0x0000, 0x0000, 0xe607, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4c04, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4a6, 0x0000, 0xfee7, + 0x1108, 0x4386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7024, 0x0000, 0x0000, 0x7549, 0xeac6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7a6, + 0x0000, 0x7ce5, 0x0000, 0x2564, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5d24, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3905, 0x0000, 0x0000, 0x0000, 0xb626, 0x1688, 0x56a7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0612, 0x5e64, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2a4b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8866, 0x0000, 0x0000, 0x0000, 0x0000, 0x56ec, 0x0000, + 0x0000, 0xb707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79e7, + 0x0000, 0x0000, 0x29ed, 0x0000, 0x0000, 0xf766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x21a8, 0xc3c7, 0x4ec9, 0x6f44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xe2e7, 0x17ca, 0x0005, 0x0000, 0x0000, 0x78c8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0128, 0x1d06, + 0x0000, 0x77c7, 0x0000, 0x0000, 0x4868, 0x2fc4, 0x0000, 0x1a84, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7968, 0x5524, 0x0000, 0x0000, + 0x490b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51e5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0871, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5de6, 0x0000, 0x0000, 0x0000, 0x0000, 0x34e8, 0x1ce6, + 0x0000, 0x0000, 0x7f0a, 0x2585, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0c88, 0x1da6, 0x0000, 0x0000, 0x0000, 0xab46, 0x0000, 0x0000, + 0x0000, 0x9707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9866, + 0x342d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18e5, + 0x0000, 0x0000, 0x356c, 0x0000, 0x0000, 0x0000, 0x0000, 0x76a6, + 0x5328, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5605, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9446, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x490a, 0x2706, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x12e9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4984, 0x0098, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x33cc, 0x1ce4, 0x0000, 0x0000, 0x5eaa, 0x20e6, + 0x0000, 0x4c84, 0x0000, 0x0000, 0x0000, 0x2804, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1c24, 0x0000, 0x0000, 0x0000, 0x0000, 0x074e, 0x32a4, + 0x0000, 0x79c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7c84, + 0x106b, 0x41e4, 0x0209, 0x0000, 0x49c8, 0x7787, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1129, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x118a, 0x30c7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8f07, 0x0000, 0x0000, 0x0000, 0x3a06, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x198b, 0x32e5, 0x25e8, 0x9847, + 0x0000, 0x0000, 0x0000, 0x0000, 0x00a8, 0x28a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x018a, 0x6407, 0x0000, 0xdee7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3f0d, 0x4da6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7306, 0x0000, 0x2f04, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1b46, 0x5028, 0x0000, 0x6008, 0x38c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0010, 0x0000, 0x548a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1486, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0656, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x51c8, 0x23a6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1c49, 0x2ae6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0113, 0x0000, 0x0000, 0xe286, + 0x0000, 0x0000, 0x0115, 0x0000, 0x0000, 0x0000, 0x11e9, 0x8ca7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa5e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x47e9, 0xc7c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6fe6, 0x0000, 0x0000, + 0x0000, 0x77e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbe7, + 0x15a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x2146, 0x20ae, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb266, 0x0000, 0x0000, 0x2588, 0x8126, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4906, 0x0000, 0x0000, 0x0000, 0x0000, 0x0688, 0x3565, + 0x0000, 0x0000, 0x1b2b, 0x1de7, 0x0000, 0x8d26, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b88, 0x1506, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3446, 0x0000, 0x0000, 0x0000, 0x4ca5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4f04, 0x0000, 0x0000, 0x0aa8, 0x0407, 0x0000, 0x0000, + 0x0000, 0x0000, 0x71a8, 0x56c5, 0x00eb, 0x8aa7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x14e4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2308, 0x07c5, 0x0000, 0x0000, 0x042a, 0x0000, + 0x0000, 0x2ce4, 0x2909, 0x7a87, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a86, + 0x0000, 0x0000, 0x0000, 0x1a65, 0x0000, 0x0000, 0x2a0d, 0x1226, + 0x0000, 0x8d46, 0x0000, 0x6d27, 0x0000, 0x0000, 0x6908, 0x20e4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7284, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x136f, 0x0000, 0x0000, 0x0000, + 0x19e8, 0x4ae4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa987, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xae06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0fd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x9366, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1444, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5fa6, 0x0000, 0x1765, 0x0000, 0xa0c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4f66, 0x0000, 0x0000, 0x6f48, 0x1ae4, 0x0000, 0x0000, + 0x0000, 0x91a6, 0x0000, 0x0000, 0x0c2d, 0x5987, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2566, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x10ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x524c, 0x8746, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa47, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x682b, 0x0384, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xcec6, 0x0000, 0x0000, 0x426a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6aa5, + 0x47ab, 0x1f26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x41ea, 0x0000, 0x0000, 0x0000, 0x0000, 0xb166, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0288, 0x0627, + 0x0000, 0x0000, 0x0000, 0x6b45, 0x0000, 0x0000, 0x0000, 0x5b05, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3e28, 0x41a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x07c9, 0x2186, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9626, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3dea, 0x1827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d4a, 0x0000, + 0x0000, 0x6b66, 0x0000, 0x0000, 0x02ed, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x65a9, 0x73a6, 0x0000, 0x0000, + 0x1be8, 0x4ca6, 0x7728, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5344, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x53c4, 0x0000, 0x0000, + 0x0509, 0x1b07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x206b, 0x0000, 0x0000, 0x0000, 0x26c9, 0x8b47, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07e8, 0x2504, + 0x0000, 0x0000, 0x178c, 0x1164, 0x0000, 0x63a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc486, 0x0000, 0x0000, + 0x0000, 0x0000, 0x04f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc746, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d64, + 0x0000, 0x1d05, 0x0000, 0x0000, 0x6ee9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4128, 0x01c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ca6, + 0x0000, 0x0000, 0x0000, 0x7c06, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0df0, 0x0000, 0x0000, 0x3524, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62a7, 0x0000, 0x0000, + 0x0000, 0xc726, 0x0000, 0xdd06, 0x0000, 0x0000, 0x1d2b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x75e5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7764, 0x1c28, 0x1ea5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1e2e, 0x0000, 0x0000, 0x0000, + 0x0000, 0xf2e6, 0x0000, 0x0000, 0x0000, 0xa086, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x58a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4548, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc386, 0x0000, 0x0000, + 0x0000, 0x3764, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x230e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5b24, 0x0000, 0x0000, 0x0000, 0x2b84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ec6, 0x6a09, 0x2544, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67a9, 0xb1c6, + 0x17ae, 0x1485, 0x0000, 0x0000, 0x4f09, 0x6587, 0x0000, 0x0000, + 0x458b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c69, 0x1584, + 0x424b, 0x6985, 0x1d0d, 0x7b06, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20e9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4325, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b64, 0x0000, 0x0000, + 0x6949, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xa167, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb946, + 0x4709, 0x1cc5, 0x0000, 0x0000, 0x0000, 0x20c6, 0x03ee, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5e24, 0x44a9, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5705, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6844, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6064, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7325, 0x0000, 0x0000, + 0x0000, 0x5445, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2688, 0x3786, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5de8, 0x1686, 0x0000, 0x0000, + 0x670b, 0x16e4, 0x0000, 0x0000, 0x716b, 0x0264, 0x0000, 0x97e7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3068, 0x21e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcda6, 0x52a8, 0x0b86, + 0x0000, 0x3964, 0x0000, 0x0000, 0x294c, 0xc2a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4488, 0x0246, + 0x0000, 0x0000, 0x0000, 0xd9c6, 0x0000, 0x0000, 0x0000, 0x78a5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x16c6, 0x0000, 0x0000, + 0x082a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2907, 0x0000, 0x0000, 0x4989, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xdf46, 0x0000, 0x0000, 0x7848, 0xa606, 0x0000, 0x0000, + 0x0000, 0x2687, 0x3f8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4cc5, 0x23e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x244c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6388, 0x59e7, 0x0000, 0x0000, 0x28c8, 0x1a45, 0x0000, 0x0000, + 0x0000, 0x57a4, 0x5ec9, 0x3b05, 0x0000, 0x0000, 0x0000, 0xf367, + 0x22ca, 0x86e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x32a8, 0x3044, 0x0000, 0x0000, 0x4f48, 0x05c5, 0x7828, 0x0000, + 0x6548, 0x4184, 0x0000, 0x0000, 0x1dca, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4285, 0x0000, 0x7ca5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa2a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xa246, 0x0000, 0x61c5, 0x0000, 0x0000, + 0x0000, 0x2644, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x56ab, 0xe3e7, 0x0000, 0x0000, + 0x0000, 0x5ee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf187, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x314a, 0x09c4, + 0x0000, 0x0000, 0x0000, 0xf587, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4124, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3509, 0x1ae6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x53e8, 0x2905, 0x0000, 0x4224, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5986, 0x0000, 0xbca6, + 0x2c49, 0x0866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0769, 0x11a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x61e8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7766, + 0x0000, 0x0000, 0x0000, 0x0000, 0x05cb, 0x35c7, 0x3449, 0x4b45, + 0x54a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9a6, 0x06b0, 0x0000, + 0x0000, 0x0000, 0x0000, 0x49c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2927, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3aa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x398e, 0x0000, 0x0000, 0xd9e6, + 0x0000, 0x0000, 0x2f08, 0x7bc4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc866, 0x0000, 0x0000, 0x1f4c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x50c8, 0x1b45, 0x0000, 0xbd07, 0x000b, 0x0000, + 0x0000, 0x4765, 0x0000, 0x38e4, 0x0000, 0x0000, 0x0000, 0x7e86, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4aa9, 0x1426, 0x0000, 0x2ba4, + 0x0000, 0x4186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5de9, 0x3606, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28aa, 0x1be5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x46c4, 0x0000, 0x0000, + 0x0000, 0x0764, 0x3c2b, 0x3686, 0x0000, 0x0604, 0x3928, 0x4c45, + 0x5e89, 0x60a4, 0x0000, 0x0000, 0x0000, 0x5e65, 0x0000, 0x9827, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4408, 0x2c84, 0x0d6e, 0x2065, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7de4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x01cf, 0x0000, 0x0000, 0xc586, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xe666, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x14a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6529, 0x6ea6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3e49, 0x0000, 0x0000, 0x0000, + 0x264c, 0x0125, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x36a4, 0x5a2a, 0x1245, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1626, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xac26, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1905, 0x0000, 0x77e4, + 0x0000, 0x0000, 0x0000, 0xf106, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xb366, 0x0000, 0x3c26, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x098a, 0x0a84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7ee5, 0x0000, 0x0000, 0x0000, 0x2764, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ee9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5906, + 0x0000, 0x0000, 0x0000, 0xd746, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1bc8, 0x0000, 0x74c8, 0x7b44, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f27, + 0x434a, 0x5847, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0b8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0506, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x35e7, 0x0c2a, 0x34e6, 0x5308, 0x1da7, + 0x0000, 0x0000, 0x0000, 0x2107, 0x0000, 0x0000, 0x1aa8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x38e9, 0x0000, + 0x0000, 0x0000, 0x7148, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4e0b, 0x0000, 0x47c8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2c44, 0x0000, 0x0000, 0x0000, 0xc2c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x088f, 0x1d67, 0x72a8, 0x75c4, + 0x0000, 0x0000, 0x0000, 0x77a7, 0x0000, 0x67c5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x02f2, 0x0000, 0x0000, 0x3e05, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4466, 0x1de9, 0x6c04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5147, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0a09, 0x8687, 0x0000, 0x0000, 0x452c, 0x0000, + 0x0000, 0x0000, 0x3beb, 0x2247, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e24, + 0x0000, 0x0000, 0x3a29, 0x20a7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x01a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62e6, + 0x1f48, 0x5047, 0x0000, 0x0000, 0x0000, 0xb2a7, 0x6eaa, 0x76a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6644, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7ac8, 0x7d84, 0x0000, 0x0000, 0x0000, 0x0000, + 0x442a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7666, + 0x0000, 0x9486, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7104, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xab86, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x56a4, 0x2f2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x56e7, 0x0000, 0x0000, 0x592a, 0x3047, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0568, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x350d, 0x6fa7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4509, 0x2846, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0a68, 0xe206, 0x062c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe506, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x34a7, 0x0000, 0x0000, 0x3749, 0x33e6, 0x0000, 0x0000, + 0x242b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x33ea, 0x0dc4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x400b, 0xc067, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa786, 0x0000, 0x2364, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x44ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd706, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x27e5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0e14, 0x9387, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x78e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf287, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5be8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3cc9, 0x1085, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x04ca, 0x68c4, 0x0000, 0x0000, 0x0000, 0x2f65, 0x1b48, 0x0105, + 0x528a, 0x7f24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0ded, 0x3066, 0x50e9, 0x1c06, 0x0000, 0x0000, 0x3fc9, 0x62c7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x394e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7746, + 0x0000, 0x0000, 0x0000, 0x3147, 0x0000, 0xaae6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb027, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04c8, 0x0f87, + 0x65e8, 0x20a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5a8c, 0x4e84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6488, 0x2147, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1a07, 0x0000, 0x09e6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5ca8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x58c4, + 0x0000, 0xbac6, 0x66a9, 0x6a46, 0x0000, 0x0000, 0x10ec, 0x3a64, + 0x0000, 0x0000, 0x1648, 0x0c86, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3c24, 0x0000, 0x0000, 0x0000, 0xac46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x62e5, 0x0428, 0x55c7, 0x6b29, 0x0000, + 0x3a68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x37e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x58ca, 0x1004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4968, 0x0000, 0x0000, 0x0000, 0x568a, 0x3566, 0x0000, 0x1864, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc146, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5586, 0x0000, 0x0000, 0x2b28, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2da5, 0x0000, 0xd266, + 0x0000, 0x0000, 0x3b0a, 0x0000, 0x362e, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0397, 0x0000, 0x0000, 0x0000, + 0x7cac, 0x0000, 0x4848, 0x0065, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ca5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0cc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c46, + 0x7fc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x06f6, 0x0000, 0x0e68, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5226, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1cc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd806, 0x0352, 0x3c84, 0x0000, 0x0000, 0x0000, 0x1727, + 0x4d4a, 0x3426, 0x0000, 0x6466, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9dc6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f24, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3be7, 0x20ca, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x67c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1569, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1b2f, 0x0000, 0x5008, 0x02e4, 0x0000, 0x0000, + 0x2d0d, 0xc647, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5187, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fc7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2548, 0x5c27, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51e9, 0x1bc5, + 0x7149, 0x0000, 0x0000, 0x7ea6, 0x7be8, 0xf486, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3eea, 0x0000, 0x0000, 0x0000, 0x72a9, 0x1345, + 0x0000, 0x0000, 0x0000, 0x5985, 0x0000, 0x6987, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4da8, 0x0b64, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5d89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0cee, 0x0000, 0x13cc, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4807, 0x0000, 0x0000, + 0x0000, 0x6065, 0x0000, 0x0000, 0x0000, 0x2965, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4f0c, 0x0000, 0x0000, 0x0000, 0x40c8, 0x0d65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6a69, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f04, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3108, 0x6e65, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7345, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0b69, 0x7c25, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1908, 0x1064, 0x0158, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2da9, 0xb327, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4888, 0x0ce5, 0x0000, 0x0000, 0x63c8, 0x71e4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x04ec, 0x39a5, 0x0000, 0x6aa6, 0x0000, 0x0000, 0x21ea, 0x10e5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2a4e, 0x0000, 0x0000, 0x2584, + 0x3ac9, 0x3465, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6889, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf226, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3124, 0x0000, 0x0000, + 0x2ca8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57eb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3065, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0968, 0x00c4, 0x48a9, 0xa8e7, + 0x0000, 0x25e4, 0x0000, 0x0000, 0x608a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5da4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8526, 0x0000, 0x0000, 0x59ab, 0x0d44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f45, 0x35ee, 0x4e46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x584a, 0x0000, 0x0000, 0x0000, + 0x066d, 0x5744, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6786, 0x0000, 0x0000, + 0x022a, 0x0000, 0x0000, 0x0000, 0x0000, 0xf127, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5625, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0373, 0x6ce7, + 0x3e4c, 0x0000, 0x3948, 0x7b45, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x366a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x78ca, 0x0000, 0x1029, 0xcd87, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7ca7, 0x3ec8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x66e4, + 0x0000, 0xf0e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c49, 0x5f44, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0118, 0x0000, 0x140b, 0x82c7, + 0x0000, 0x3d87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1028, 0x05a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2c28, 0x45c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6225, + 0x0000, 0x0000, 0x0000, 0x8f26, 0x0a28, 0x0000, 0x0000, 0x0000, + 0x5f4b, 0x2c25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfd06, + 0x0000, 0x0000, 0x0000, 0x4c64, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x0326, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xfb66, 0x0000, 0x0000, 0x22a8, 0x0084, + 0x0000, 0x0000, 0x39ab, 0x5f87, 0x0000, 0x0000, 0x0000, 0xb526, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4a6, + 0x0000, 0x0000, 0x0000, 0x9206, 0x0000, 0x0000, 0x0000, 0x1d26, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1fe6, 0x0000, 0x0000, 0x1b09, 0x0000, 0x0000, 0x0000, + 0x16e9, 0x0000, 0x0000, 0x0000, 0x778b, 0x0000, 0x0000, 0x0000, + 0x5a6a, 0x4304, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23a7, + 0x0000, 0x0000, 0x0000, 0x4607, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5644, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bc7, + 0x0000, 0x0000, 0x13b2, 0x0000, 0x4aea, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3d6c, 0xe8c7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x380a, 0x0000, 0x0000, 0x0000, 0x0000, 0x17c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7d25, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x37c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xa426, 0x0000, 0x0000, 0x68a9, 0x4f86, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22cb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c84, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7e4a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x99e7, 0x0000, 0x2604, 0x0000, 0x3f47, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0356, 0x0000, + 0x0408, 0x06a6, 0x634a, 0x6964, 0x580b, 0x0000, 0x23ad, 0x0e45, + 0x3ca8, 0x4d66, 0x1229, 0x0000, 0x0268, 0xfe67, 0x0000, 0x0000, + 0x0000, 0xf1a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xd807, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5d48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7c68, 0x7b64, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1c6, + 0x0000, 0x6d46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f44, + 0x0000, 0x0000, 0x0000, 0x65c4, 0x0fcb, 0x0000, 0x0000, 0x9e06, + 0x0000, 0x0000, 0x65c8, 0x7765, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7aa6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6f88, 0x0705, 0x0000, 0x0000, + 0x0c94, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x008a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c45, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5ec5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8b07, 0x0000, 0x0000, 0x290b, 0x0000, + 0x0000, 0x0000, 0x10a9, 0x0000, 0x188d, 0x1507, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9006, 0x0000, 0x9ba7, 0x0000, 0x0000, + 0x4348, 0x0dc5, 0x6cea, 0xe306, 0x0000, 0x0000, 0x33a8, 0x10a6, + 0x0000, 0x0000, 0x0000, 0x7a46, 0x0000, 0x0000, 0x5428, 0x0ba6, + 0x2e69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41c5, + 0x0329, 0x0000, 0x5e4c, 0x29e4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x16cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x04e8, 0x4b25, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x16a4, 0x2e48, 0x0000, + 0x0000, 0xce86, 0x2cc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x160d, 0x0c24, 0x0000, 0x4326, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ce6, 0x6188, 0x2ee6, + 0x7d68, 0x7006, 0x0000, 0x0000, 0x0000, 0xb4e7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5d0c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fd2, 0x0000, + 0x052b, 0x6284, 0x0000, 0x0000, 0x0000, 0x4ea5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x24a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3484, 0x67cc, 0x8dc6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x43cc, 0xc447, 0x74a8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ea8, 0xab66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0faa, 0x28a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x286a, 0x0000, 0x0000, 0xc166, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x59c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7669, 0xed06, 0x4ea9, 0x0f85, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3408, 0x0966, + 0x0a69, 0x11a5, 0x0000, 0x0000, 0x0000, 0x42a7, 0x0000, 0x0000, + 0x00d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4345, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2a44, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6feb, 0x0006, 0x0000, 0x0000, 0x238a, 0x1ba4, 0x0000, 0x7ba5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6a07, 0x0000, 0x0000, 0x3f6a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1784, 0x7beb, 0x6e85, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0790, 0x77e7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xcea6, 0x0000, 0x0000, 0x7348, 0xf8a6, + 0x0000, 0x4fc4, 0x0000, 0x0000, 0x3e8a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x14cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3447, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5f08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fa6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6048, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1e6a, 0x0b24, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xae86, 0x0000, 0x4605, + 0x0000, 0x0000, 0x0069, 0xcf46, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x494a, 0x0000, 0x0000, 0x9ee7, + 0x0000, 0x0000, 0x0000, 0x14c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4fa6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf366, 0x2668, 0x37a7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0728, 0x17a4, 0x0000, 0x0000, 0x2e6a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4504, 0x0000, 0x6e66, 0x0000, 0x7366, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6d67, 0x0000, 0x0000, 0x0000, 0xdf87, 0x0631, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x52aa, 0x0000, 0x0000, 0xf327, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6346, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8de6, 0x0000, 0x0000, 0x0000, 0x6204, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a85, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3345, + 0x0000, 0x7a04, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1748, 0x2845, + 0x0000, 0x0000, 0x0000, 0x1c65, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4609, 0x0000, 0x3cc8, 0xae67, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3a47, 0x0000, 0x0000, 0x0000, 0x0000, 0x506a, 0x14e6, + 0x0000, 0x0000, 0x0000, 0xb286, 0x0000, 0x3385, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8bc6, + 0x4648, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2789, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd66, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x94c7, 0x1089, 0x0000, 0x084f, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x27a4, 0x0000, 0x0000, 0x0000, 0x07e5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb866, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2404, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0b28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x9926, 0x0000, 0x94a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb786, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5626, 0x0f0a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0037, 0x0000, 0x292e, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1c47, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xe7e7, 0x0000, 0x0000, 0x39a9, 0x0000, 0x0000, 0x0000, + 0x0000, 0xa847, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aa6, + 0x0000, 0x0000, 0x256e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9266, 0x0000, 0x0000, + 0x0000, 0x7a84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x37c8, 0x22e5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x24a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x4209, 0x0225, + 0x0000, 0x0000, 0x0000, 0x0000, 0x00b6, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0616, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b2a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6165, 0x0000, 0x1884, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa546, 0x5c2b, 0x5e04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3387, + 0x4588, 0x1c64, 0x0000, 0x0000, 0x0848, 0xb7c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6866, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1728, 0x04c6, 0x7b4a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08a8, 0x13e4, + 0x22c8, 0x71e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5da8, 0x12e4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7baa, 0x0000, 0x0000, 0x7bc5, 0x0000, 0x0000, 0x0b49, 0x1845, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3525, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x60c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50cc, 0x6764, + 0x5e0b, 0x0000, 0x0000, 0x0000, 0x52c9, 0x0000, 0x1ae8, 0x0905, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0bea, 0x1de6, + 0x0000, 0x0000, 0x0000, 0x35e6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x000f, 0x6d45, 0x0000, 0x0000, 0x4389, 0x0826, 0x0000, 0x0000, + 0x0000, 0xa8c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5545, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6524, 0x0000, 0x5704, + 0x0000, 0x8646, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ac4, 0x0000, 0x0000, + 0x6448, 0x0000, 0x0000, 0x0000, 0x0713, 0xa726, 0x0000, 0x7944, + 0x0000, 0x0000, 0x7588, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1f09, 0x0000, 0x0000, 0xf3e6, 0x0000, 0x0000, 0x052d, 0x0000, + 0x016c, 0x0ec6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1f6a, 0x4ce7, 0x0000, 0x0000, 0x0000, 0x8287, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1c25, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6068, 0xcfc6, 0x1a2a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa0c6, 0x0000, 0x5ee6, + 0x0000, 0x0f04, 0x3029, 0x0000, 0x0000, 0x0000, 0x35aa, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6685, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18ea, 0x0000, + 0x0157, 0x12e6, 0x0000, 0x0000, 0x0000, 0x5f26, 0x2da8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05d1, 0x87c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x016b, 0x7f86, + 0x3b0e, 0x0564, 0x0000, 0x0000, 0x7309, 0x5aa6, 0x0000, 0x0000, + 0x0000, 0x6f05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x58e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3709, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7249, 0xef26, 0x0000, 0x77c5, 0x0000, 0x6ea7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x69e4, 0x228b, 0x0000, 0x27a8, 0x0824, + 0x0000, 0x0000, 0x0000, 0x20a4, 0x0000, 0xbd47, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4069, 0x2464, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x234b, 0x49a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1044, 0x0000, 0x0000, 0x39eb, 0x0545, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x10c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5505, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74e8, 0xf9a6, + 0x0000, 0x0000, 0x0000, 0x6544, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xadc7, 0x0000, 0x0000, + 0x0000, 0x5084, 0x0000, 0x0000, 0x6c6a, 0x7ac4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4387, 0x0000, 0x0f67, + 0x0000, 0x0000, 0x0000, 0xf746, 0x0000, 0x0000, 0x0000, 0x0000, + 0x62a8, 0x4de6, 0x0000, 0x7184, 0x0000, 0x9886, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2aa4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6f06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2568, 0xf967, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2fa8, 0x1dc4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x35e9, 0x0f24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xaba6, 0x4469, 0x0a06, 0x188c, 0x0000, + 0x0000, 0x7364, 0x0000, 0x0000, 0x0000, 0x50c6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xc966, 0x0000, 0x0000, 0x0000, 0x0000, + 0x73cb, 0x0000, 0x0000, 0x0000, 0x5248, 0x4a64, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x37c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d46, + 0x0000, 0x0000, 0x0000, 0x3d66, 0x0000, 0xc606, 0x0000, 0x0000, + 0x3f68, 0x1f47, 0x0000, 0x0000, 0x0000, 0x13c4, 0x1a28, 0x1184, + 0x0033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3309, 0x1c86, 0x6b8a, 0x2ea4, 0x0000, 0x6166, + 0x0000, 0x0000, 0x0000, 0x45a4, 0x0000, 0x0000, 0x11c8, 0x4484, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xba46, 0x0a6f, 0x4885, 0x278a, 0x8426, + 0x0000, 0x0000, 0x3268, 0x1524, 0x256b, 0xc147, 0x0000, 0x1624, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3365, 0x0000, 0x0000, 0x0000, 0x0000, 0x5aea, 0x36e7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a05, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x34cb, 0x0000, 0x4d49, 0x0000, + 0x0000, 0x0000, 0x3f2e, 0xf406, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e45, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7725, + 0x0000, 0x0000, 0x0000, 0x0000, 0x644b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2445, + 0x0000, 0x0000, 0x2e09, 0x2f84, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e04, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8086, 0x0000, 0x0000, + 0x114a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5aa5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6d88, 0x7a64, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2e68, 0x04c4, 0x0000, 0x0000, 0x0000, 0xa207, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a65, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9606, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b46, 0x250c, 0x0da5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5286, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7628, 0x1b05, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8846, 0x0a29, 0x0000, 0x0000, 0x0000, + 0x0000, 0x30e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f28, 0x2847, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb086, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x41ca, 0x4f05, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1d68, 0x1206, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7586, 0x0000, 0x0000, 0x0000, 0x2d44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x26a8, 0x1885, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xef07, 0x0000, 0xa147, 0x0000, 0x55c4, + 0x0000, 0x0000, 0x5848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x338b, 0x0000, + 0x0000, 0x0000, 0x0000, 0x03c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x016d, 0x78e7, 0x5ecc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x1b84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6d28, 0x76c4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xc566, 0x0000, 0x0000, 0x004d, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddc7, + 0x312a, 0x20e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6649, 0x3907, 0x0000, 0x0000, 0x1f68, 0x1646, 0x3129, 0x0c25, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5446, 0x1beb, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13f2, 0xcce6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x50e8, 0x74c7, 0x0000, 0x17e4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2b49, 0x14a5, 0x0000, 0x6da5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xa227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x148e, 0x0000, 0x0000, 0x0000, 0x3dac, 0x0725, 0x1e28, 0x3965, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1c88, 0x2886, 0x03d5, 0x0000, 0x0000, 0x71c7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5bc9, 0x5827, + 0x1b28, 0x0924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4f88, 0x30a5, 0x0000, 0xb026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6fa6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a2c, 0x0000, + 0x0000, 0x0000, 0x77e8, 0x0000, 0x0000, 0x0000, 0x0000, 0xb326, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2328, 0x17a5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x02c8, 0x0046, 0x0000, 0x0000, 0x334a, 0x2c47, 0x0000, 0x0000, + 0x0000, 0x0000, 0x352c, 0x0000, 0x3368, 0x0786, 0x01cd, 0xc967, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8c6, 0x4a8b, 0x0000, + 0x0000, 0x19c5, 0x0000, 0x0647, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4daa, 0x40a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a04, 0x1bea, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ea8, 0x0807, + 0x0000, 0x0000, 0x0000, 0x0000, 0x22ce, 0x0000, 0x4b88, 0x0000, + 0x0000, 0xbbc6, 0x212a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x26cc, 0xdc67, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1025, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa986, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3f2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7d0b, 0x0000, 0x0000, 0x78c6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x68e6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4fa5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x49c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x2305, 0x0000, 0x0000, + 0x0000, 0xad46, 0x0000, 0x0000, 0x0000, 0x2325, 0x0000, 0x8507, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72a6, 0x0000, 0x0000, + 0x1809, 0x4567, 0x0000, 0x0000, 0x7629, 0xeb46, 0x0000, 0x0000, + 0x0000, 0x78a6, 0x0000, 0x0000, 0x3d28, 0x0427, 0x0000, 0x0000, + 0x0000, 0x7524, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6da4, + 0x0000, 0x56a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2da4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x60cb, 0x00e5, 0x0000, 0x5bc4, + 0x0000, 0x0000, 0x1da8, 0x2d05, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x66c9, 0x5c86, 0x0000, 0x0000, + 0x7428, 0xb9a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7d26, 0x0000, 0x0000, 0x0000, 0x0000, 0x046f, 0x67e4, + 0x0000, 0x0000, 0x300c, 0x22a4, 0x0000, 0x0000, 0x0000, 0xa8e6, + 0x0000, 0x0367, 0x0000, 0x0000, 0x7b08, 0x0000, 0x2109, 0x4505, + 0x0000, 0x3224, 0x0000, 0x0000, 0x0000, 0x58c6, 0x0000, 0x9766, + 0x0000, 0x0000, 0x40e8, 0x19a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0529, 0x4867, 0x0000, 0x59a4, 0x0000, 0x0000, 0x7e68, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x64a4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3d24, 0x0000, 0x0000, 0x0000, 0x8006, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f87, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3b29, 0x0000, 0x0000, 0x0000, + 0x526c, 0x6c06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0349, 0x6667, 0x0000, 0x0667, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1049, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1ca8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5444, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6044, 0x068b, 0x09e5, 0x0000, 0x0000, + 0x0000, 0xd046, 0x0000, 0x3326, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x62a5, 0x0000, 0x1f64, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6f25, 0x15c8, 0x1404, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6d06, 0x0000, 0x72c6, 0x4728, 0x2187, 0x0000, 0x0000, + 0x0000, 0x9906, 0x0000, 0xaa26, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ec5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5b65, 0x0000, 0x0000, 0x0000, 0x0000, + 0x17cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x194a, 0x4e44, 0x3789, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6868, 0x0000, 0x0237, 0xbec7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3ba7, 0x0000, 0x0000, 0x7c4a, 0xabc6, 0x0992, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c68, 0x23e7, + 0x0000, 0xada6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x38e8, 0x3005, 0x0000, 0x0000, 0x0000, 0x2105, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7d28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f25, + 0x0000, 0x0000, 0x0000, 0x6a64, 0x1e68, 0x2ce7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23ea, 0x0d24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6b26, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6669, 0xaf46, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x15cd, 0x1c05, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5ec4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51e8, 0x47a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x100b, 0x2be7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c5, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x55e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xbea6, 0x0000, 0x0000, 0x0000, 0x7e24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a84, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x69e8, 0x0000, 0x160b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c11, 0x7b25, + 0x0000, 0x4ce4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xefe7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ee4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0368, 0x1704, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04cd, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7ee4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8806, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc626, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1c6a, 0x0000, 0x0000, 0x0000, + 0x3bc8, 0x2d06, 0x0000, 0x0000, 0x0000, 0x0be7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5768, 0x0000, 0x0000, 0x0000, + 0x034e, 0x0000, 0x0000, 0x0000, 0x0000, 0x48a6, 0x0000, 0x0000, + 0x0000, 0x5c64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5ca9, 0x0864, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3a08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x054e, 0x0000, 0x0c0a, 0x0000, 0x0000, 0x0000, 0x6ca8, 0x4004, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1968, 0x0000, + 0x0000, 0x3824, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2009, 0x2c64, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5eca, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6765, 0x0000, 0x0000, + 0x0000, 0x0000, 0x48ac, 0x0805, 0x0000, 0x3744, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7a25, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xabe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fc4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2f0c, 0x2264, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x76e6, 0x0000, 0xbe06, + 0x0000, 0xdb26, 0x2b88, 0x2e26, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x21a4, 0x2468, 0x3c05, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x01f4, 0x0000, 0x0000, 0x0000, 0x0000, 0xa7a6, 0x0000, 0x7f26, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6ec8, 0xe246, 0x42a8, 0x0000, 0x0000, 0xb5a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6888, 0x1a64, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0270, 0x0000, 0x1388, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7e25, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6686, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2b68, 0x1c85, 0x0000, 0x0000, 0x0000, 0x8d67, + 0x0000, 0x9f86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a2a, 0xe006, + 0x0000, 0x0000, 0x30a9, 0x2465, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41aa, 0x0000, + 0x0000, 0x0000, 0x38ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x5347, + 0x0000, 0x0000, 0x0000, 0x34c4, 0x72c9, 0x2c65, 0x0000, 0x0000, + 0x0000, 0x0000, 0x14ab, 0x0000, 0x2089, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c25, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7245, 0x0000, 0x0000, + 0x0000, 0x1d45, 0x0000, 0xace7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2648, 0x0000, 0x0000, 0x0000, + 0x7369, 0xefe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x146d, 0x0000, 0x0000, 0x0000, 0x0000, 0xa407, 0x65c9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x5865, 0x0000, 0x0000, 0x0000, 0xbaa7, 0x016a, 0x34a6, + 0x5bac, 0x0000, 0x0000, 0x0000, 0x2aa9, 0x0000, 0x0000, 0x0000, + 0x0c4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7ec8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x11cf, 0x0cc6, 0x0000, 0x0000, + 0x03d7, 0x0000, 0x0000, 0x66e7, 0x0000, 0x82a6, 0x0000, 0x0000, + 0x0000, 0xf147, 0x0000, 0xbd06, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0ae6, 0x0000, 0x9b66, 0x1ea9, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0608, 0x0887, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0fc8, 0x0b04, 0x4e29, 0x7544, 0x0000, 0x0000, 0x2bea, 0x0000, + 0x0000, 0x0000, 0x0ea8, 0xd086, 0x0000, 0x5867, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3265, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e9, 0x0000, + 0x0000, 0x2346, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0109, 0x0584, 0x0000, 0x0000, 0x1689, 0x2b44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4429, 0x5f27, 0x0000, 0x0000, 0x6869, 0x5e06, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7448, 0xf206, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51ac, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2b08, 0x0000, 0x0000, 0xb966, + 0x6d69, 0x1726, 0x0000, 0x0000, 0x3868, 0x0ba7, 0x5e28, 0x28e4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f85, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ce4, 0x0000, 0x0000, + 0x0000, 0x3e64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x19ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c04, + 0x0000, 0x7907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7248, 0x0000, 0x0000, 0x0000, 0x0000, 0x31e7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1c09, 0x4666, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5806, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6ba8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7646, 0x29ac, 0x5d45, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x71c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4f06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xae26, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbd46, 0x0000, 0x0000, + 0x0000, 0x0000, 0x192a, 0x0000, 0x3fca, 0xaca6, 0x0000, 0x0000, + 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0284, 0x0000, 0x0000, + 0x0000, 0x9c66, 0x0000, 0x0000, 0x0000, 0x9166, 0x0000, 0x0000, + 0x0000, 0x2666, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8867, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0344, 0x0000, 0x0000, 0x0000, 0x6e24, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4da4, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x43c5, 0x0000, 0x2b86, + 0x0000, 0x6c85, 0x0000, 0x0000, 0x0000, 0x0000, 0x3628, 0x0000, + 0x0000, 0x0000, 0x606a, 0xbae7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1aea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f8d, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x06ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0e13, 0x07c7, 0x0000, 0x6b04, 0x21cc, 0x0000, + 0x4788, 0x0000, 0x0000, 0x0000, 0x0000, 0x7566, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c06, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50e4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1b8a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3a0e, 0x0000, 0x0000, 0x0da4, 0x0000, 0x0000, + 0x0000, 0xda46, 0x0000, 0x0000, 0x0000, 0x4066, 0x0000, 0x0000, + 0x0000, 0x46c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x086a, 0x0504, 0x0000, 0x0000, 0x25a8, 0x6424, 0x0000, 0x0000, + 0x736b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f27, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4707, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1ee9, 0x0000, 0x0000, 0x0000, 0x0000, 0x50a4, + 0x0000, 0x0000, 0x290c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa006, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x280a, 0x0385, 0x2d09, 0x45c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f86, + 0x0000, 0x0000, 0x6829, 0x6bc6, 0x0000, 0x6b05, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5c0a, 0x0b85, 0x0000, 0x0000, + 0x7388, 0xf0e6, 0x0000, 0xb8e6, 0x2d08, 0x49c5, 0x0000, 0x0000, + 0x0000, 0xbe26, 0x0000, 0x0000, 0x0000, 0x58a6, 0x0000, 0x0000, + 0x3bad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3c69, 0x0000, 0x0000, 0x0000, 0x0000, 0x97a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3ee8, 0x7fc4, 0x0000, 0xd607, + 0x0000, 0x3a46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b64, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c8a, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1e2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x7888, 0xfaa6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8986, 0x0000, 0x0000, + 0x0000, 0x7747, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xf4c7, 0x0000, 0x0000, 0x0448, 0x44a6, + 0x770a, 0x0000, 0x0000, 0x5185, 0x0971, 0x51e4, 0x0000, 0x0000, + 0x53c8, 0x1244, 0x0000, 0x0000, 0x0000, 0x0000, 0x40c9, 0x13e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x12ed, 0x0000, 0x0000, 0x8066, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x76c8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7c27, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0de9, 0x3ea7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3885, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1d28, 0x12a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x48cc, 0x0000, 0x0000, 0x0000, 0x6428, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c4, 0x0000, 0x0000, + 0x2e2a, 0x0000, 0x0490, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1d8a, 0x5a27, 0x35ca, 0x1e27, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xe326, 0x0210, 0x86c6, 0x7faa, 0x0000, 0x0000, 0x32c5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xe4c7, 0x0000, 0x0000, 0x0000, 0x3604, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6745, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6609, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d05, 0x58c8, 0x2524, + 0x0000, 0x34e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3fc8, 0x0000, 0x0000, 0x8306, 0x0000, 0x0000, + 0x0000, 0x4d46, 0x0000, 0x0000, 0x0000, 0x4104, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7bc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2824, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5a67, 0x0000, 0x0000, 0x7328, 0x0000, + 0x0000, 0x0000, 0x3768, 0x31a5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6b06, 0x0000, 0x0000, 0x0000, 0x1167, + 0x234d, 0x7aa5, 0x0000, 0x2405, 0x0000, 0x0000, 0x0000, 0xec47, + 0x4be8, 0x0704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x13c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d28, 0xaf66, + 0x0000, 0x96a6, 0x0000, 0x0000, 0x466b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e44, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2e24, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4dc6, 0x0000, 0x0000, + 0x0000, 0xafe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e0a, 0x1407, + 0x0000, 0x2d64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4b29, 0x0000, 0x15cb, 0x2486, + 0x0000, 0x0000, 0x41a9, 0x1625, 0x0000, 0x0000, 0x0000, 0x55a6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50e7, 0x0000, 0x0000, + 0x0000, 0x1424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a46, 0x0000, 0x0000, + 0x0000, 0xe0a6, 0x0000, 0x0000, 0x0000, 0xd287, 0x0000, 0x0000, + 0x3aa9, 0x0000, 0x4268, 0x99c7, 0x1caa, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x218c, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x34a8, 0x0d46, 0x0daa, 0x0825, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x4a68, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2eca, 0xe507, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0d49, 0x0000, 0x32a9, 0x00c6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e25, + 0x0000, 0x6ac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x11c5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x476b, 0x3a45, + 0x31e9, 0x1724, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x12a8, 0x3287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6b88, 0xe706, 0x0000, 0x0000, 0x6549, 0x4ea6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x01b8, 0x2f24, 0x0000, 0xe647, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xbba6, 0x0000, 0x0000, 0x0000, 0x1684, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3d64, 0x1d4a, 0x1564, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4eea, 0x4944, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x7469, 0x0000, 0x154b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc666, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fa5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3505, 0x0000, 0x0000, + 0x5948, 0x0000, 0x0000, 0x0000, 0x0000, 0x55a7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3489, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x35a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e08, 0x0247, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0e8e, 0x06a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x47e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5464, 0x0000, 0x0000, 0x0000, 0xb206, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50e6, 0x0000, 0x0000, + 0x0000, 0xa6c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3a88, 0x1a26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2ac4, 0x0000, 0x0000, 0x0000, 0x7404, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xe5c7, 0x0cb0, 0x3e04, 0x51cb, 0x27c4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ee8, 0x7267, + 0x5ec8, 0x1944, 0x0000, 0x0000, 0x402c, 0x8fc7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x62ea, 0x0000, 0x66ab, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6384, 0x71a9, 0x37a6, + 0x610a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4846, 0x0000, 0x0000, 0x0000, 0xad66, 0x0000, 0x0000, + 0x0000, 0x36c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5fc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x43a7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6e06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc46, + 0x0000, 0x0000, 0x7aeb, 0x0000, 0x6009, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x5c2c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x1c44, 0x03c8, 0x3545, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0eb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2b24, 0x0000, 0x0000, 0x0000, 0x3024, 0x0000, 0x31c5, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2b64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fa9, 0x9d67, + 0x5088, 0x1105, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3aa7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22c4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x3624, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb1e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5da6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4448, 0x2fa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x22ac, 0x0000, 0x0000, 0x5826, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x38a6, 0x4308, 0x4564, 0x0000, 0x0000, + 0x7b6a, 0x8a67, 0x0000, 0x0000, 0x2e49, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2024, 0x0000, 0xdd07, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x85e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a66, + 0x0000, 0x6864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xfac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5709, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0be9, 0xd6c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0345, 0x0000, 0x44c4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x70a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x66c8, 0x0000, 0x0000, 0x70c4, 0x0000, 0x0000, 0x0000, 0x64e6, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c7, 0x0000, 0x4d85, + 0x4b28, 0x0444, 0x0000, 0x0000, 0x1549, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4324, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2985, 0x0000, 0x0000, 0x7889, 0xeea6, + 0x16c8, 0x20a6, 0x0000, 0x0000, 0x0000, 0xd726, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x74a4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc926, 0x0000, 0x6fe7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6585, + 0x0000, 0x0000, 0x7429, 0xec46, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6147, 0x0000, 0x0000, 0x0000, 0x1124, + 0x0000, 0xa446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xcfa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xc6e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x668b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1729, 0x0b25, + 0x0000, 0x7b66, 0x1ccc, 0x00c5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x07eb, 0x03a6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x26e4, 0x0000, 0x0000, 0x0b48, 0x1547, + 0x0000, 0xf526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b6b, 0x0000, + 0x022c, 0x3dc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x21c5, 0x0000, 0x2284, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbe66, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3d49, 0x00e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x15e9, 0x4987, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6246, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4887, 0x4e68, 0x0b07, + 0x37e9, 0x6d05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x69a8, 0x5be6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x03e5, 0x2948, 0x0000, 0x398a, 0x4244, 0x4729, 0x3506, + 0x0000, 0x0000, 0x0000, 0xa2c7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4a65, 0x0000, 0x0000, 0x0000, 0x01a5, + 0x2848, 0x0c26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x7fa7, 0x144b, 0x85e7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e71, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xafc6, 0x0000, 0x8ae7, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x0000, 0x0f28, 0x3d05, + 0x0000, 0x2166, 0x0000, 0x0000, 0x0000, 0xf7e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9066, 0x0000, 0xc4e6, + 0x0000, 0xb3c6, 0x03e9, 0x0000, 0x0000, 0x2f25, 0x0cb1, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3b89, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfce7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xe587, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0470, 0x6965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4544, 0x0000, 0x0000, 0x0000, 0x4305, 0x09e9, 0x19e5, + 0x0000, 0xab67, 0x0000, 0x0000, 0x0000, 0x3504, 0x6228, 0x2a07, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x7004, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1be9, 0x5dc7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1dcc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2fec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x4b64, 0x5aaa, 0x0164, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b84, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xc206, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5504, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0289, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2e7, 0x0000, 0x0000, + 0x2489, 0x0e05, 0x0000, 0x0000, 0x2c8a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf566, + 0x0000, 0x0000, 0x0000, 0x9b86, 0x198a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6c66, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x01e8, 0x5884, 0x39e8, 0x4664, 0x0000, 0x3ec4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x142a, 0x2b66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3ac8, 0x0424, 0x0000, 0x1ec7, + 0x4768, 0x0146, 0x0000, 0x4e45, 0x4cc8, 0x0000, 0x1daa, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x030d, 0x0245, 0x0000, 0x3f46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03d6, 0x26a4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1189, 0x0000, 0x0000, 0x0000, 0x0000, 0x8406, + 0x0000, 0x0000, 0x0000, 0xd506, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x8186, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa466, 0x0aa9, 0x0ac5, + 0x2108, 0x4185, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0d6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0f6a, 0x73e4, 0x0000, 0x0000, 0x1389, 0x8fa7, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6145, 0x0000, 0x3ec5, 0x1888, 0x0000, + 0x0000, 0x0000, 0x0000, 0xa406, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6ae5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x37c9, 0xaf07, + 0x0000, 0x0000, 0x0000, 0x7d64, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x8926, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4428, 0x4c87, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x06cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x1587, 0x0000, 0x0000, + 0x0000, 0x80a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x4704, 0x0000, 0x0000, 0x0000, 0x5b84, + 0x4d2a, 0x0000, 0x0000, 0x79c6, 0x2f2a, 0x7ba7, 0x5ba8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3584, 0x0000, 0x0000, + 0x532c, 0xfbe7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x64ca, 0x23e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc066, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x16cd, 0xc367, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c87, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0xcae6, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6dc8, 0xe526, 0x0000, 0xc426, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0bac, 0x0000, 0x5968, 0x7c44, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x07e4, 0x0000, 0x49e4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x5da5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x446c, 0x2dc5, 0x0000, 0x0000, 0x0000, 0xda67, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b27, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6e6, + 0x0000, 0x6086, 0x6faa, 0x0000, 0x0000, 0x0000, 0x0614, 0x0000, + 0x0000, 0x6705, 0x0000, 0x0000, 0x564a, 0xc0e7, 0x1cc8, 0x3707, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0411, 0x0000, 0x2989, 0x1b04, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7244, 0x0000, 0x0000, + 0x340a, 0x4687, 0x0000, 0x72c4, 0x0000, 0xdc86, 0x0000, 0x0000, + 0x0078, 0x0000, 0x0000, 0x0b84, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3ea8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x6a6a, 0x5ce5, 0x0000, 0x0624, 0x0000, 0x6de6, 0x0000, 0x0000, + 0x05e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c24, + 0x0000, 0x9646, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x18a8, 0x2205, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x6f69, 0xeee7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f24, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x32e4, + 0x0000, 0x4604, 0x0000, 0x0000, 0x3d4d, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x046b, 0x3b64, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3444, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x47e4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0b90, 0x6647, 0x0000, 0x0000, 0x3328, 0x1bc6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x78e9, 0xeb06, 0x0000, 0x0000, 0x0000, 0x4f26, + 0x0000, 0xa386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0aca, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6624, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e45, 0x0000, 0x0000, + 0x0000, 0x7246, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x6ea8, 0x0000, 0x0000, 0x3544, + 0x31e8, 0x0746, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4349, 0x0cc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x6d87, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1169, 0x46c5, 0x0000, 0x0606, + 0x0192, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0068, 0x0e46, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x4808, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x74a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5686, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5e0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2ee4, 0x0000, 0x7e66, 0x0000, 0x0000, + 0x0c09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x03cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a28, 0xaec6, + 0x534a, 0x0000, 0x1ec8, 0x3145, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x36a9, 0x0000, 0x0000, 0x0000, + 0x2809, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d66, 0x0000, 0x6c47, + 0x0000, 0x2904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x7d08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5d08, 0x0ca4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ac5, + 0x0000, 0x0000, 0x160a, 0x0000, 0x4f0a, 0x0126, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x68e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x342b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x1ed2, 0xf166, 0x18c8, 0x0000, 0x0000, 0xdd67, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x69c6, 0x1508, 0x1744, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x6d65, 0x0000, 0x0000, 0x3ba9, 0x60a5, 0x48a8, 0x4fe4, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda66, + 0x0000, 0x0000, 0x0000, 0x0000, 0x13cd, 0x6d26, 0x0000, 0x3284, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x30e5, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x5388, 0x6e64, 0x0000, 0x09c6, 0x4e8c, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xb686, 0x0000, 0x7846, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x3985, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x044b, 0x18e4, 0x0000, 0x0000, 0x0000, 0x3086, 0x3b4e, 0x0000, + 0x21eb, 0x0000, 0x29a9, 0x3fe4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0636, 0x0000, 0x7b8c, 0x0000, 0x5868, 0x7545, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e86, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5e6, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x23ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2b07, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x406a, 0x3aa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3289, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e84, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0885, 0x1b0b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x3d08, 0x2a24, 0x0000, 0x0000, 0x2068, 0x1d87, + 0x0000, 0x0000, 0x4d09, 0x01e4, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x5e8c, 0xbc06, 0x0000, 0x5ea6, 0x0000, 0x9e46, + 0x0000, 0x0000, 0x0d88, 0x4ac5, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +} // namespace brotli + +#endif // BROTLI_ENC_DICTIONARY_HASH_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode.cc new file mode 100644 index 0000000..8aa3309 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode.cc @@ -0,0 +1,589 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Implementation of Brotli compressor. + +#include "./encode.h" + +#include +#include + +#include "./backward_references.h" +#include "./bit_cost.h" +#include "./block_splitter.h" +#include "./brotli_bit_stream.h" +#include "./cluster.h" +#include "./context.h" +#include "./metablock.h" +#include "./transform.h" +#include "./entropy_encode.h" +#include "./fast_log.h" +#include "./hash.h" +#include "./histogram.h" +#include "./literal_cost.h" +#include "./prefix.h" +#include "./write_bits.h" + +namespace brotli { + +static const double kMinUTF8Ratio = 0.75; + +int ParseAsUTF8(int* symbol, const uint8_t* input, int size) { + // ASCII + if ((input[0] & 0x80) == 0) { + *symbol = input[0]; + if (*symbol > 0) { + return 1; + } + } + // 2-byte UTF8 + if (size > 1 && + (input[0] & 0xe0) == 0xc0 && + (input[1] & 0xc0) == 0x80) { + *symbol = (((input[0] & 0x1f) << 6) | + (input[1] & 0x3f)); + if (*symbol > 0x7f) { + return 2; + } + } + // 3-byte UFT8 + if (size > 2 && + (input[0] & 0xf0) == 0xe0 && + (input[1] & 0xc0) == 0x80 && + (input[2] & 0xc0) == 0x80) { + *symbol = (((input[0] & 0x0f) << 12) | + ((input[1] & 0x3f) << 6) | + (input[2] & 0x3f)); + if (*symbol > 0x7ff) { + return 3; + } + } + // 4-byte UFT8 + if (size > 3 && + (input[0] & 0xf8) == 0xf0 && + (input[1] & 0xc0) == 0x80 && + (input[2] & 0xc0) == 0x80 && + (input[3] & 0xc0) == 0x80) { + *symbol = (((input[0] & 0x07) << 18) | + ((input[1] & 0x3f) << 12) | + ((input[2] & 0x3f) << 6) | + (input[3] & 0x3f)); + if (*symbol > 0xffff && *symbol <= 0x10ffff) { + return 4; + } + } + // Not UTF8, emit a special symbol above the UTF8-code space + *symbol = 0x110000 | input[0]; + return 1; +} + +// Returns true if at least min_fraction of the data is UTF8-encoded. +bool IsMostlyUTF8(const uint8_t* data, size_t length, double min_fraction) { + size_t size_utf8 = 0; + size_t pos = 0; + while (pos < length) { + int symbol; + int bytes_read = ParseAsUTF8(&symbol, data + pos, length - pos); + pos += bytes_read; + if (symbol < 0x110000) size_utf8 += bytes_read; + } + return size_utf8 > min_fraction * length; +} + +void RecomputeDistancePrefixes(Command* cmds, + size_t num_commands, + int num_direct_distance_codes, + int distance_postfix_bits) { + if (num_direct_distance_codes == 0 && + distance_postfix_bits == 0) { + return; + } + for (int i = 0; i < num_commands; ++i) { + Command* cmd = &cmds[i]; + if (cmd->copy_len_ > 0 && cmd->cmd_prefix_ >= 128) { + PrefixEncodeCopyDistance(cmd->DistanceCode(), + num_direct_distance_codes, + distance_postfix_bits, + &cmd->dist_prefix_, + &cmd->dist_extra_); + } + } +} + +uint8_t* BrotliCompressor::GetBrotliStorage(size_t size) { + if (storage_size_ < size) { + storage_.reset(new uint8_t[size]); + storage_size_ = size; + } + return &storage_[0]; +} + +BrotliCompressor::BrotliCompressor(BrotliParams params) + : params_(params), + hashers_(new Hashers()), + input_pos_(0), + num_commands_(0), + last_insert_len_(0), + last_flush_pos_(0), + last_processed_pos_(0), + prev_byte_(0), + prev_byte2_(0), + storage_size_(0) { + // Sanitize params. + params_.quality = std::max(0, params_.quality); + if (params_.lgwin < kMinWindowBits) { + params_.lgwin = kMinWindowBits; + } else if (params_.lgwin > kMaxWindowBits) { + params_.lgwin = kMaxWindowBits; + } + if (params_.lgblock == 0) { + params_.lgblock = 16; + if (params_.quality >= 9 && params_.lgwin > params_.lgblock) { + params_.lgblock = std::min(21, params_.lgwin); + } + } else { + params_.lgblock = std::min(kMaxInputBlockBits, + std::max(kMinInputBlockBits, params_.lgblock)); + } + if (params_.quality <= 9) { + params_.enable_dictionary = false; + params_.enable_transforms = false; + params_.greedy_block_split = true; + params_.enable_context_modeling = false; + } + + // Set maximum distance, see section 9.1. of the spec. + max_backward_distance_ = (1 << params_.lgwin) - 16; + + // Initialize input and literal cost ring buffers. + // We allocate at least lgwin + 1 bits for the ring buffer so that the newly + // added block fits there completely and we still get lgwin bits and at least + // read_block_size_bits + 1 bits because the copy tail length needs to be + // smaller than ringbuffer size. + int ringbuffer_bits = std::max(params_.lgwin + 1, params_.lgblock + 1); + ringbuffer_.reset(new RingBuffer(ringbuffer_bits, params_.lgblock)); + if (params_.quality > 9) { + literal_cost_mask_ = (1 << params_.lgblock) - 1; + literal_cost_.reset(new float[literal_cost_mask_ + 1]); + } + + // Allocate command buffer. + cmd_buffer_size_ = std::max(1 << 18, 1 << params_.lgblock); + commands_.reset(new brotli::Command[cmd_buffer_size_]); + + // Initialize last byte with stream header. + if (params_.lgwin == 16) { + last_byte_ = 0; + last_byte_bits_ = 1; + } else { + last_byte_ = ((params_.lgwin - 17) << 1) | 1; + last_byte_bits_ = 4; + } + + // Initialize distance cache. + dist_cache_[0] = 4; + dist_cache_[1] = 11; + dist_cache_[2] = 15; + dist_cache_[3] = 16; + + // Initialize hashers. + switch (params_.quality) { + case 0: + case 1: hash_type_ = 1; break; + case 2: + case 3: hash_type_ = 2; break; + case 4: hash_type_ = 3; break; + case 5: + case 6: hash_type_ = 4; break; + case 7: hash_type_ = 5; break; + case 8: hash_type_ = 6; break; + case 9: hash_type_ = 7; break; + default: // quality > 9 + hash_type_ = (params_.mode == BrotliParams::MODE_TEXT) ? 8 : 9; + } + hashers_->Init(hash_type_); + if (params_.mode == BrotliParams::MODE_TEXT && + params_.enable_dictionary) { + StoreDictionaryWordHashes(params_.enable_transforms); + } +} + +BrotliCompressor::~BrotliCompressor() { +} + +StaticDictionary* BrotliCompressor::static_dictionary_ = NULL; + +void BrotliCompressor::StoreDictionaryWordHashes(bool enable_transforms) { + if (static_dictionary_ == NULL) { + static_dictionary_ = new StaticDictionary; + static_dictionary_->Fill(enable_transforms); + } + hashers_->SetStaticDictionary(static_dictionary_); +} + +void BrotliCompressor::CopyInputToRingBuffer(const size_t input_size, + const uint8_t* input_buffer) { + ringbuffer_->Write(input_buffer, input_size); + input_pos_ += input_size; + + // Erase a few more bytes in the ring buffer to make hashing not + // depend on uninitialized data. This makes compression deterministic + // and it prevents uninitialized memory warnings in Valgrind. Even + // without erasing, the output would be valid (but nondeterministic). + // + // Background information: The compressor stores short (at most 8 bytes) + // substrings of the input already read in a hash table, and detects + // repetitions by looking up such substrings in the hash table. If it + // can find a substring, it checks whether the substring is really there + // in the ring buffer (or it's just a hash collision). Should the hash + // table become corrupt, this check makes sure that the output is + // still valid, albeit the compression ratio would be bad. + // + // The compressor populates the hash table from the ring buffer as it's + // reading new bytes from the input. However, at the last few indexes of + // the ring buffer, there are not enough bytes to build full-length + // substrings from. Since the hash table always contains full-length + // substrings, we erase with dummy 0s here to make sure that those + // substrings will contain 0s at the end instead of uninitialized + // data. + // + // Please note that erasing is not necessary (because the + // memory region is already initialized since he ring buffer + // has a `tail' that holds a copy of the beginning,) so we + // skip erasing if we have already gone around at least once in + // the ring buffer. + size_t pos = ringbuffer_->position(); + // Only clear during the first round of ringbuffer writes. On + // subsequent rounds data in the ringbuffer would be affected. + if (pos <= ringbuffer_->mask()) { + // This is the first time when the ring buffer is being written. + // We clear 3 bytes just after the bytes that have been copied from + // the input buffer. + // + // The ringbuffer has a "tail" that holds a copy of the beginning, + // but only once the ring buffer has been fully written once, i.e., + // pos <= mask. For the first time, we need to write values + // in this tail (where index may be larger than mask), so that + // we have exactly defined behavior and don't read un-initialized + // memory. Due to performance reasons, hashing reads data using a + // LOAD32, which can go 3 bytes beyond the bytes written in the + // ringbuffer. + memset(ringbuffer_->start() + pos, 0, 3); + } +} + +bool BrotliCompressor::WriteBrotliData(const bool is_last, + const bool force_flush, + size_t* out_size, + uint8_t** output) { + const size_t bytes = input_pos_ - last_processed_pos_; + const uint8_t* data = ringbuffer_->start(); + const size_t mask = ringbuffer_->mask(); + + if (bytes > input_block_size()) { + return false; + } + + bool utf8_mode = + params_.enable_context_modeling && + IsMostlyUTF8(&data[last_processed_pos_ & mask], bytes, kMinUTF8Ratio); + + if (literal_cost_.get()) { + if (utf8_mode) { + EstimateBitCostsForLiteralsUTF8(last_processed_pos_, bytes, mask, + literal_cost_mask_, data, + literal_cost_.get()); + } else { + EstimateBitCostsForLiterals(last_processed_pos_, bytes, mask, + literal_cost_mask_, + data, literal_cost_.get()); + } + } + double base_min_score = params_.enable_context_modeling ? 8.115 : 4.0; + CreateBackwardReferences(bytes, last_processed_pos_, data, mask, + literal_cost_.get(), + literal_cost_mask_, + max_backward_distance_, + base_min_score, + params_.quality, + hashers_.get(), + hash_type_, + dist_cache_, + &last_insert_len_, + &commands_[num_commands_], + &num_commands_); + + if (!is_last && !force_flush && + num_commands_ + (input_block_size() >> 1) < cmd_buffer_size_ && + input_pos_ + input_block_size() <= last_flush_pos_ + mask + 1) { + // Everything will happen later. + last_processed_pos_ = input_pos_; + *out_size = 0; + return true; + } + + // Create the last insert-only command. + if (last_insert_len_ > 0) { + brotli::Command cmd(last_insert_len_); + commands_[num_commands_++] = cmd; + last_insert_len_ = 0; + } + + return WriteMetaBlockInternal(is_last, utf8_mode, out_size, output); +} + +bool BrotliCompressor::WriteMetaBlockInternal(const bool is_last, + const bool utf8_mode, + size_t* out_size, + uint8_t** output) { + const size_t bytes = input_pos_ - last_flush_pos_; + const uint8_t* data = ringbuffer_->start(); + const size_t mask = ringbuffer_->mask(); + const size_t max_out_size = 2 * bytes + 500; + uint8_t* storage = GetBrotliStorage(max_out_size); + storage[0] = last_byte_; + int storage_ix = last_byte_bits_; + + bool uncompressed = false; + if (num_commands_ < (bytes >> 8) + 2) { + int num_literals = 0; + for (int i = 0; i < num_commands_; ++i) { + num_literals += commands_[i].insert_len_; + } + if (num_literals > 0.99 * bytes) { + int literal_histo[256] = { 0 }; + static const int kSampleRate = 13; + static const double kMinEntropy = 7.92; + static const double kBitCostThreshold = bytes * kMinEntropy / kSampleRate; + for (int i = last_flush_pos_; i < input_pos_; i += kSampleRate) { + ++literal_histo[data[i & mask]]; + } + if (BitsEntropy(literal_histo, 256) > kBitCostThreshold) { + uncompressed = true; + } + } + } + + if (bytes == 0) { + if (!StoreCompressedMetaBlockHeader(is_last, 0, &storage_ix, &storage[0])) { + return false; + } + storage_ix = (storage_ix + 7) & ~7; + } else if (uncompressed) { + if (!StoreUncompressedMetaBlock(is_last, + data, last_flush_pos_, mask, bytes, + &storage_ix, + &storage[0])) { + return false; + } + } else { + // Save the state of the distance cache in case we need to restore it for + // emitting an uncompressed block. + int saved_dist_cache[4]; + memcpy(saved_dist_cache, dist_cache_, sizeof(dist_cache_)); + int num_direct_distance_codes = 0; + int distance_postfix_bits = 0; + if (params_.quality > 9 && params_.mode == BrotliParams::MODE_FONT) { + num_direct_distance_codes = 12; + distance_postfix_bits = 1; + RecomputeDistancePrefixes(commands_.get(), + num_commands_, + num_direct_distance_codes, + distance_postfix_bits); + } + int literal_context_mode = utf8_mode ? CONTEXT_UTF8 : CONTEXT_SIGNED; + MetaBlockSplit mb; + if (params_.greedy_block_split) { + BuildMetaBlockGreedy(data, last_flush_pos_, mask, + commands_.get(), num_commands_, + &mb); + } else { + BuildMetaBlock(data, last_flush_pos_, mask, + prev_byte_, prev_byte2_, + commands_.get(), num_commands_, + literal_context_mode, + params_.enable_context_modeling, + &mb); + } + if (params_.quality >= 3) { + OptimizeHistograms(num_direct_distance_codes, + distance_postfix_bits, + &mb); + } + if (!StoreMetaBlock(data, last_flush_pos_, bytes, mask, + prev_byte_, prev_byte2_, + is_last, + num_direct_distance_codes, + distance_postfix_bits, + literal_context_mode, + commands_.get(), num_commands_, + mb, + &storage_ix, + &storage[0])) { + return false; + } + if (bytes + 4 < (storage_ix >> 3)) { + // Restore the distance cache and last byte. + memcpy(dist_cache_, saved_dist_cache, sizeof(dist_cache_)); + storage[0] = last_byte_; + storage_ix = last_byte_bits_; + if (!StoreUncompressedMetaBlock(is_last, data, last_flush_pos_, mask, + bytes, &storage_ix, &storage[0])) { + return false; + } + } + } + last_byte_ = storage[storage_ix >> 3]; + last_byte_bits_ = storage_ix & 7; + last_flush_pos_ = input_pos_; + last_processed_pos_ = input_pos_; + prev_byte_ = data[(last_flush_pos_ - 1) & mask]; + prev_byte2_ = data[(last_flush_pos_ - 2) & mask]; + num_commands_ = 0; + *output = &storage[0]; + *out_size = storage_ix >> 3; + return true; +} + +bool BrotliCompressor::WriteMetaBlock(const size_t input_size, + const uint8_t* input_buffer, + const bool is_last, + size_t* encoded_size, + uint8_t* encoded_buffer) { + CopyInputToRingBuffer(input_size, input_buffer); + size_t out_size = 0; + uint8_t* output; + if (!WriteBrotliData(is_last, /* force_flush = */ true, &out_size, &output) || + out_size > *encoded_size) { + return false; + } + if (out_size > 0) { + memcpy(encoded_buffer, output, out_size); + } + *encoded_size = out_size; + return true; +} + +bool BrotliCompressor::WriteMetadata(const size_t input_size, + const uint8_t* input_buffer, + const bool is_last, + size_t* encoded_size, + uint8_t* encoded_buffer) { + if (input_size > (1 << 24) || input_size + 6 > *encoded_size) { + return false; + } + int storage_ix = last_byte_bits_; + encoded_buffer[0] = last_byte_; + WriteBits(1, 0, &storage_ix, encoded_buffer); + WriteBits(2, 3, &storage_ix, encoded_buffer); + WriteBits(1, 0, &storage_ix, encoded_buffer); + if (input_size == 0) { + WriteBits(2, 0, &storage_ix, encoded_buffer); + *encoded_size = (storage_ix + 7) >> 3; + } else { + size_t nbits = Log2Floor(input_size - 1) + 1; + size_t nbytes = (nbits + 7) / 8; + WriteBits(2, nbytes, &storage_ix, encoded_buffer); + WriteBits(8 * nbytes, input_size - 1, &storage_ix, encoded_buffer); + size_t hdr_size = (storage_ix + 7) >> 3; + memcpy(&encoded_buffer[hdr_size], input_buffer, input_size); + *encoded_size = hdr_size + input_size; + } + if (is_last) { + encoded_buffer[(*encoded_size)++] = 3; + } + last_byte_ = 0; + last_byte_bits_ = 0; + return true; +} + +bool BrotliCompressor::FinishStream( + size_t* encoded_size, uint8_t* encoded_buffer) { + return WriteMetaBlock(0, NULL, true, encoded_size, encoded_buffer); +} + +int BrotliCompressBuffer(BrotliParams params, + size_t input_size, + const uint8_t* input_buffer, + size_t* encoded_size, + uint8_t* encoded_buffer) { + if (*encoded_size == 0) { + // Output buffer needs at least one byte. + return 0; + } + BrotliCompressor compressor(params); + BrotliMemIn in(input_buffer, input_size); + BrotliMemOut out(encoded_buffer, *encoded_size); + if (!BrotliCompress(params, &in, &out)) { + return 0; + } + *encoded_size = out.position(); + return 1; +} + +size_t CopyOneBlockToRingBuffer(BrotliIn* r, BrotliCompressor* compressor) { + const size_t block_size = compressor->input_block_size(); + size_t bytes_read = 0; + const uint8_t* data = reinterpret_cast( + r->Read(block_size, &bytes_read)); + if (data == NULL) { + return 0; + } + compressor->CopyInputToRingBuffer(bytes_read, data); + + // Read more bytes until block_size is filled or an EOF (data == NULL) is + // received. This is useful to get deterministic compressed output for the + // same input no matter how r->Read splits the input to chunks. + for (size_t remaining = block_size - bytes_read; remaining > 0; ) { + size_t more_bytes_read = 0; + data = reinterpret_cast( + r->Read(remaining, &more_bytes_read)); + if (data == NULL) { + break; + } + compressor->CopyInputToRingBuffer(more_bytes_read, data); + bytes_read += more_bytes_read; + remaining -= more_bytes_read; + } + return bytes_read; +} + +bool BrotliInIsFinished(BrotliIn* r) { + size_t read_bytes; + return r->Read(0, &read_bytes) == NULL; +} + +int BrotliCompress(BrotliParams params, BrotliIn* in, BrotliOut* out) { + size_t in_bytes = 0; + size_t out_bytes = 0; + uint8_t* output; + bool final_block = false; + BrotliCompressor compressor(params); + while (!final_block) { + in_bytes = CopyOneBlockToRingBuffer(in, &compressor); + final_block = in_bytes == 0 || BrotliInIsFinished(in); + out_bytes = 0; + if (!compressor.WriteBrotliData(final_block, + /* force_flush = */ false, + &out_bytes, &output)) { + return false; + } + if (out_bytes > 0 && !out->Write(output, out_bytes)) { + return false; + } + } + return true; +} + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode.h new file mode 100644 index 0000000..8804f2b --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode.h @@ -0,0 +1,179 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// API for Brotli compression + +#ifndef BROTLI_ENC_ENCODE_H_ +#define BROTLI_ENC_ENCODE_H_ + +#include +#include +#include +#include +#include "./command.h" +#include "./hash.h" +#include "./ringbuffer.h" +#include "./static_dict.h" +#include "./streams.h" + +namespace brotli { + +static const int kMaxWindowBits = 24; +static const int kMinWindowBits = 16; +static const int kMinInputBlockBits = 16; +static const int kMaxInputBlockBits = 24; + +struct BrotliParams { + BrotliParams() + : mode(MODE_TEXT), + quality(11), + lgwin(22), + lgblock(0), + enable_dictionary(true), + enable_transforms(false), + greedy_block_split(false), + enable_context_modeling(true) {} + + enum Mode { + MODE_TEXT = 0, + MODE_FONT = 1, + }; + Mode mode; + + // Controls the compression-speed vs compression-density tradeoffs. The higher + // the quality, the slower the compression. Range is 0 to 11. + int quality; + // Base 2 logarithm of the sliding window size. Range is 16 to 24. + int lgwin; + // Base 2 logarithm of the maximum input block size. Range is 16 to 24. + // If set to 0, the value will be set based on the quality. + int lgblock; + + // These settings will be respected only if quality > 9. + bool enable_dictionary; + bool enable_transforms; + bool greedy_block_split; + bool enable_context_modeling; +}; + +// An instance can not be reused for multiple brotli streams. +class BrotliCompressor { + public: + explicit BrotliCompressor(BrotliParams params); + ~BrotliCompressor(); + + // The maximum input size that can be processed at once. + size_t input_block_size() const { return 1 << params_.lgblock; } + + // Encodes the data in input_buffer as a meta-block and writes it to + // encoded_buffer (*encoded_size should be set to the size of + // encoded_buffer) and sets *encoded_size to the number of bytes that + // was written. Returns 0 if there was an error and 1 otherwise. + bool WriteMetaBlock(const size_t input_size, + const uint8_t* input_buffer, + const bool is_last, + size_t* encoded_size, + uint8_t* encoded_buffer); + + // Writes a metadata meta-block containing the given input to encoded_buffer. + // *encoded_size should be set to the size of the encoded_buffer. + // Sets *encoded_size to the number of bytes that was written. + // Note that the given input data will not be part of the sliding window and + // thus no backward references can be made to this data from subsequent + // metablocks. + bool WriteMetadata(const size_t input_size, + const uint8_t* input_buffer, + const bool is_last, + size_t* encoded_size, + uint8_t* encoded_buffer); + + // Writes a zero-length meta-block with end-of-input bit set to the + // internal output buffer and copies the output buffer to encoded_buffer + // (*encoded_size should be set to the size of encoded_buffer) and sets + // *encoded_size to the number of bytes written. Returns false if there was + // an error and true otherwise. + bool FinishStream(size_t* encoded_size, uint8_t* encoded_buffer); + + // Copies the given input data to the internal ring buffer of the compressor. + // No processing of the data occurs at this time and this function can be + // called multiple times before calling WriteBrotliData() to process the + // accumulated input. At most input_block_size() bytes of input data can be + // copied to the ring buffer, otherwise the next WriteBrotliData() will fail. + void CopyInputToRingBuffer(const size_t input_size, + const uint8_t* input_buffer); + + // Processes the accumulated input data and sets *out_size to the length of + // the new output meta-block, or to zero if no new output meta-block was + // created (in this case the processed input data is buffered internally). + // If *out_size is positive, *output points to the start of the output data. + // Returns false if the size of the input data is larger than + // input_block_size() or if there was an error during writing the output. + // If is_last or force_flush is true, an output meta-block is always created. + bool WriteBrotliData(const bool is_last, const bool force_flush, + size_t* out_size, uint8_t** output); + + // No-op, but we keep it here for API backward-compatibility. + void WriteStreamHeader() {} + + private: + // Initializes the hasher with the hashes of dictionary words. + void StoreDictionaryWordHashes(bool enable_transforms); + + uint8_t* GetBrotliStorage(size_t size); + + bool WriteMetaBlockInternal(const bool is_last, + const bool utf8_mode, + size_t* out_size, + uint8_t** output); + + BrotliParams params_; + int max_backward_distance_; + std::unique_ptr hashers_; + int hash_type_; + size_t input_pos_; + std::unique_ptr ringbuffer_; + std::unique_ptr literal_cost_; + size_t literal_cost_mask_; + size_t cmd_buffer_size_; + std::unique_ptr commands_; + int num_commands_; + int last_insert_len_; + size_t last_flush_pos_; + size_t last_processed_pos_; + int dist_cache_[4]; + uint8_t last_byte_; + uint8_t last_byte_bits_; + uint8_t prev_byte_; + uint8_t prev_byte2_; + int storage_size_; + std::unique_ptr storage_; + static StaticDictionary *static_dictionary_; +}; + +// Compresses the data in input_buffer into encoded_buffer, and sets +// *encoded_size to the compressed length. +// Returns 0 if there was an error and 1 otherwise. +int BrotliCompressBuffer(BrotliParams params, + size_t input_size, + const uint8_t* input_buffer, + size_t* encoded_size, + uint8_t* encoded_buffer); + +// Same as above, but uses the specified input and output classes instead +// of reading from and writing to pre-allocated memory buffers. +int BrotliCompress(BrotliParams params, BrotliIn* in, BrotliOut* out); + +} // namespace brotli + +#endif // BROTLI_ENC_ENCODE_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode_parallel.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode_parallel.cc new file mode 100644 index 0000000..6bfe7fb --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode_parallel.cc @@ -0,0 +1,356 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Implementation of parallel Brotli compressor. + +#include "./encode_parallel.h" + +#include +#include + +#include "./backward_references.h" +#include "./bit_cost.h" +#include "./block_splitter.h" +#include "./brotli_bit_stream.h" +#include "./cluster.h" +#include "./context.h" +#include "./metablock.h" +#include "./transform.h" +#include "./entropy_encode.h" +#include "./fast_log.h" +#include "./hash.h" +#include "./histogram.h" +#include "./literal_cost.h" +#include "./prefix.h" +#include "./write_bits.h" + +namespace brotli { + +namespace { + +int ParseAsUTF8(int* symbol, const uint8_t* input, int size) { + // ASCII + if ((input[0] & 0x80) == 0) { + *symbol = input[0]; + if (*symbol > 0) { + return 1; + } + } + // 2-byte UTF8 + if (size > 1 && + (input[0] & 0xe0) == 0xc0 && + (input[1] & 0xc0) == 0x80) { + *symbol = (((input[0] & 0x1f) << 6) | + (input[1] & 0x3f)); + if (*symbol > 0x7f) { + return 2; + } + } + // 3-byte UFT8 + if (size > 2 && + (input[0] & 0xf0) == 0xe0 && + (input[1] & 0xc0) == 0x80 && + (input[2] & 0xc0) == 0x80) { + *symbol = (((input[0] & 0x0f) << 12) | + ((input[1] & 0x3f) << 6) | + (input[2] & 0x3f)); + if (*symbol > 0x7ff) { + return 3; + } + } + // 4-byte UFT8 + if (size > 3 && + (input[0] & 0xf8) == 0xf0 && + (input[1] & 0xc0) == 0x80 && + (input[2] & 0xc0) == 0x80 && + (input[3] & 0xc0) == 0x80) { + *symbol = (((input[0] & 0x07) << 18) | + ((input[1] & 0x3f) << 12) | + ((input[2] & 0x3f) << 6) | + (input[3] & 0x3f)); + if (*symbol > 0xffff && *symbol <= 0x10ffff) { + return 4; + } + } + // Not UTF8, emit a special symbol above the UTF8-code space + *symbol = 0x110000 | input[0]; + return 1; +} + +// Returns true if at least min_fraction of the data is UTF8-encoded. +bool IsMostlyUTF8(const uint8_t* data, size_t length, double min_fraction) { + size_t size_utf8 = 0; + for (size_t pos = 0; pos < length; ) { + int symbol; + int bytes_read = ParseAsUTF8(&symbol, data + pos, length - pos); + pos += bytes_read; + if (symbol < 0x110000) size_utf8 += bytes_read; + } + return size_utf8 > min_fraction * length; +} + +void RecomputeDistancePrefixes(std::vector* cmds, + int num_direct_distance_codes, + int distance_postfix_bits) { + if (num_direct_distance_codes == 0 && + distance_postfix_bits == 0) { + return; + } + for (int i = 0; i < cmds->size(); ++i) { + Command* cmd = &(*cmds)[i]; + if (cmd->copy_len_ > 0 && cmd->cmd_prefix_ >= 128) { + PrefixEncodeCopyDistance(cmd->DistanceCode(), + num_direct_distance_codes, + distance_postfix_bits, + &cmd->dist_prefix_, + &cmd->dist_extra_); + } + } +} + +bool WriteMetaBlockParallel(const BrotliParams& params, + const size_t block_size, + const uint8_t* input_buffer, + const size_t prefix_size, + const uint8_t* prefix_buffer, + const StaticDictionary* static_dict, + const bool is_first, + const bool is_last, + size_t* encoded_size, + uint8_t* encoded_buffer) { + if (block_size == 0) { + return false; + } + const size_t input_size = block_size; + + // Copy prefix + next input block into a continuous area. + size_t input_pos = prefix_size; + std::vector input(prefix_size + input_size); + memcpy(&input[0], prefix_buffer, prefix_size); + memcpy(&input[input_pos], input_buffer, input_size); + // Since we don't have a ringbuffer, masking is a no-op. + // We use one less bit than the full range because some of the code uses + // mask + 1 as the size of the ringbuffer. + const size_t mask = std::numeric_limits::max() >> 1; + + uint8_t prev_byte = input_pos > 0 ? input[(input_pos - 1) & mask] : 0; + uint8_t prev_byte2 = input_pos > 1 ? input[(input_pos - 2) & mask] : 0; + + // Decide about UTF8 mode. + static const double kMinUTF8Ratio = 0.75; + bool utf8_mode = IsMostlyUTF8(&input[input_pos], input_size, kMinUTF8Ratio); + + // Compute literal costs. + std::vector literal_cost(prefix_size + input_size); + if (utf8_mode) { + EstimateBitCostsForLiteralsUTF8(input_pos, input_size, mask, mask, + &input[0], &literal_cost[0]); + } else { + EstimateBitCostsForLiterals(input_pos, input_size, mask, mask, + &input[0], &literal_cost[0]); + } + + // Initialize hashers. + int hash_type = 9; + switch (params.mode) { + case BrotliParams::MODE_TEXT: hash_type = 8; break; + case BrotliParams::MODE_FONT: hash_type = 9; break; + default: break; + } + std::unique_ptr hashers(new Hashers()); + hashers->Init(hash_type); + hashers->SetStaticDictionary(static_dict); + + // Compute backward references. + int last_insert_len = 0; + int num_commands = 0; + double base_min_score = 8.115; + int max_backward_distance = (1 << params.lgwin) - 16; + int dist_cache[4] = { -4, -4, -4, -4 }; + std::vector commands((input_size + 1) >> 1); + CreateBackwardReferences( + input_size, input_pos, + &input[0], mask, + &literal_cost[0], mask, + max_backward_distance, + base_min_score, + params.quality, + hashers.get(), + hash_type, + dist_cache, + &last_insert_len, + &commands[0], + &num_commands); + commands.resize(num_commands); + if (last_insert_len > 0) { + commands.push_back(Command(last_insert_len)); + } + + // Build the meta-block. + MetaBlockSplit mb; + int num_direct_distance_codes = + params.mode == BrotliParams::MODE_FONT ? 12 : 0; + int distance_postfix_bits = params.mode == BrotliParams::MODE_FONT ? 1 : 0; + int literal_context_mode = utf8_mode ? CONTEXT_UTF8 : CONTEXT_SIGNED; + RecomputeDistancePrefixes(&commands, + num_direct_distance_codes, + distance_postfix_bits); + if (params.greedy_block_split) { + BuildMetaBlockGreedy(&input[0], input_pos, mask, + commands.data(), commands.size(), + &mb); + } else { + BuildMetaBlock(&input[0], input_pos, mask, + prev_byte, prev_byte2, + commands.data(), commands.size(), + literal_context_mode, + true, + &mb); + } + + // Set up the temporary output storage. + const size_t max_out_size = 2 * input_size + 500; + std::vector storage(max_out_size); + int first_byte = 0; + int first_byte_bits = 0; + if (is_first) { + if (params.lgwin == 16) { + first_byte = 0; + first_byte_bits = 1; + } else { + first_byte = ((params.lgwin - 17) << 1) | 1; + first_byte_bits = 4; + } + } + storage[0] = first_byte; + int storage_ix = first_byte_bits; + + // Store the meta-block to the temporary output. + if (!StoreMetaBlock(&input[0], input_pos, input_size, mask, + prev_byte, prev_byte2, + is_last, + num_direct_distance_codes, + distance_postfix_bits, + literal_context_mode, + commands.data(), commands.size(), + mb, + &storage_ix, &storage[0])) { + return false; + } + + // If this is not the last meta-block, store an empty metadata + // meta-block so that the meta-block will end at a byte boundary. + if (!is_last) { + StoreSyncMetaBlock(&storage_ix, &storage[0]); + } + + // If the compressed data is too large, fall back to an uncompressed + // meta-block. + size_t output_size = storage_ix >> 3; + if (input_size + 4 < output_size) { + storage[0] = first_byte; + storage_ix = first_byte_bits; + if (!StoreUncompressedMetaBlock(is_last, &input[0], input_pos, mask, + input_size, + &storage_ix, &storage[0])) { + return false; + } + output_size = storage_ix >> 3; + } + + // Copy the temporary output with size-check to the output. + if (output_size > *encoded_size) { + return false; + } + memcpy(encoded_buffer, &storage[0], output_size); + *encoded_size = output_size; + return true; +} + +} // namespace + +int BrotliCompressBufferParallel(BrotliParams params, + size_t input_size, + const uint8_t* input_buffer, + size_t* encoded_size, + uint8_t* encoded_buffer) { + if (*encoded_size == 0) { + // Output buffer needs at least one byte. + return 0; + } else if (input_size == 0) { + encoded_buffer[0] = 6; + *encoded_size = 1; + return 1; + } + + // Sanitize params. + if (params.lgwin < kMinWindowBits) { + params.lgwin = kMinWindowBits; + } else if (params.lgwin > kMaxWindowBits) { + params.lgwin = kMaxWindowBits; + } + if (params.lgblock == 0) { + params.lgblock = 16; + if (params.quality >= 9 && params.lgwin > params.lgblock) { + params.lgblock = std::min(21, params.lgwin); + } + } else if (params.lgblock < kMinInputBlockBits) { + params.lgblock = kMinInputBlockBits; + } else if (params.lgblock > kMaxInputBlockBits) { + params.lgblock = kMaxInputBlockBits; + } + size_t max_input_block_size = 1 << params.lgblock; + + std::vector > compressed_pieces; + StaticDictionary dict; + dict.Fill(params.enable_transforms); + + // Compress block-by-block independently. + for (size_t pos = 0; pos < input_size; ) { + size_t input_block_size = std::min(max_input_block_size, input_size - pos); + size_t out_size = 1.2 * input_block_size + 1024; + std::vector out(out_size); + if (!WriteMetaBlockParallel(params, + input_block_size, + &input_buffer[pos], + pos, + input_buffer, + &dict, + pos == 0, + pos + input_block_size == input_size, + &out_size, + &out[0])) { + return false; + } + out.resize(out_size); + compressed_pieces.push_back(out); + pos += input_block_size; + } + + // Piece together the output. + size_t out_pos = 0; + for (int i = 0; i < compressed_pieces.size(); ++i) { + const std::vector& out = compressed_pieces[i]; + if (out_pos + out.size() > *encoded_size) { + return false; + } + memcpy(&encoded_buffer[out_pos], &out[0], out.size()); + out_pos += out.size(); + } + *encoded_size = out_pos; + + return true; +} + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode_parallel.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode_parallel.h new file mode 100644 index 0000000..75dba52 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/encode_parallel.h @@ -0,0 +1,37 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// API for parallel Brotli compression +// Note that this is only a proof of concept currently and not part of the +// final API yet. + +#ifndef BROTLI_ENC_ENCODE_PARALLEL_H_ +#define BROTLI_ENC_ENCODE_PARALLEL_H_ + +#include +#include + +#include "./encode.h" + +namespace brotli { + +int BrotliCompressBufferParallel(BrotliParams params, + size_t input_size, + const uint8_t* input_buffer, + size_t* encoded_size, + uint8_t* encoded_buffer); + +} // namespace brotli + +#endif // BROTLI_ENC_ENCODE_PARALLEL_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/entropy_encode.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/entropy_encode.cc new file mode 100644 index 0000000..27924db --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/entropy_encode.cc @@ -0,0 +1,492 @@ +// Copyright 2010 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Entropy encoding (Huffman) utilities. + +#include "./entropy_encode.h" + +#include +#include +#include +#include +#include + +#include "./histogram.h" + +namespace brotli { + +namespace { + +struct HuffmanTree { + HuffmanTree(); + HuffmanTree(int count, int16_t left, int16_t right) + : total_count_(count), + index_left_(left), + index_right_or_value_(right) { + } + int total_count_; + int16_t index_left_; + int16_t index_right_or_value_; +}; + +HuffmanTree::HuffmanTree() {} + +// Sort the root nodes, least popular first. +bool SortHuffmanTree(const HuffmanTree &v0, const HuffmanTree &v1) { + return v0.total_count_ < v1.total_count_; +} + +void SetDepth(const HuffmanTree &p, + HuffmanTree *pool, + uint8_t *depth, + int level) { + if (p.index_left_ >= 0) { + ++level; + SetDepth(pool[p.index_left_], pool, depth, level); + SetDepth(pool[p.index_right_or_value_], pool, depth, level); + } else { + depth[p.index_right_or_value_] = level; + } +} + +} // namespace + +// This function will create a Huffman tree. +// +// The catch here is that the tree cannot be arbitrarily deep. +// Brotli specifies a maximum depth of 15 bits for "code trees" +// and 7 bits for "code length code trees." +// +// count_limit is the value that is to be faked as the minimum value +// and this minimum value is raised until the tree matches the +// maximum length requirement. +// +// This algorithm is not of excellent performance for very long data blocks, +// especially when population counts are longer than 2**tree_limit, but +// we are not planning to use this with extremely long blocks. +// +// See http://en.wikipedia.org/wiki/Huffman_coding +void CreateHuffmanTree(const int *data, + const int length, + const int tree_limit, + uint8_t *depth) { + // For block sizes below 64 kB, we never need to do a second iteration + // of this loop. Probably all of our block sizes will be smaller than + // that, so this loop is mostly of academic interest. If we actually + // would need this, we would be better off with the Katajainen algorithm. + for (int count_limit = 1; ; count_limit *= 2) { + std::vector tree; + tree.reserve(2 * length + 1); + + for (int i = length - 1; i >= 0; --i) { + if (data[i]) { + const int count = std::max(data[i], count_limit); + tree.push_back(HuffmanTree(count, -1, i)); + } + } + + const int n = tree.size(); + if (n == 1) { + depth[tree[0].index_right_or_value_] = 1; // Only one element. + break; + } + + std::stable_sort(tree.begin(), tree.end(), SortHuffmanTree); + + // The nodes are: + // [0, n): the sorted leaf nodes that we start with. + // [n]: we add a sentinel here. + // [n + 1, 2n): new parent nodes are added here, starting from + // (n+1). These are naturally in ascending order. + // [2n]: we add a sentinel at the end as well. + // There will be (2n+1) elements at the end. + const HuffmanTree sentinel(std::numeric_limits::max(), -1, -1); + tree.push_back(sentinel); + tree.push_back(sentinel); + + int i = 0; // Points to the next leaf node. + int j = n + 1; // Points to the next non-leaf node. + for (int k = n - 1; k > 0; --k) { + int left, right; + if (tree[i].total_count_ <= tree[j].total_count_) { + left = i; + ++i; + } else { + left = j; + ++j; + } + if (tree[i].total_count_ <= tree[j].total_count_) { + right = i; + ++i; + } else { + right = j; + ++j; + } + + // The sentinel node becomes the parent node. + int j_end = tree.size() - 1; + tree[j_end].total_count_ = + tree[left].total_count_ + tree[right].total_count_; + tree[j_end].index_left_ = left; + tree[j_end].index_right_or_value_ = right; + + // Add back the last sentinel node. + tree.push_back(sentinel); + } + SetDepth(tree[2 * n - 1], &tree[0], depth, 0); + + // We need to pack the Huffman tree in tree_limit bits. + // If this was not successful, add fake entities to the lowest values + // and retry. + if (*std::max_element(&depth[0], &depth[length]) <= tree_limit) { + break; + } + } +} + +void Reverse(std::vector* v, int start, int end) { + --end; + while (start < end) { + int tmp = (*v)[start]; + (*v)[start] = (*v)[end]; + (*v)[end] = tmp; + ++start; + --end; + } +} + +void WriteHuffmanTreeRepetitions( + const int previous_value, + const int value, + int repetitions, + std::vector *tree, + std::vector *extra_bits_data) { + if (previous_value != value) { + tree->push_back(value); + extra_bits_data->push_back(0); + --repetitions; + } + if (repetitions == 7) { + tree->push_back(value); + extra_bits_data->push_back(0); + --repetitions; + } + if (repetitions < 3) { + for (int i = 0; i < repetitions; ++i) { + tree->push_back(value); + extra_bits_data->push_back(0); + } + } else { + repetitions -= 3; + int start = tree->size(); + while (repetitions >= 0) { + tree->push_back(16); + extra_bits_data->push_back(repetitions & 0x3); + repetitions >>= 2; + --repetitions; + } + Reverse(tree, start, tree->size()); + Reverse(extra_bits_data, start, tree->size()); + } +} + +void WriteHuffmanTreeRepetitionsZeros( + int repetitions, + std::vector *tree, + std::vector *extra_bits_data) { + if (repetitions == 11) { + tree->push_back(0); + extra_bits_data->push_back(0); + --repetitions; + } + if (repetitions < 3) { + for (int i = 0; i < repetitions; ++i) { + tree->push_back(0); + extra_bits_data->push_back(0); + } + } else { + repetitions -= 3; + int start = tree->size(); + while (repetitions >= 0) { + tree->push_back(17); + extra_bits_data->push_back(repetitions & 0x7); + repetitions >>= 3; + --repetitions; + } + Reverse(tree, start, tree->size()); + Reverse(extra_bits_data, start, tree->size()); + } +} + +int OptimizeHuffmanCountsForRle(int length, int* counts) { + int nonzero_count = 0; + int stride; + int limit; + int sum; + uint8_t* good_for_rle; + // Let's make the Huffman code more compatible with rle encoding. + int i; + for (i = 0; i < length; i++) { + if (counts[i]) { + ++nonzero_count; + } + } + if (nonzero_count < 16) { + return 1; + } + for (; length >= 0; --length) { + if (length == 0) { + return 1; // All zeros. + } + if (counts[length - 1] != 0) { + // Now counts[0..length - 1] does not have trailing zeros. + break; + } + } + { + int nonzeros = 0; + int smallest_nonzero = 1 << 30; + for (i = 0; i < length; ++i) { + if (counts[i] != 0) { + ++nonzeros; + if (smallest_nonzero > counts[i]) { + smallest_nonzero = counts[i]; + } + } + } + if (nonzeros < 5) { + // Small histogram will model it well. + return 1; + } + int zeros = length - nonzeros; + if (smallest_nonzero < 4) { + if (zeros < 6) { + for (i = 1; i < length - 1; ++i) { + if (counts[i - 1] != 0 && counts[i] == 0 && counts[i + 1] != 0) { + counts[i] = 1; + } + } + } + } + if (nonzeros < 28) { + return 1; + } + } + // 2) Let's mark all population counts that already can be encoded + // with an rle code. + good_for_rle = (uint8_t*)calloc(length, 1); + if (good_for_rle == NULL) { + return 0; + } + { + // Let's not spoil any of the existing good rle codes. + // Mark any seq of 0's that is longer as 5 as a good_for_rle. + // Mark any seq of non-0's that is longer as 7 as a good_for_rle. + int symbol = counts[0]; + int stride = 0; + for (i = 0; i < length + 1; ++i) { + if (i == length || counts[i] != symbol) { + if ((symbol == 0 && stride >= 5) || + (symbol != 0 && stride >= 7)) { + int k; + for (k = 0; k < stride; ++k) { + good_for_rle[i - k - 1] = 1; + } + } + stride = 1; + if (i != length) { + symbol = counts[i]; + } + } else { + ++stride; + } + } + } + // 3) Let's replace those population counts that lead to more rle codes. + // Math here is in 24.8 fixed point representation. + const int streak_limit = 1240; + stride = 0; + limit = 256 * (counts[0] + counts[1] + counts[2]) / 3 + 420; + sum = 0; + for (i = 0; i < length + 1; ++i) { + if (i == length || good_for_rle[i] || + (i != 0 && good_for_rle[i - 1]) || + abs(256 * counts[i] - limit) >= streak_limit) { + if (stride >= 4 || (stride >= 3 && sum == 0)) { + int k; + // The stride must end, collapse what we have, if we have enough (4). + int count = (sum + stride / 2) / stride; + if (count < 1) { + count = 1; + } + if (sum == 0) { + // Don't make an all zeros stride to be upgraded to ones. + count = 0; + } + for (k = 0; k < stride; ++k) { + // We don't want to change value at counts[i], + // that is already belonging to the next stride. Thus - 1. + counts[i - k - 1] = count; + } + } + stride = 0; + sum = 0; + if (i < length - 2) { + // All interesting strides have a count of at least 4, + // at least when non-zeros. + limit = 256 * (counts[i] + counts[i + 1] + counts[i + 2]) / 3 + 420; + } else if (i < length) { + limit = 256 * counts[i]; + } else { + limit = 0; + } + } + ++stride; + if (i != length) { + sum += counts[i]; + if (stride >= 4) { + limit = (256 * sum + stride / 2) / stride; + } + if (stride == 4) { + limit += 120; + } + } + } + free(good_for_rle); + return 1; +} + +static void DecideOverRleUse(const uint8_t* depth, const int length, + bool *use_rle_for_non_zero, + bool *use_rle_for_zero) { + int total_reps_zero = 0; + int total_reps_non_zero = 0; + int count_reps_zero = 0; + int count_reps_non_zero = 0; + for (uint32_t i = 0; i < length;) { + const int value = depth[i]; + int reps = 1; + for (uint32_t k = i + 1; k < length && depth[k] == value; ++k) { + ++reps; + } + if (reps >= 3 && value == 0) { + total_reps_zero += reps; + ++count_reps_zero; + } + if (reps >= 4 && value != 0) { + total_reps_non_zero += reps; + ++count_reps_non_zero; + } + i += reps; + } + total_reps_non_zero -= count_reps_non_zero * 2; + total_reps_zero -= count_reps_zero * 2; + *use_rle_for_non_zero = total_reps_non_zero > 2; + *use_rle_for_zero = total_reps_zero > 2; +} + +void WriteHuffmanTree(const uint8_t* depth, + uint32_t length, + std::vector *tree, + std::vector *extra_bits_data) { + int previous_value = 8; + + // Throw away trailing zeros. + int new_length = length; + for (int i = 0; i < length; ++i) { + if (depth[length - i - 1] == 0) { + --new_length; + } else { + break; + } + } + + // First gather statistics on if it is a good idea to do rle. + bool use_rle_for_non_zero = false; + bool use_rle_for_zero = false; + if (length > 50) { + // Find rle coding for longer codes. + // Shorter codes seem not to benefit from rle. + DecideOverRleUse(depth, new_length, + &use_rle_for_non_zero, &use_rle_for_zero); + } + + // Actual rle coding. + for (uint32_t i = 0; i < new_length;) { + const int value = depth[i]; + int reps = 1; + if ((value != 0 && use_rle_for_non_zero) || + (value == 0 && use_rle_for_zero)) { + for (uint32_t k = i + 1; k < new_length && depth[k] == value; ++k) { + ++reps; + } + } + if (value == 0) { + WriteHuffmanTreeRepetitionsZeros(reps, tree, extra_bits_data); + } else { + WriteHuffmanTreeRepetitions(previous_value, + value, reps, tree, extra_bits_data); + previous_value = value; + } + i += reps; + } +} + +namespace { + +uint16_t ReverseBits(int num_bits, uint16_t bits) { + static const size_t kLut[16] = { // Pre-reversed 4-bit values. + 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, + 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf + }; + size_t retval = kLut[bits & 0xf]; + for (int i = 4; i < num_bits; i += 4) { + retval <<= 4; + bits >>= 4; + retval |= kLut[bits & 0xf]; + } + retval >>= (-num_bits & 0x3); + return retval; +} + +} // namespace + +void ConvertBitDepthsToSymbols(const uint8_t *depth, int len, uint16_t *bits) { + // In Brotli, all bit depths are [1..15] + // 0 bit depth means that the symbol does not exist. + const int kMaxBits = 16; // 0..15 are values for bits + uint16_t bl_count[kMaxBits] = { 0 }; + { + for (int i = 0; i < len; ++i) { + ++bl_count[depth[i]]; + } + bl_count[0] = 0; + } + uint16_t next_code[kMaxBits]; + next_code[0] = 0; + { + int code = 0; + for (int bits = 1; bits < kMaxBits; ++bits) { + code = (code + bl_count[bits - 1]) << 1; + next_code[bits] = code; + } + } + for (int i = 0; i < len; ++i) { + if (depth[i]) { + bits[i] = ReverseBits(depth[i], next_code[depth[i]]++); + } + } +} + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/entropy_encode.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/entropy_encode.h new file mode 100644 index 0000000..6f3d582 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/entropy_encode.h @@ -0,0 +1,88 @@ +// Copyright 2010 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Entropy encoding (Huffman) utilities. + +#ifndef BROTLI_ENC_ENTROPY_ENCODE_H_ +#define BROTLI_ENC_ENTROPY_ENCODE_H_ + +#include +#include +#include +#include "./histogram.h" +#include "./prefix.h" + +namespace brotli { + +// This function will create a Huffman tree. +// +// The (data,length) contains the population counts. +// The tree_limit is the maximum bit depth of the Huffman codes. +// +// The depth contains the tree, i.e., how many bits are used for +// the symbol. +// +// See http://en.wikipedia.org/wiki/Huffman_coding +void CreateHuffmanTree(const int *data, + const int length, + const int tree_limit, + uint8_t *depth); + +// Change the population counts in a way that the consequent +// Hufmann tree compression, especially its rle-part will be more +// likely to compress this data more efficiently. +// +// length contains the size of the histogram. +// counts contains the population counts. +int OptimizeHuffmanCountsForRle(int length, int* counts); + +// Write a huffman tree from bit depths into the bitstream representation +// of a Huffman tree. The generated Huffman tree is to be compressed once +// more using a Huffman tree +void WriteHuffmanTree(const uint8_t* depth, + uint32_t num, + std::vector *tree, + std::vector *extra_bits_data); + +// Get the actual bit values for a tree of bit depths. +void ConvertBitDepthsToSymbols(const uint8_t *depth, int len, uint16_t *bits); + +template +struct EntropyCode { + // How many bits for symbol. + uint8_t depth_[kSize]; + // Actual bits used to represent the symbol. + uint16_t bits_[kSize]; + // How many non-zero depth. + int count_; + // First four symbols with non-zero depth. + int symbols_[4]; +}; + +static const int kCodeLengthCodes = 18; + +// Literal entropy code. +typedef EntropyCode<256> EntropyCodeLiteral; +// Prefix entropy codes. +typedef EntropyCode EntropyCodeCommand; +typedef EntropyCode EntropyCodeDistance; +typedef EntropyCode EntropyCodeBlockLength; +// Context map entropy code, 256 Huffman tree indexes + 16 run length codes. +typedef EntropyCode<272> EntropyCodeContextMap; +// Block type entropy code, 256 block types + 2 special symbols. +typedef EntropyCode<258> EntropyCodeBlockType; + +} // namespace brotli + +#endif // BROTLI_ENC_ENTROPY_ENCODE_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/fast_log.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/fast_log.h new file mode 100644 index 0000000..19b66f3 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/fast_log.h @@ -0,0 +1,179 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Utilities for fast computation of logarithms. + +#ifndef BROTLI_ENC_FAST_LOG_H_ +#define BROTLI_ENC_FAST_LOG_H_ + +#include +#include +#include + +namespace brotli { + +// Return floor(log2(n)) for positive integer n. Returns -1 iff n == 0. +inline int Log2Floor(uint32_t n) { +#if defined(__clang__) || \ + (defined(__GNUC__) && \ + ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)) + return n == 0 ? -1 : 31 ^ __builtin_clz(n); +#else + if (n == 0) + return -1; + int log = 0; + uint32_t value = n; + for (int i = 4; i >= 0; --i) { + int shift = (1 << i); + uint32_t x = value >> shift; + if (x != 0) { + value = x; + log += shift; + } + } + assert(value == 1); + return log; +#endif +} + +static inline int Log2FloorNonZero(uint32_t n) { +#ifdef __GNUC__ + return 31 ^ __builtin_clz(n); +#else + unsigned int result = 0; + while (n >>= 1) result++; + return result; +#endif +} + +// Return ceiling(log2(n)) for positive integer n. Returns -1 iff n == 0. +inline int Log2Ceiling(uint32_t n) { + int floor = Log2Floor(n); + if (n == (n &~ (n - 1))) // zero or a power of two + return floor; + else + return floor + 1; +} + +// A lookup table for small values of log2(int) to be used in entropy +// computation. +// +// ", ".join(["%.16ff" % x for x in [0.0]+[log2(x) for x in range(1, 256)]]) +static const float kLog2Table[] = { + 0.0000000000000000f, 0.0000000000000000f, 1.0000000000000000f, + 1.5849625007211563f, 2.0000000000000000f, 2.3219280948873622f, + 2.5849625007211561f, 2.8073549220576042f, 3.0000000000000000f, + 3.1699250014423126f, 3.3219280948873626f, 3.4594316186372978f, + 3.5849625007211565f, 3.7004397181410922f, 3.8073549220576037f, + 3.9068905956085187f, 4.0000000000000000f, 4.0874628412503400f, + 4.1699250014423122f, 4.2479275134435852f, 4.3219280948873626f, + 4.3923174227787607f, 4.4594316186372973f, 4.5235619560570131f, + 4.5849625007211570f, 4.6438561897747244f, 4.7004397181410926f, + 4.7548875021634691f, 4.8073549220576037f, 4.8579809951275728f, + 4.9068905956085187f, 4.9541963103868758f, 5.0000000000000000f, + 5.0443941193584534f, 5.0874628412503400f, 5.1292830169449664f, + 5.1699250014423122f, 5.2094533656289501f, 5.2479275134435852f, + 5.2854022188622487f, 5.3219280948873626f, 5.3575520046180838f, + 5.3923174227787607f, 5.4262647547020979f, 5.4594316186372973f, + 5.4918530963296748f, 5.5235619560570131f, 5.5545888516776376f, + 5.5849625007211570f, 5.6147098441152083f, 5.6438561897747244f, + 5.6724253419714961f, 5.7004397181410926f, 5.7279204545631996f, + 5.7548875021634691f, 5.7813597135246599f, 5.8073549220576046f, + 5.8328900141647422f, 5.8579809951275719f, 5.8826430493618416f, + 5.9068905956085187f, 5.9307373375628867f, 5.9541963103868758f, + 5.9772799234999168f, 6.0000000000000000f, 6.0223678130284544f, + 6.0443941193584534f, 6.0660891904577721f, 6.0874628412503400f, + 6.1085244567781700f, 6.1292830169449672f, 6.1497471195046822f, + 6.1699250014423122f, 6.1898245588800176f, 6.2094533656289510f, + 6.2288186904958804f, 6.2479275134435861f, 6.2667865406949019f, + 6.2854022188622487f, 6.3037807481771031f, 6.3219280948873617f, + 6.3398500028846252f, 6.3575520046180847f, 6.3750394313469254f, + 6.3923174227787598f, 6.4093909361377026f, 6.4262647547020979f, + 6.4429434958487288f, 6.4594316186372982f, 6.4757334309663976f, + 6.4918530963296748f, 6.5077946401986964f, 6.5235619560570131f, + 6.5391588111080319f, 6.5545888516776376f, 6.5698556083309478f, + 6.5849625007211561f, 6.5999128421871278f, 6.6147098441152092f, + 6.6293566200796095f, 6.6438561897747253f, 6.6582114827517955f, + 6.6724253419714952f, 6.6865005271832185f, 6.7004397181410917f, + 6.7142455176661224f, 6.7279204545631988f, 6.7414669864011465f, + 6.7548875021634691f, 6.7681843247769260f, 6.7813597135246599f, + 6.7944158663501062f, 6.8073549220576037f, 6.8201789624151887f, + 6.8328900141647422f, 6.8454900509443757f, 6.8579809951275719f, + 6.8703647195834048f, 6.8826430493618416f, 6.8948177633079437f, + 6.9068905956085187f, 6.9188632372745955f, 6.9307373375628867f, + 6.9425145053392399f, 6.9541963103868758f, 6.9657842846620879f, + 6.9772799234999168f, 6.9886846867721664f, 7.0000000000000000f, + 7.0112272554232540f, 7.0223678130284544f, 7.0334230015374501f, + 7.0443941193584534f, 7.0552824355011898f, 7.0660891904577721f, + 7.0768155970508317f, 7.0874628412503400f, 7.0980320829605272f, + 7.1085244567781700f, 7.1189410727235076f, 7.1292830169449664f, + 7.1395513523987937f, 7.1497471195046822f, 7.1598713367783891f, + 7.1699250014423130f, 7.1799090900149345f, 7.1898245588800176f, + 7.1996723448363644f, 7.2094533656289492f, 7.2191685204621621f, + 7.2288186904958804f, 7.2384047393250794f, 7.2479275134435861f, + 7.2573878426926521f, 7.2667865406949019f, 7.2761244052742384f, + 7.2854022188622487f, 7.2946207488916270f, 7.3037807481771031f, + 7.3128829552843557f, 7.3219280948873617f, 7.3309168781146177f, + 7.3398500028846243f, 7.3487281542310781f, 7.3575520046180847f, + 7.3663222142458151f, 7.3750394313469254f, 7.3837042924740528f, + 7.3923174227787607f, 7.4008794362821844f, 7.4093909361377026f, + 7.4178525148858991f, 7.4262647547020979f, 7.4346282276367255f, + 7.4429434958487288f, 7.4512111118323299f, 7.4594316186372973f, + 7.4676055500829976f, 7.4757334309663976f, 7.4838157772642564f, + 7.4918530963296748f, 7.4998458870832057f, 7.5077946401986964f, + 7.5156998382840436f, 7.5235619560570131f, 7.5313814605163119f, + 7.5391588111080319f, 7.5468944598876373f, 7.5545888516776376f, + 7.5622424242210728f, 7.5698556083309478f, 7.5774288280357487f, + 7.5849625007211561f, 7.5924570372680806f, 7.5999128421871278f, + 7.6073303137496113f, 7.6147098441152075f, 7.6220518194563764f, + 7.6293566200796095f, 7.6366246205436488f, 7.6438561897747244f, + 7.6510516911789290f, 7.6582114827517955f, 7.6653359171851765f, + 7.6724253419714952f, 7.6794800995054464f, 7.6865005271832185f, + 7.6934869574993252f, 7.7004397181410926f, 7.7073591320808825f, + 7.7142455176661224f, 7.7210991887071856f, 7.7279204545631996f, + 7.7347096202258392f, 7.7414669864011465f, 7.7481928495894596f, + 7.7548875021634691f, 7.7615512324444795f, 7.7681843247769260f, + 7.7747870596011737f, 7.7813597135246608f, 7.7879025593914317f, + 7.7944158663501062f, 7.8008998999203047f, 7.8073549220576037f, + 7.8137811912170374f, 7.8201789624151887f, 7.8265484872909159f, + 7.8328900141647422f, 7.8392037880969445f, 7.8454900509443757f, + 7.8517490414160571f, 7.8579809951275719f, 7.8641861446542798f, + 7.8703647195834048f, 7.8765169465650002f, 7.8826430493618425f, + 7.8887432488982601f, 7.8948177633079446f, 7.9008668079807496f, + 7.9068905956085187f, 7.9128893362299619f, 7.9188632372745955f, + 7.9248125036057813f, 7.9307373375628867f, 7.9366379390025719f, + 7.9425145053392399f, 7.9483672315846778f, 7.9541963103868758f, + 7.9600019320680806f, 7.9657842846620870f, 7.9715435539507720f, + 7.9772799234999168f, 7.9829935746943104f, 7.9886846867721664f, + 7.9943534368588578f +}; + +// Faster logarithm for small integers, with the property of log2(0) == 0. +static inline double FastLog2(int v) { + if (v < (int)(sizeof(kLog2Table) / sizeof(kLog2Table[0]))) { + return kLog2Table[v]; + } +#if defined(_MSC_VER) && _MSC_VER <= 1600 + // Visual Studio 2010 does not have the log2() function defined, so we use + // log() and a multiplication instead. + static const double kLog2Inv = 1.4426950408889634f; + return log(static_cast(v)) * kLog2Inv; +#else + return log2(static_cast(v)); +#endif +} + +} // namespace brotli + +#endif // BROTLI_ENC_FAST_LOG_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/find_match_length.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/find_match_length.h new file mode 100644 index 0000000..55fd5a3 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/find_match_length.h @@ -0,0 +1,87 @@ +// Copyright 2010 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Function to find maximal matching prefixes of strings. + +#ifndef BROTLI_ENC_FIND_MATCH_LENGTH_H_ +#define BROTLI_ENC_FIND_MATCH_LENGTH_H_ + +#include + +#include + +#include "./port.h" + +namespace brotli { + +// Separate implementation for little-endian 64-bit targets, for speed. +#if defined(__GNUC__) && defined(_LP64) && defined(IS_LITTLE_ENDIAN) + +static inline int FindMatchLengthWithLimit(const uint8_t* s1, + const uint8_t* s2, + size_t limit) { + int matched = 0; + size_t limit2 = (limit >> 3) + 1; // + 1 is for pre-decrement in while + while (PREDICT_TRUE(--limit2)) { + if (PREDICT_FALSE(BROTLI_UNALIGNED_LOAD64(s2) == + BROTLI_UNALIGNED_LOAD64(s1 + matched))) { + s2 += 8; + matched += 8; + } else { + uint64_t x = + BROTLI_UNALIGNED_LOAD64(s2) ^ BROTLI_UNALIGNED_LOAD64(s1 + matched); + int matching_bits = __builtin_ctzll(x); + matched += matching_bits >> 3; + return matched; + } + } + limit = (limit & 7) + 1; // + 1 is for pre-decrement in while + while (--limit) { + if (PREDICT_TRUE(s1[matched] == *s2)) { + ++s2; + ++matched; + } else { + return matched; + } + } + return matched; +} +#else +static inline int FindMatchLengthWithLimit(const uint8_t* s1, + const uint8_t* s2, + size_t limit) { + int matched = 0; + const uint8_t* s2_limit = s2 + limit; + const uint8_t* s2_ptr = s2; + // Find out how long the match is. We loop over the data 32 bits at a + // time until we find a 32-bit block that doesn't match; then we find + // the first non-matching bit and use that to calculate the total + // length of the match. + while (s2_ptr <= s2_limit - 4 && + BROTLI_UNALIGNED_LOAD32(s2_ptr) == + BROTLI_UNALIGNED_LOAD32(s1 + matched)) { + s2_ptr += 4; + matched += 4; + } + while ((s2_ptr < s2_limit) && (s1[matched] == *s2_ptr)) { + ++s2_ptr; + ++matched; + } + return matched; +} +#endif + +} // namespace brotli + +#endif // BROTLI_ENC_FIND_MATCH_LENGTH_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/hash.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/hash.h new file mode 100644 index 0000000..ea6321a --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/hash.h @@ -0,0 +1,634 @@ +// Copyright 2010 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// A (forgetful) hash table to the data seen by the compressor, to +// help create backward references to previous data. + +#ifndef BROTLI_ENC_HASH_H_ +#define BROTLI_ENC_HASH_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "./dictionary_hash.h" +#include "./fast_log.h" +#include "./find_match_length.h" +#include "./port.h" +#include "./prefix.h" +#include "./static_dict.h" +#include "./transform.h" + +namespace brotli { + +static const int kDistanceCacheIndex[] = { + 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, +}; +static const int kDistanceCacheOffset[] = { + 0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3 +}; + +// kHashMul32 multiplier has these properties: +// * The multiplier must be odd. Otherwise we may lose the highest bit. +// * No long streaks of 1s or 0s. +// * There is no effort to ensure that it is a prime, the oddity is enough +// for this use. +// * The number has been tuned heuristically against compression benchmarks. +static const uint32_t kHashMul32 = 0x1e35a7bd; + +template +inline uint32_t Hash(const uint8_t *data) { + if (kMinLength <= 3) { + // If kMinLength is 2 or 3, we hash the first 3 bytes of data. + uint32_t h = (BROTLI_UNALIGNED_LOAD32(data) & 0xffffff) * kHashMul32; + // The higher bits contain more mixture from the multiplication, + // so we take our results from there. + return h >> (32 - kShiftBits); + } else { + // If kMinLength is at least 4, we hash the first 4 bytes of data. + uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kHashMul32; + // The higher bits contain more mixture from the multiplication, + // so we take our results from there. + return h >> (32 - kShiftBits); + } +} + +// Usually, we always choose the longest backward reference. This function +// allows for the exception of that rule. +// +// If we choose a backward reference that is further away, it will +// usually be coded with more bits. We approximate this by assuming +// log2(distance). If the distance can be expressed in terms of the +// last four distances, we use some heuristic constants to estimate +// the bits cost. For the first up to four literals we use the bit +// cost of the literals from the literal cost model, after that we +// use the average bit cost of the cost model. +// +// This function is used to sometimes discard a longer backward reference +// when it is not much longer and the bit cost for encoding it is more +// than the saved literals. +inline double BackwardReferenceScore(double average_cost, + int copy_length, + int backward_reference_offset) { + return (copy_length * average_cost - + 1.20 * Log2Floor(backward_reference_offset)); +} + +inline double BackwardReferenceScoreUsingLastDistance(double average_cost, + int copy_length, + int distance_short_code) { + static const double kDistanceShortCodeBitCost[16] = { + -0.6, 0.95, 1.17, 1.27, + 0.93, 0.93, 0.96, 0.96, 0.99, 0.99, + 1.05, 1.05, 1.15, 1.15, 1.25, 1.25 + }; + return (average_cost * copy_length + - kDistanceShortCodeBitCost[distance_short_code]); +} + +// A (forgetful) hash table to the data seen by the compressor, to +// help create backward references to previous data. +// +// This is a hash map of fixed size (kBucketSize). Starting from the +// given index, kBucketSweep buckets are used to store values of a key. +template +class HashLongestMatchQuickly { + public: + HashLongestMatchQuickly() { + Reset(); + } + void Reset() { + // It is not strictly necessary to fill this buffer here, but + // not filling will make the results of the compression stochastic + // (but correct). This is because random data would cause the + // system to find accidentally good backward references here and there. + std::fill(&buckets_[0], + &buckets_[sizeof(buckets_) / sizeof(buckets_[0])], + 0); + num_dict_lookups_ = 0; + num_dict_matches_ = 0; + } + // Look at 4 bytes at data. + // Compute a hash from these, and store the value somewhere within + // [ix .. ix+3]. + inline void Store(const uint8_t *data, const int ix) { + const uint32_t key = Hash(data); + // Wiggle the value with the bucket sweep range. + const uint32_t off = (static_cast(ix) >> 3) % kBucketSweep; + buckets_[key + off] = ix; + } + + // Store hashes for a range of data. + void StoreHashes(const uint8_t *data, size_t len, int startix, int mask) { + for (int p = 0; p < len; ++p) { + Store(&data[p & mask], startix + p); + } + } + + bool HasStaticDictionary() const { return false; } + + // Find a longest backward match of &ring_buffer[cur_ix & ring_buffer_mask] + // up to the length of max_length. + // + // Does not look for matches longer than max_length. + // Does not look for matches further away than max_backward. + // Writes the best found match length into best_len_out. + // Writes the index (&data[index]) of the start of the best match into + // best_distance_out. + inline bool FindLongestMatch(const uint8_t * __restrict ring_buffer, + const size_t ring_buffer_mask, + const float* __restrict literal_cost, + const size_t literal_cost_mask, + const double average_cost, + const int* __restrict distance_cache, + const uint32_t cur_ix, + const uint32_t max_length, + const uint32_t max_backward, + int * __restrict best_len_out, + int * __restrict best_len_code_out, + int * __restrict best_distance_out, + double* __restrict best_score_out) { + const int best_len_in = *best_len_out; + const int cur_ix_masked = cur_ix & ring_buffer_mask; + int compare_char = ring_buffer[cur_ix_masked + best_len_in]; + double best_score = *best_score_out; + int best_len = best_len_in; + int backward = distance_cache[0]; + size_t prev_ix = cur_ix - backward; + bool match_found = false; + if (prev_ix < cur_ix) { + prev_ix &= ring_buffer_mask; + if (compare_char == ring_buffer[prev_ix + best_len]) { + int len = FindMatchLengthWithLimit(&ring_buffer[prev_ix], + &ring_buffer[cur_ix_masked], + max_length); + if (len >= 4) { + best_score = BackwardReferenceScoreUsingLastDistance(average_cost, + len, 0); + best_len = len; + *best_len_out = len; + *best_len_code_out = len; + *best_distance_out = backward; + *best_score_out = best_score; + compare_char = ring_buffer[cur_ix_masked + best_len]; + if (kBucketSweep == 1) { + return true; + } else { + match_found = true; + } + } + } + } + const uint32_t key = Hash(&ring_buffer[cur_ix_masked]); + if (kBucketSweep == 1) { + // Only one to look for, don't bother to prepare for a loop. + prev_ix = buckets_[key]; + backward = cur_ix - prev_ix; + prev_ix &= ring_buffer_mask; + if (compare_char != ring_buffer[prev_ix + best_len_in]) { + return false; + } + if (PREDICT_FALSE(backward == 0 || backward > max_backward)) { + return false; + } + const int len = FindMatchLengthWithLimit(&ring_buffer[prev_ix], + &ring_buffer[cur_ix_masked], + max_length); + if (len >= 4) { + *best_len_out = len; + *best_len_code_out = len; + *best_distance_out = backward; + *best_score_out = BackwardReferenceScore(average_cost, len, backward); + return true; + } else { + return false; + } + } else { + uint32_t *bucket = buckets_ + key; + prev_ix = *bucket++; + for (int i = 0; i < kBucketSweep; ++i, prev_ix = *bucket++) { + const int backward = cur_ix - prev_ix; + prev_ix &= ring_buffer_mask; + if (compare_char != ring_buffer[prev_ix + best_len]) { + continue; + } + if (PREDICT_FALSE(backward == 0 || backward > max_backward)) { + continue; + } + const int len = + FindMatchLengthWithLimit(&ring_buffer[prev_ix], + &ring_buffer[cur_ix_masked], + max_length); + if (len >= 4) { + const double score = BackwardReferenceScore(average_cost, + len, backward); + if (best_score < score) { + best_score = score; + best_len = len; + *best_len_out = best_len; + *best_len_code_out = best_len; + *best_distance_out = backward; + *best_score_out = score; + compare_char = ring_buffer[cur_ix_masked + best_len]; + match_found = true; + } + } + } + if (!match_found && num_dict_matches_ >= (num_dict_lookups_ >> 7)) { + ++num_dict_lookups_; + const uint32_t key = Hash<14, 4>(&ring_buffer[cur_ix_masked]) << 1; + const uint16_t v = kStaticDictionaryHash[key]; + if (v > 0) { + const int len = v & 31; + const int dist = v >> 5; + const int offset = kBrotliDictionaryOffsetsByLength[len] + len * dist; + if (len <= max_length) { + const int matchlen = + FindMatchLengthWithLimit(&ring_buffer[cur_ix_masked], + &kBrotliDictionary[offset], len); + if (matchlen == len) { + const size_t backward = max_backward + dist + 1; + const double score = BackwardReferenceScore(average_cost, + len, backward); + if (best_score < score) { + ++num_dict_matches_; + best_score = score; + best_len = len; + *best_len_out = best_len; + *best_len_code_out = best_len; + *best_distance_out = backward; + *best_score_out = best_score; + return true; + } + } + } + } + } + return match_found; + } + } + + private: + static const uint32_t kBucketSize = 1 << kBucketBits; + uint32_t buckets_[kBucketSize + kBucketSweep]; + size_t num_dict_lookups_; + size_t num_dict_matches_; +}; + +// A (forgetful) hash table to the data seen by the compressor, to +// help create backward references to previous data. +// +// This is a hash map of fixed size (kBucketSize) to a ring buffer of +// fixed size (kBlockSize). The ring buffer contains the last kBlockSize +// index positions of the given hash key in the compressed data. +template +class HashLongestMatch { + public: + HashLongestMatch() : static_dict_(NULL) { + Reset(); + } + void Reset() { + std::fill(&num_[0], &num_[sizeof(num_) / sizeof(num_[0])], 0); + num_dict_lookups_ = 0; + num_dict_matches_ = 0; + } + void SetStaticDictionary(const StaticDictionary *dict) { + static_dict_ = dict; + } + bool HasStaticDictionary() const { + return static_dict_ != NULL; + } + + // Look at 3 bytes at data. + // Compute a hash from these, and store the value of ix at that position. + inline void Store(const uint8_t *data, const int ix) { + const uint32_t key = Hash(data); + const int minor_ix = num_[key] & kBlockMask; + buckets_[key][minor_ix] = ix; + ++num_[key]; + } + + // Store hashes for a range of data. + void StoreHashes(const uint8_t *data, size_t len, int startix, int mask) { + for (int p = 0; p < len; ++p) { + Store(&data[p & mask], startix + p); + } + } + + // Find a longest backward match of &data[cur_ix] up to the length of + // max_length. + // + // Does not look for matches longer than max_length. + // Does not look for matches further away than max_backward. + // Writes the best found match length into best_len_out. + // Writes the index (&data[index]) offset from the start of the best match + // into best_distance_out. + // Write the score of the best match into best_score_out. + bool FindLongestMatch(const uint8_t * __restrict data, + const size_t ring_buffer_mask, + const float * __restrict literal_cost, + const size_t literal_cost_mask, + const double average_cost, + const int* __restrict distance_cache, + const uint32_t cur_ix, + uint32_t max_length, + const uint32_t max_backward, + int * __restrict best_len_out, + int * __restrict best_len_code_out, + int * __restrict best_distance_out, + double * __restrict best_score_out) { + *best_len_code_out = 0; + const size_t cur_ix_masked = cur_ix & ring_buffer_mask; + double start_cost_diff4 = 0.0; + double start_cost_diff3 = 0.0; + double start_cost_diff2 = 0.0; + if (kUseCostModel) { + start_cost_diff4 = literal_cost == NULL ? 0 : + literal_cost[cur_ix & literal_cost_mask] + + literal_cost[(cur_ix + 1) & literal_cost_mask] + + literal_cost[(cur_ix + 2) & literal_cost_mask] + + literal_cost[(cur_ix + 3) & literal_cost_mask] - + 4 * average_cost; + start_cost_diff3 = literal_cost == NULL ? 0 : + literal_cost[cur_ix & literal_cost_mask] + + literal_cost[(cur_ix + 1) & literal_cost_mask] + + literal_cost[(cur_ix + 2) & literal_cost_mask] - + 3 * average_cost + 0.3; + start_cost_diff2 = literal_cost == NULL ? 0 : + literal_cost[cur_ix & literal_cost_mask] + + literal_cost[(cur_ix + 1) & literal_cost_mask] - + 2 * average_cost + 1.2; + } + bool match_found = false; + // Don't accept a short copy from far away. + double best_score = *best_score_out; + int best_len = *best_len_out; + *best_len_out = 0; + // Try last distance first. + for (int i = 0; i < kNumLastDistancesToCheck; ++i) { + const int idx = kDistanceCacheIndex[i]; + const int backward = distance_cache[idx] + kDistanceCacheOffset[i]; + size_t prev_ix = cur_ix - backward; + if (prev_ix >= cur_ix) { + continue; + } + if (PREDICT_FALSE(backward > max_backward)) { + continue; + } + prev_ix &= ring_buffer_mask; + + if (cur_ix_masked + best_len > ring_buffer_mask || + prev_ix + best_len > ring_buffer_mask || + data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { + continue; + } + const size_t len = + FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], + max_length); + if (len >= std::max(kMinLength, 3) || + (kMinLength == 2 && len == 2 && i < 2)) { + // Comparing for >= 2 does not change the semantics, but just saves for + // a few unnecessary binary logarithms in backward reference score, + // since we are not interested in such short matches. + double score = BackwardReferenceScoreUsingLastDistance( + average_cost, len, i); + if (kUseCostModel) { + switch (len) { + case 2: score += start_cost_diff2; break; + case 3: score += start_cost_diff3; break; + default: score += start_cost_diff4; + } + } + if (best_score < score) { + best_score = score; + best_len = len; + *best_len_out = best_len; + *best_len_code_out = best_len; + *best_distance_out = backward; + *best_score_out = best_score; + match_found = true; + } + } + } + if (kMinLength == 2) { + int stop = int(cur_ix) - 64; + if (stop < 0) { stop = 0; } + start_cost_diff2 -= 1.0; + for (int i = cur_ix - 1; i > stop; --i) { + size_t prev_ix = i; + const size_t backward = cur_ix - prev_ix; + if (PREDICT_FALSE(backward > max_backward)) { + break; + } + prev_ix &= ring_buffer_mask; + if (data[cur_ix_masked] != data[prev_ix] || + data[cur_ix_masked + 1] != data[prev_ix + 1]) { + continue; + } + int len = 2; + const double score = + average_cost * 2 - 2.3 * Log2Floor(backward) + start_cost_diff2; + + if (best_score < score) { + best_score = score; + best_len = len; + *best_len_out = best_len; + *best_len_code_out = best_len; + *best_distance_out = backward; + match_found = true; + } + } + } + const uint32_t key = Hash(&data[cur_ix_masked]); + const int * __restrict const bucket = &buckets_[key][0]; + const int down = (num_[key] > kBlockSize) ? (num_[key] - kBlockSize) : 0; + for (int i = num_[key] - 1; i >= down; --i) { + int prev_ix = bucket[i & kBlockMask]; + if (prev_ix >= 0) { + const size_t backward = cur_ix - prev_ix; + if (PREDICT_FALSE(backward > max_backward)) { + break; + } + prev_ix &= ring_buffer_mask; + if (cur_ix_masked + best_len > ring_buffer_mask || + prev_ix + best_len > ring_buffer_mask || + data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { + continue; + } + const size_t len = + FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], + max_length); + if (len >= std::max(kMinLength, 3)) { + // Comparing for >= 3 does not change the semantics, but just saves + // for a few unnecessary binary logarithms in backward reference + // score, since we are not interested in such short matches. + double score = BackwardReferenceScore(average_cost, + len, backward); + if (kUseCostModel) { + score += (len >= 4) ? start_cost_diff4 : start_cost_diff3; + } + if (best_score < score) { + best_score = score; + best_len = len; + *best_len_out = best_len; + *best_len_code_out = best_len; + *best_distance_out = backward; + *best_score_out = best_score; + match_found = true; + } + } + } + } + if (!match_found && num_dict_matches_ >= (num_dict_lookups_ >> 7)) { + uint32_t key = Hash<14, 4>(&data[cur_ix_masked]) << 1; + for (int k = 0; k < 2; ++k, ++key) { + ++num_dict_lookups_; + const uint16_t v = kStaticDictionaryHash[key]; + if (v > 0) { + const int len = v & 31; + const int dist = v >> 5; + const int offset = kBrotliDictionaryOffsetsByLength[len] + len * dist; + if (len <= max_length) { + const int matchlen = + FindMatchLengthWithLimit(&data[cur_ix_masked], + &kBrotliDictionary[offset], len); + if (matchlen == len) { + const size_t backward = max_backward + dist + 1; + double score = BackwardReferenceScore(average_cost, + len, backward); + if (kUseCostModel) { + score += start_cost_diff4; + } + if (best_score < score) { + ++num_dict_matches_; + best_score = score; + best_len = len; + *best_len_out = best_len; + *best_len_code_out = best_len; + *best_distance_out = backward; + *best_score_out = best_score; + match_found = true; + break; + } + } + } + } + } + } + if (kUseDictionary && static_dict_ != NULL) { + // We decide based on first 4 bytes how many bytes to test for. + uint32_t prefix = BROTLI_UNALIGNED_LOAD32(&data[cur_ix_masked]); + int maxlen = static_dict_->GetLength(prefix); + for (int len = std::min(maxlen, max_length); + len > best_len && len >= 4; --len) { + std::string snippet((const char *)&data[cur_ix_masked], len); + int copy_len_code; + int word_id; + if (static_dict_->Get(snippet, ©_len_code, &word_id)) { + const size_t backward = max_backward + word_id + 1; + const double score = (BackwardReferenceScore(average_cost, + len, backward) + + start_cost_diff4); + if (best_score < score) { + best_score = score; + best_len = len; + *best_len_out = best_len; + *best_len_code_out = copy_len_code; + *best_distance_out = backward; + *best_score_out = best_score; + match_found = true; + } + } + } + } + return match_found; + } + + private: + // Number of hash buckets. + static const uint32_t kBucketSize = 1 << kBucketBits; + + // Only kBlockSize newest backward references are kept, + // and the older are forgotten. + static const uint32_t kBlockSize = 1 << kBlockBits; + + // Mask for accessing entries in a block (in a ringbuffer manner). + static const uint32_t kBlockMask = (1 << kBlockBits) - 1; + + // Number of entries in a particular bucket. + uint16_t num_[kBucketSize]; + + // Buckets containing kBlockSize of backward references. + int buckets_[kBucketSize][kBlockSize]; + + size_t num_dict_lookups_; + size_t num_dict_matches_; + + const StaticDictionary *static_dict_; +}; + +struct Hashers { + typedef HashLongestMatchQuickly<16, 1> H1; + typedef HashLongestMatchQuickly<17, 4> H2; + typedef HashLongestMatch<14, 4, 4, 4, false, false> H3; + typedef HashLongestMatch<14, 5, 4, 4, false, false> H4; + typedef HashLongestMatch<15, 6, 4, 10, false, false> H5; + typedef HashLongestMatch<15, 7, 4, 10, false, false> H6; + typedef HashLongestMatch<15, 8, 4, 16, false, false> H7; + typedef HashLongestMatch<15, 8, 4, 16, true, true> H8; + typedef HashLongestMatch<15, 8, 2, 16, true, false> H9; + + void Init(int type) { + switch (type) { + case 1: hash_h1.reset(new H1); break; + case 2: hash_h2.reset(new H2); break; + case 3: hash_h3.reset(new H3); break; + case 4: hash_h4.reset(new H4); break; + case 5: hash_h5.reset(new H5); break; + case 6: hash_h6.reset(new H6); break; + case 7: hash_h7.reset(new H7); break; + case 8: hash_h8.reset(new H8); break; + case 9: hash_h9.reset(new H9); break; + default: break; + } + } + + void SetStaticDictionary(const StaticDictionary *dict) { + if (hash_h8.get() != NULL) hash_h8->SetStaticDictionary(dict); + } + + std::unique_ptr

hash_h1; + std::unique_ptr

hash_h2; + std::unique_ptr

hash_h3; + std::unique_ptr

hash_h4; + std::unique_ptr

hash_h5; + std::unique_ptr
hash_h6; + std::unique_ptr hash_h7; + std::unique_ptr hash_h8; + std::unique_ptr hash_h9; +}; + +} // namespace brotli + +#endif // BROTLI_ENC_HASH_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/histogram.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/histogram.cc new file mode 100644 index 0000000..ac590aa --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/histogram.cc @@ -0,0 +1,76 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Build per-context histograms of literals, commands and distance codes. + +#include "./histogram.h" + +#include +#include + +#include "./block_splitter.h" +#include "./command.h" +#include "./context.h" +#include "./prefix.h" + +namespace brotli { + +void BuildHistograms( + const Command* cmds, + const size_t num_commands, + const BlockSplit& literal_split, + const BlockSplit& insert_and_copy_split, + const BlockSplit& dist_split, + const uint8_t* ringbuffer, + size_t start_pos, + size_t mask, + uint8_t prev_byte, + uint8_t prev_byte2, + const std::vector& context_modes, + std::vector* literal_histograms, + std::vector* insert_and_copy_histograms, + std::vector* copy_dist_histograms) { + size_t pos = start_pos; + BlockSplitIterator literal_it(literal_split); + BlockSplitIterator insert_and_copy_it(insert_and_copy_split); + BlockSplitIterator dist_it(dist_split); + for (int i = 0; i < num_commands; ++i) { + const Command &cmd = cmds[i]; + insert_and_copy_it.Next(); + (*insert_and_copy_histograms)[insert_and_copy_it.type_].Add( + cmd.cmd_prefix_); + for (int j = 0; j < cmd.insert_len_; ++j) { + literal_it.Next(); + int context = (literal_it.type_ << kLiteralContextBits) + + Context(prev_byte, prev_byte2, context_modes[literal_it.type_]); + (*literal_histograms)[context].Add(ringbuffer[pos & mask]); + prev_byte2 = prev_byte; + prev_byte = ringbuffer[pos & mask]; + ++pos; + } + pos += cmd.copy_len_; + if (cmd.copy_len_ > 0) { + prev_byte2 = ringbuffer[(pos - 2) & mask]; + prev_byte = ringbuffer[(pos - 1) & mask]; + if (cmd.cmd_prefix_ >= 128) { + dist_it.Next(); + int context = (dist_it.type_ << kDistanceContextBits) + + cmd.DistanceContext(); + (*copy_dist_histograms)[context].Add(cmd.dist_prefix_); + } + } + } +} + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/histogram.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/histogram.h new file mode 100644 index 0000000..d78e699 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/histogram.h @@ -0,0 +1,107 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Models the histograms of literals, commands and distance codes. + +#ifndef BROTLI_ENC_HISTOGRAM_H_ +#define BROTLI_ENC_HISTOGRAM_H_ + +#include +#include +#include +#include +#include "./command.h" +#include "./fast_log.h" +#include "./prefix.h" + +namespace brotli { + +class BlockSplit; + +// A simple container for histograms of data in blocks. +template +struct Histogram { + Histogram() { + Clear(); + } + void Clear() { + memset(data_, 0, sizeof(data_)); + total_count_ = 0; + } + void Add(int val) { + ++data_[val]; + ++total_count_; + } + void Remove(int val) { + --data_[val]; + --total_count_; + } + template + void Add(const DataType *p, size_t n) { + total_count_ += n; + n += 1; + while(--n) ++data_[*p++]; + } + void AddHistogram(const Histogram& v) { + total_count_ += v.total_count_; + for (int i = 0; i < kDataSize; ++i) { + data_[i] += v.data_[i]; + } + } + double EntropyBitCost() const { + double retval = total_count_ * FastLog2(total_count_); + for (int i = 0; i < kDataSize; ++i) { + retval -= data_[i] * FastLog2(data_[i]); + } + return retval; + } + + int data_[kDataSize]; + int total_count_; + double bit_cost_; +}; + +// Literal histogram. +typedef Histogram<256> HistogramLiteral; +// Prefix histograms. +typedef Histogram HistogramCommand; +typedef Histogram HistogramDistance; +typedef Histogram HistogramBlockLength; +// Context map histogram, 256 Huffman tree indexes + 16 run length codes. +typedef Histogram<272> HistogramContextMap; +// Block type histogram, 256 block types + 2 special symbols. +typedef Histogram<258> HistogramBlockType; + +static const int kLiteralContextBits = 6; +static const int kDistanceContextBits = 2; + +void BuildHistograms( + const Command* cmds, + const size_t num_commands, + const BlockSplit& literal_split, + const BlockSplit& insert_and_copy_split, + const BlockSplit& dist_split, + const uint8_t* ringbuffer, + size_t pos, + size_t mask, + uint8_t prev_byte, + uint8_t prev_byte2, + const std::vector& context_modes, + std::vector* literal_histograms, + std::vector* insert_and_copy_histograms, + std::vector* copy_dist_histograms); + +} // namespace brotli + +#endif // BROTLI_ENC_HISTOGRAM_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/literal_cost.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/literal_cost.cc new file mode 100644 index 0000000..d02a9e0 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/literal_cost.cc @@ -0,0 +1,172 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Literal cost model to allow backward reference replacement to be efficient. + +#include "./literal_cost.h" + +#include +#include +#include + +#include "./fast_log.h" + +namespace brotli { + +static int UTF8Position(int last, int c, int clamp) { + if (c < 128) { + return 0; // Next one is the 'Byte 1' again. + } else if (c >= 192) { + return std::min(1, clamp); // Next one is the 'Byte 2' of utf-8 encoding. + } else { + // Let's decide over the last byte if this ends the sequence. + if (last < 0xe0) { + return 0; // Completed two or three byte coding. + } else { + return std::min(2, clamp); // Next one is the 'Byte 3' of utf-8 encoding. + } + } +} + +static int DecideMultiByteStatsLevel(size_t pos, size_t len, size_t mask, + const uint8_t *data) { + int counts[3] = { 0 }; + int max_utf8 = 1; // should be 2, but 1 compresses better. + int last_c = 0; + int utf8_pos = 0; + for (int i = 0; i < len; ++i) { + int c = data[(pos + i) & mask]; + utf8_pos = UTF8Position(last_c, c, 2); + ++counts[utf8_pos]; + last_c = c; + } + if (counts[2] < 500) { + max_utf8 = 1; + } + if (counts[1] + counts[2] < 25) { + max_utf8 = 0; + } + return max_utf8; +} + +void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask, + size_t cost_mask, const uint8_t *data, + float *cost) { + + // max_utf8 is 0 (normal ascii single byte modeling), + // 1 (for 2-byte utf-8 modeling), or 2 (for 3-byte utf-8 modeling). + const int max_utf8 = DecideMultiByteStatsLevel(pos, len, mask, data); + int histogram[3][256] = { { 0 } }; + int window_half = 495; + int in_window = std::min(static_cast(window_half), len); + int in_window_utf8[3] = { 0 }; + + // Bootstrap histograms. + int last_c = 0; + int utf8_pos = 0; + for (int i = 0; i < in_window; ++i) { + int c = data[(pos + i) & mask]; + ++histogram[utf8_pos][c]; + ++in_window_utf8[utf8_pos]; + utf8_pos = UTF8Position(last_c, c, max_utf8); + last_c = c; + } + + // Compute bit costs with sliding window. + for (int i = 0; i < len; ++i) { + if (i - window_half >= 0) { + // Remove a byte in the past. + int c = (i - window_half - 1) < 0 ? + 0 : data[(pos + i - window_half - 1) & mask]; + int last_c = (i - window_half - 2) < 0 ? + 0 : data[(pos + i - window_half - 2) & mask]; + int utf8_pos2 = UTF8Position(last_c, c, max_utf8); + --histogram[utf8_pos2][data[(pos + i - window_half) & mask]]; + --in_window_utf8[utf8_pos2]; + } + if (i + window_half < len) { + // Add a byte in the future. + int c = (i + window_half - 1) < 0 ? + 0 : data[(pos + i + window_half - 1) & mask]; + int last_c = (i + window_half - 2) < 0 ? + 0 : data[(pos + i + window_half - 2) & mask]; + int utf8_pos2 = UTF8Position(last_c, c, max_utf8); + ++histogram[utf8_pos2][data[(pos + i + window_half) & mask]]; + ++in_window_utf8[utf8_pos2]; + } + int c = i < 1 ? 0 : data[(pos + i - 1) & mask]; + int last_c = i < 2 ? 0 : data[(pos + i - 2) & mask]; + int utf8_pos = UTF8Position(last_c, c, max_utf8); + int masked_pos = (pos + i) & mask; + int histo = histogram[utf8_pos][data[masked_pos]]; + if (histo == 0) { + histo = 1; + } + float lit_cost = FastLog2(in_window_utf8[utf8_pos]) - FastLog2(histo); + lit_cost += 0.02905; + if (lit_cost < 1.0) { + lit_cost *= 0.5; + lit_cost += 0.5; + } + // Make the first bytes more expensive -- seems to help, not sure why. + // Perhaps because the entropy source is changing its properties + // rapidly in the beginning of the file, perhaps because the beginning + // of the data is a statistical "anomaly". + if (i < 2000) { + lit_cost += 0.7 - ((2000 - i) / 2000.0 * 0.35); + } + cost[(pos + i) & cost_mask] = lit_cost; + } +} + +void EstimateBitCostsForLiterals(size_t pos, size_t len, size_t mask, + size_t cost_mask, const uint8_t *data, + float *cost) { + int histogram[256] = { 0 }; + int window_half = 2000; + int in_window = std::min(static_cast(window_half), len); + + // Bootstrap histogram. + for (int i = 0; i < in_window; ++i) { + ++histogram[data[(pos + i) & mask]]; + } + + // Compute bit costs with sliding window. + for (int i = 0; i < len; ++i) { + if (i - window_half >= 0) { + // Remove a byte in the past. + --histogram[data[(pos + i - window_half) & mask]]; + --in_window; + } + if (i + window_half < len) { + // Add a byte in the future. + ++histogram[data[(pos + i + window_half) & mask]]; + ++in_window; + } + int histo = histogram[data[(pos + i) & mask]]; + if (histo == 0) { + histo = 1; + } + float lit_cost = FastLog2(in_window) - FastLog2(histo); + lit_cost += 0.029; + if (lit_cost < 1.0) { + lit_cost *= 0.5; + lit_cost += 0.5; + } + cost[(pos + i) & cost_mask] = lit_cost; + } +} + + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/literal_cost.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/literal_cost.h new file mode 100644 index 0000000..5c1eca4 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/literal_cost.h @@ -0,0 +1,38 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Literal cost model to allow backward reference replacement to be efficient. + +#ifndef BROTLI_ENC_LITERAL_COST_H_ +#define BROTLI_ENC_LITERAL_COST_H_ + +#include +#include + +namespace brotli { + +// Estimates how many bits the literals in the interval [pos, pos + len) in the +// ringbuffer (data, mask) will take entropy coded and writes these estimates +// to the ringbuffer (cost, mask). +void EstimateBitCostsForLiterals(size_t pos, size_t len, size_t mask, + size_t cost_mask, const uint8_t *data, + float *cost); + +void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask, + size_t cost_mask, const uint8_t *data, + float *cost); + +} // namespace brotli + +#endif // BROTLI_ENC_LITERAL_COST_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/metablock.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/metablock.cc new file mode 100644 index 0000000..19f4d4a --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/metablock.cc @@ -0,0 +1,319 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Algorithms for distributing the literals and commands of a metablock between +// block types and contexts. + +#include "./metablock.h" + +#include "./block_splitter.h" +#include "./cluster.h" +#include "./histogram.h" + +namespace brotli { + +void BuildMetaBlock(const uint8_t* ringbuffer, + const size_t pos, + const size_t mask, + uint8_t prev_byte, + uint8_t prev_byte2, + const Command* cmds, + size_t num_commands, + int literal_context_mode, + bool enable_context_modeling, + MetaBlockSplit* mb) { + SplitBlock(cmds, num_commands, + &ringbuffer[pos & mask], + &mb->literal_split, + &mb->command_split, + &mb->distance_split); + + std::vector literal_context_modes(mb->literal_split.num_types, + literal_context_mode); + + int num_literal_contexts = + mb->literal_split.num_types << kLiteralContextBits; + int num_distance_contexts = + mb->distance_split.num_types << kDistanceContextBits; + std::vector literal_histograms(num_literal_contexts); + mb->command_histograms.resize(mb->command_split.num_types); + std::vector distance_histograms(num_distance_contexts); + BuildHistograms(cmds, num_commands, + mb->literal_split, + mb->command_split, + mb->distance_split, + ringbuffer, + pos, + mask, + prev_byte, + prev_byte2, + literal_context_modes, + &literal_histograms, + &mb->command_histograms, + &distance_histograms); + + // Histogram ids need to fit in one byte. + static const int kMaxNumberOfHistograms = 256; + + mb->literal_histograms = literal_histograms; + if (enable_context_modeling) { + ClusterHistograms(literal_histograms, + 1 << kLiteralContextBits, + mb->literal_split.num_types, + kMaxNumberOfHistograms, + &mb->literal_histograms, + &mb->literal_context_map); + } else { + ClusterHistogramsTrivial(literal_histograms, + 1 << kLiteralContextBits, + mb->literal_split.num_types, + kMaxNumberOfHistograms, + &mb->literal_histograms, + &mb->literal_context_map); + } + + mb->distance_histograms = distance_histograms; + if (enable_context_modeling) { + ClusterHistograms(distance_histograms, + 1 << kDistanceContextBits, + mb->distance_split.num_types, + kMaxNumberOfHistograms, + &mb->distance_histograms, + &mb->distance_context_map); + } else { + ClusterHistogramsTrivial(distance_histograms, + 1 << kDistanceContextBits, + mb->distance_split.num_types, + kMaxNumberOfHistograms, + &mb->distance_histograms, + &mb->distance_context_map); + } +} + +// Greedy block splitter for one block category (literal, command or distance). +template +class BlockSplitter { + public: + BlockSplitter(int alphabet_size, + int min_block_size, + double split_threshold, + int num_symbols, + BlockSplit* split, + std::vector* histograms) + : alphabet_size_(alphabet_size), + min_block_size_(min_block_size), + split_threshold_(split_threshold), + num_blocks_(0), + split_(split), + histograms_(histograms), + target_block_size_(min_block_size), + block_size_(0), + curr_histogram_ix_(0), + merge_last_count_(0) { + int max_num_blocks = num_symbols / min_block_size + 1; + // We have to allocate one more histogram than the maximum number of block + // types for the current histogram when the meta-block is too big. + int max_num_types = std::min(max_num_blocks, kMaxBlockTypes + 1); + split_->lengths.resize(max_num_blocks); + split_->types.resize(max_num_blocks); + histograms_->resize(max_num_types); + last_histogram_ix_[0] = last_histogram_ix_[1] = 0; + } + + // Adds the next symbol to the current histogram. When the current histogram + // reaches the target size, decides on merging the block. + void AddSymbol(int symbol) { + (*histograms_)[curr_histogram_ix_].Add(symbol); + ++block_size_; + if (block_size_ == target_block_size_) { + FinishBlock(/* is_final = */ false); + } + } + + // Does either of three things: + // (1) emits the current block with a new block type; + // (2) emits the current block with the type of the second last block; + // (3) merges the current block with the last block. + void FinishBlock(bool is_final) { + if (block_size_ < min_block_size_) { + block_size_ = min_block_size_; + } + if (num_blocks_ == 0) { + // Create first block. + split_->lengths[0] = block_size_; + split_->types[0] = 0; + last_entropy_[0] = + BitsEntropy(&(*histograms_)[0].data_[0], alphabet_size_); + last_entropy_[1] = last_entropy_[0]; + ++num_blocks_; + ++split_->num_types; + ++curr_histogram_ix_; + block_size_ = 0; + } else if (block_size_ > 0) { + double entropy = BitsEntropy(&(*histograms_)[curr_histogram_ix_].data_[0], + alphabet_size_); + HistogramType combined_histo[2]; + double combined_entropy[2]; + double diff[2]; + for (int j = 0; j < 2; ++j) { + int last_histogram_ix = last_histogram_ix_[j]; + combined_histo[j] = (*histograms_)[curr_histogram_ix_]; + combined_histo[j].AddHistogram((*histograms_)[last_histogram_ix]); + combined_entropy[j] = BitsEntropy( + &combined_histo[j].data_[0], alphabet_size_); + diff[j] = combined_entropy[j] - entropy - last_entropy_[j]; + } + + if (split_->num_types < kMaxBlockTypes && + diff[0] > split_threshold_ && + diff[1] > split_threshold_) { + // Create new block. + split_->lengths[num_blocks_] = block_size_; + split_->types[num_blocks_] = split_->num_types; + last_histogram_ix_[1] = last_histogram_ix_[0]; + last_histogram_ix_[0] = split_->num_types; + last_entropy_[1] = last_entropy_[0]; + last_entropy_[0] = entropy; + ++num_blocks_; + ++split_->num_types; + ++curr_histogram_ix_; + block_size_ = 0; + merge_last_count_ = 0; + target_block_size_ = min_block_size_; + } else if (diff[1] < diff[0] - 20.0) { + // Combine this block with second last block. + split_->lengths[num_blocks_] = block_size_; + split_->types[num_blocks_] = split_->types[num_blocks_ - 2]; + std::swap(last_histogram_ix_[0], last_histogram_ix_[1]); + (*histograms_)[last_histogram_ix_[0]] = combined_histo[1]; + last_entropy_[1] = last_entropy_[0]; + last_entropy_[0] = combined_entropy[1]; + ++num_blocks_; + block_size_ = 0; + (*histograms_)[curr_histogram_ix_].Clear(); + merge_last_count_ = 0; + target_block_size_ = min_block_size_; + } else { + // Combine this block with last block. + split_->lengths[num_blocks_ - 1] += block_size_; + (*histograms_)[last_histogram_ix_[0]] = combined_histo[0]; + last_entropy_[0] = combined_entropy[0]; + if (split_->num_types == 1) { + last_entropy_[1] = last_entropy_[0]; + } + block_size_ = 0; + (*histograms_)[curr_histogram_ix_].Clear(); + if (++merge_last_count_ > 1) { + target_block_size_ += min_block_size_; + } + } + } + if (is_final) { + (*histograms_).resize(split_->num_types); + split_->types.resize(num_blocks_); + split_->lengths.resize(num_blocks_); + } + } + + private: + static const int kMaxBlockTypes = 256; + + // Alphabet size of particular block category. + const int alphabet_size_; + // We collect at least this many symbols for each block. + const int min_block_size_; + // We merge histograms A and B if + // entropy(A+B) < entropy(A) + entropy(B) + split_threshold_, + // where A is the current histogram and B is the histogram of the last or the + // second last block type. + const double split_threshold_; + + int num_blocks_; + BlockSplit* split_; // not owned + std::vector* histograms_; // not owned + + // The number of symbols that we want to collect before deciding on whether + // or not to merge the block with a previous one or emit a new block. + int target_block_size_; + // The number of symbols in the current histogram. + int block_size_; + // Offset of the current histogram. + int curr_histogram_ix_; + // Offset of the histograms of the previous two block types. + int last_histogram_ix_[2]; + // Entropy of the previous two block types. + double last_entropy_[2]; + // The number of times we merged the current block with the last one. + int merge_last_count_; +}; + +void BuildMetaBlockGreedy(const uint8_t* ringbuffer, + size_t pos, + size_t mask, + const Command *commands, + size_t n_commands, + MetaBlockSplit* mb) { + int num_literals = 0; + for (int i = 0; i < n_commands; ++i) { + num_literals += commands[i].insert_len_; + } + + BlockSplitter lit_blocks( + 256, 512, 400.0, num_literals, + &mb->literal_split, &mb->literal_histograms); + BlockSplitter cmd_blocks( + kNumCommandPrefixes, 1024, 500.0, n_commands, + &mb->command_split, &mb->command_histograms); + BlockSplitter dist_blocks( + 64, 512, 100.0, n_commands, + &mb->distance_split, &mb->distance_histograms); + + for (int i = 0; i < n_commands; ++i) { + const Command cmd = commands[i]; + cmd_blocks.AddSymbol(cmd.cmd_prefix_); + for (int j = 0; j < cmd.insert_len_; ++j) { + lit_blocks.AddSymbol(ringbuffer[pos & mask]); + ++pos; + } + pos += cmd.copy_len_; + if (cmd.copy_len_ > 0 && cmd.cmd_prefix_ >= 128) { + dist_blocks.AddSymbol(cmd.dist_prefix_); + } + } + + lit_blocks.FinishBlock(/* is_final = */ true); + cmd_blocks.FinishBlock(/* is_final = */ true); + dist_blocks.FinishBlock(/* is_final = */ true); +} + +void OptimizeHistograms(int num_direct_distance_codes, + int distance_postfix_bits, + MetaBlockSplit* mb) { + for (int i = 0; i < mb->literal_histograms.size(); ++i) { + OptimizeHuffmanCountsForRle(256, &mb->literal_histograms[i].data_[0]); + } + for (int i = 0; i < mb->command_histograms.size(); ++i) { + OptimizeHuffmanCountsForRle(kNumCommandPrefixes, + &mb->command_histograms[i].data_[0]); + } + int num_distance_codes = + kNumDistanceShortCodes + num_direct_distance_codes + + (48 << distance_postfix_bits); + for (int i = 0; i < mb->distance_histograms.size(); ++i) { + OptimizeHuffmanCountsForRle(num_distance_codes, + &mb->distance_histograms[i].data_[0]); + } +} + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/metablock.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/metablock.h new file mode 100644 index 0000000..54a9138 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/metablock.h @@ -0,0 +1,71 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Algorithms for distributing the literals and commands of a metablock between +// block types and contexts. + +#ifndef BROTLI_ENC_METABLOCK_H_ +#define BROTLI_ENC_METABLOCK_H_ + +#include + +#include "./command.h" +#include "./histogram.h" + +namespace brotli { + +struct BlockSplit { + BlockSplit() : num_types(0) {} + + int num_types; + std::vector types; + std::vector lengths; +}; + +struct MetaBlockSplit { + BlockSplit literal_split; + BlockSplit command_split; + BlockSplit distance_split; + std::vector literal_context_map; + std::vector distance_context_map; + std::vector literal_histograms; + std::vector command_histograms; + std::vector distance_histograms; +}; + +void BuildMetaBlock(const uint8_t* ringbuffer, + const size_t pos, + const size_t mask, + uint8_t prev_byte, + uint8_t prev_byte2, + const Command* cmds, + size_t num_commands, + int literal_context_mode, + bool enable_context_modleing, + MetaBlockSplit* mb); + +void BuildMetaBlockGreedy(const uint8_t* ringbuffer, + size_t pos, + size_t mask, + const Command *commands, + size_t n_commands, + MetaBlockSplit* mb); + +void OptimizeHistograms(int num_direct_distance_codes, + int distance_postfix_bits, + MetaBlockSplit* mb); + +} // namespace brotli + +#endif // BROTLI_ENC_METABLOCK_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/port.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/port.h new file mode 100644 index 0000000..1b178de --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/port.h @@ -0,0 +1,143 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Macros for endianness, branch prediction and unaligned loads and stores. + +#ifndef BROTLI_ENC_PORT_H_ +#define BROTLI_ENC_PORT_H_ + +#if defined OS_LINUX || defined OS_CYGWIN +#include +#elif defined OS_FREEBSD +#include +#elif defined OS_MACOSX +#include +/* Let's try and follow the Linux convention */ +#define __BYTE_ORDER BYTE_ORDER +#define __LITTLE_ENDIAN LITTLE_ENDIAN +#define __BIG_ENDIAN BIG_ENDIAN +#endif + +// define the macros IS_LITTLE_ENDIAN or IS_BIG_ENDIAN +// using the above endian definitions from endian.h if +// endian.h was included +#ifdef __BYTE_ORDER +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define IS_LITTLE_ENDIAN +#endif + +#if __BYTE_ORDER == __BIG_ENDIAN +#define IS_BIG_ENDIAN +#endif + +#else + +#if defined(__LITTLE_ENDIAN__) +#define IS_LITTLE_ENDIAN +#elif defined(__BIG_ENDIAN__) +#define IS_BIG_ENDIAN +#endif +#endif // __BYTE_ORDER + +// Enable little-endian optimization for x64 architecture on Windows. +#if (defined(_WIN32) || defined(_WIN64)) && defined(_M_X64) +#define IS_LITTLE_ENDIAN +#endif + +#if defined(COMPILER_GCC3) +#define PREDICT_FALSE(x) (__builtin_expect(x, 0)) +#define PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) +#else +#define PREDICT_FALSE(x) x +#define PREDICT_TRUE(x) x +#endif + +// Portable handling of unaligned loads, stores, and copies. +// On some platforms, like ARM, the copy functions can be more efficient +// then a load and a store. + +#if defined(ARCH_PIII) || defined(ARCH_ATHLON) || \ + defined(ARCH_K8) || defined(_ARCH_PPC) + +// x86 and x86-64 can perform unaligned loads/stores directly; +// modern PowerPC hardware can also do unaligned integer loads and stores; +// but note: the FPU still sends unaligned loads and stores to a trap handler! + +#define BROTLI_UNALIGNED_LOAD32(_p) (*reinterpret_cast(_p)) +#define BROTLI_UNALIGNED_LOAD64(_p) (*reinterpret_cast(_p)) + +#define BROTLI_UNALIGNED_STORE32(_p, _val) \ + (*reinterpret_cast(_p) = (_val)) +#define BROTLI_UNALIGNED_STORE64(_p, _val) \ + (*reinterpret_cast(_p) = (_val)) + +#elif defined(__arm__) && \ + !defined(__ARM_ARCH_5__) && \ + !defined(__ARM_ARCH_5T__) && \ + !defined(__ARM_ARCH_5TE__) && \ + !defined(__ARM_ARCH_5TEJ__) && \ + !defined(__ARM_ARCH_6__) && \ + !defined(__ARM_ARCH_6J__) && \ + !defined(__ARM_ARCH_6K__) && \ + !defined(__ARM_ARCH_6Z__) && \ + !defined(__ARM_ARCH_6ZK__) && \ + !defined(__ARM_ARCH_6T2__) + +// ARMv7 and newer support native unaligned accesses, but only of 16-bit +// and 32-bit values (not 64-bit); older versions either raise a fatal signal, +// do an unaligned read and rotate the words around a bit, or do the reads very +// slowly (trip through kernel mode). + +#define BROTLI_UNALIGNED_LOAD32(_p) (*reinterpret_cast(_p)) +#define BROTLI_UNALIGNED_STORE32(_p, _val) \ + (*reinterpret_cast(_p) = (_val)) + +inline uint64_t BROTLI_UNALIGNED_LOAD64(const void *p) { + uint64_t t; + memcpy(&t, p, sizeof t); + return t; +} + +inline void BROTLI_UNALIGNED_STORE64(void *p, uint64_t v) { + memcpy(p, &v, sizeof v); +} + +#else + +// These functions are provided for architectures that don't support +// unaligned loads and stores. + +inline uint32_t BROTLI_UNALIGNED_LOAD32(const void *p) { + uint32_t t; + memcpy(&t, p, sizeof t); + return t; +} + +inline uint64_t BROTLI_UNALIGNED_LOAD64(const void *p) { + uint64_t t; + memcpy(&t, p, sizeof t); + return t; +} + +inline void BROTLI_UNALIGNED_STORE32(void *p, uint32_t v) { + memcpy(p, &v, sizeof v); +} + +inline void BROTLI_UNALIGNED_STORE64(void *p, uint64_t v) { + memcpy(p, &v, sizeof v); +} + +#endif + +#endif // BROTLI_ENC_PORT_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/prefix.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/prefix.h new file mode 100644 index 0000000..693a26f --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/prefix.h @@ -0,0 +1,86 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Functions for encoding of integers into prefix codes the amount of extra +// bits, and the actual values of the extra bits. + +#ifndef BROTLI_ENC_PREFIX_H_ +#define BROTLI_ENC_PREFIX_H_ + +#include +#include "./fast_log.h" + +namespace brotli { + +static const int kNumInsertLenPrefixes = 24; +static const int kNumCopyLenPrefixes = 24; +static const int kNumCommandPrefixes = 704; +static const int kNumBlockLenPrefixes = 26; +static const int kNumDistanceShortCodes = 16; +static const int kNumDistancePrefixes = 520; + +// Represents the range of values belonging to a prefix code: +// [offset, offset + 2^nbits) +struct PrefixCodeRange { + int offset; + int nbits; +}; + +static const PrefixCodeRange kBlockLengthPrefixCode[kNumBlockLenPrefixes] = { + { 1, 2}, { 5, 2}, { 9, 2}, { 13, 2}, + { 17, 3}, { 25, 3}, { 33, 3}, { 41, 3}, + { 49, 4}, { 65, 4}, { 81, 4}, { 97, 4}, + { 113, 5}, { 145, 5}, { 177, 5}, { 209, 5}, + { 241, 6}, { 305, 6}, { 369, 7}, { 497, 8}, + { 753, 9}, { 1265, 10}, {2289, 11}, {4337, 12}, + {8433, 13}, {16625, 24} +}; + +inline void GetBlockLengthPrefixCode(int len, + int* code, int* n_extra, int* extra) { + *code = 0; + while (*code < 25 && len >= kBlockLengthPrefixCode[*code + 1].offset) { + ++(*code); + } + *n_extra = kBlockLengthPrefixCode[*code].nbits; + *extra = len - kBlockLengthPrefixCode[*code].offset; +} + +inline void PrefixEncodeCopyDistance(int distance_code, + int num_direct_codes, + int postfix_bits, + uint16_t* code, + uint32_t* extra_bits) { + distance_code -= 1; + if (distance_code < kNumDistanceShortCodes + num_direct_codes) { + *code = distance_code; + *extra_bits = 0; + return; + } + distance_code -= kNumDistanceShortCodes + num_direct_codes; + distance_code += (1 << (postfix_bits + 2)); + int bucket = Log2Floor(distance_code) - 1; + int postfix_mask = (1 << postfix_bits) - 1; + int postfix = distance_code & postfix_mask; + int prefix = (distance_code >> bucket) & 1; + int offset = (2 + prefix) << bucket; + int nbits = bucket - postfix_bits; + *code = kNumDistanceShortCodes + num_direct_codes + + ((2 * (nbits - 1) + prefix) << postfix_bits) + postfix; + *extra_bits = (nbits << 24) | ((distance_code - offset) >> postfix_bits); +} + +} // namespace brotli + +#endif // BROTLI_ENC_PREFIX_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/ringbuffer.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/ringbuffer.h new file mode 100644 index 0000000..5d16055 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/ringbuffer.h @@ -0,0 +1,108 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Sliding window over the input data. + +#ifndef BROTLI_ENC_RINGBUFFER_H_ +#define BROTLI_ENC_RINGBUFFER_H_ + +#include +#include + +#include "./port.h" + +namespace brotli { + +// A RingBuffer(window_bits, tail_bits) contains `1 << window_bits' bytes of +// data in a circular manner: writing a byte writes it to +// `position() % (1 << window_bits)'. For convenience, the RingBuffer array +// contains another copy of the first `1 << tail_bits' bytes: +// buffer_[i] == buffer_[i + (1 << window_bits)] if i < (1 << tail_bits). +class RingBuffer { + public: + RingBuffer(int window_bits, int tail_bits) + : window_bits_(window_bits), + mask_((1 << window_bits) - 1), + tail_size_(1 << tail_bits), + pos_(0) { + static const int kSlackForFourByteHashingEverywhere = 3; + const int buflen = (1 << window_bits_) + tail_size_; + buffer_ = new uint8_t[buflen + kSlackForFourByteHashingEverywhere]; + for (int i = 0; i < kSlackForFourByteHashingEverywhere; ++i) { + buffer_[buflen + i] = 0; + } + } + ~RingBuffer() { + delete [] buffer_; + } + + // Push bytes into the ring buffer. + void Write(const uint8_t *bytes, size_t n) { + const size_t masked_pos = pos_ & mask_; + // The length of the writes is limited so that we do not need to worry + // about a write + WriteTail(bytes, n); + if (PREDICT_TRUE(masked_pos + n <= (1 << window_bits_))) { + // A single write fits. + memcpy(&buffer_[masked_pos], bytes, n); + } else { + // Split into two writes. + // Copy into the end of the buffer, including the tail buffer. + memcpy(&buffer_[masked_pos], bytes, + std::min(n, ((1 << window_bits_) + tail_size_) - masked_pos)); + // Copy into the begining of the buffer + memcpy(&buffer_[0], bytes + ((1 << window_bits_) - masked_pos), + n - ((1 << window_bits_) - masked_pos)); + } + pos_ += n; + } + + void Reset() { + pos_ = 0; + } + + // Logical cursor position in the ring buffer. + size_t position() const { return pos_; } + + // Bit mask for getting the physical position for a logical position. + size_t mask() const { return mask_; } + + uint8_t *start() { return &buffer_[0]; } + const uint8_t *start() const { return &buffer_[0]; } + + private: + void WriteTail(const uint8_t *bytes, size_t n) { + const size_t masked_pos = pos_ & mask_; + if (PREDICT_FALSE(masked_pos < tail_size_)) { + // Just fill the tail buffer with the beginning data. + const size_t p = (1 << window_bits_) + masked_pos; + memcpy(&buffer_[p], bytes, std::min(n, tail_size_ - masked_pos)); + } + } + + // Size of the ringbuffer is (1 << window_bits) + tail_size_. + const int window_bits_; + const size_t mask_; + const size_t tail_size_; + + // Position to write in the ring buffer. + size_t pos_; + // The actual ring buffer containing the data and the copy of the beginning + // as a tail. + uint8_t *buffer_; +}; + +} // namespace brotli + +#endif // BROTLI_ENC_RINGBUFFER_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/static_dict.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/static_dict.h new file mode 100644 index 0000000..6c3122d --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/static_dict.h @@ -0,0 +1,87 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Class to model the static dictionary. + +#ifndef BROTLI_ENC_STATIC_DICT_H_ +#define BROTLI_ENC_STATIC_DICT_H_ + +#include +#include +#include + +#include "./dictionary.h" +#include "./transform.h" + +namespace brotli { + +class StaticDictionary { + public: + StaticDictionary() {} + void Fill(bool enable_transforms) { + const int num_transforms = enable_transforms ? kNumTransforms : 1; + for (int t = num_transforms - 1; t >= 0; --t) { + for (int i = kMaxDictionaryWordLength; + i >= kMinDictionaryWordLength; --i) { + const int num_words = 1 << kBrotliDictionarySizeBitsByLength[i]; + for (int j = num_words - 1; j >= 0; --j) { + int word_id = t * num_words + j; + std::string word = GetTransformedDictionaryWord(i, word_id); + if (word.size() >= 4) { + Insert(word, i, word_id); + } + } + } + } + } + void Insert(const std::string &str, int len, int dist) { + int ix = (dist << 6) + len; + std::unordered_map::const_iterator it = map_.find(str); + if (it != map_.end() && ix >= it->second) { + return; + } + map_[str] = ix; + uint32_t v = 0; + for (int i = 0; i < 4 && i < str.size(); ++i) { + v += static_cast(str[i]) << (8 * i); + } + if (prefix_map_[v] < str.size()) { + prefix_map_[v] = str.size(); + } + } + int GetLength(uint32_t v) const { + std::unordered_map::const_iterator it = prefix_map_.find(v); + if (it == prefix_map_.end()) { + return 0; + } + return it->second; + } + bool Get(const std::string &str, int *len, int *dist) const { + std::unordered_map::const_iterator it = map_.find(str); + if (it == map_.end()) { + return false; + } + int v = it->second; + *len = v & 63; + *dist = v >> 6; + return true; + } + private: + std::unordered_map map_; + std::unordered_map prefix_map_; +}; + +} // namespace brotli + +#endif // BROTLI_ENC_STATIC_DICT_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.cc new file mode 100644 index 0000000..c5a9824 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.cc @@ -0,0 +1,126 @@ +// Copyright 2009 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Convience routines to make Brotli I/O classes from some memory containers and +// files. + +#include "./streams.h" + +#include +#include + +namespace brotli { + +BrotliMemOut::BrotliMemOut(void* buf, int len) + : buf_(buf), + len_(len), + pos_(0) {} + +void BrotliMemOut::Reset(void* buf, int len) { + buf_ = buf; + len_ = len; + pos_ = 0; +} + +// Brotli output routine: copy n bytes to the output buffer. +bool BrotliMemOut::Write(const void *buf, size_t n) { + if (n + pos_ > len_) + return false; + char* p = reinterpret_cast(buf_) + pos_; + memcpy(p, buf, n); + pos_ += n; + return true; +} + +BrotliStringOut::BrotliStringOut(std::string* buf, int max_size) + : buf_(buf), + max_size_(max_size) { + assert(buf->empty()); +} + +void BrotliStringOut::Reset(std::string* buf, int max_size) { + buf_ = buf; + max_size_ = max_size; +} + +// Brotli output routine: add n bytes to a string. +bool BrotliStringOut::Write(const void *buf, size_t n) { + if (buf_->size() + n > max_size_) + return false; + buf_->append(static_cast(buf), n); + return true; +} + +BrotliMemIn::BrotliMemIn(const void* buf, int len) + : buf_(buf), + len_(len), + pos_(0) {} + +void BrotliMemIn::Reset(const void* buf, int len) { + buf_ = buf; + len_ = len; + pos_ = 0; +} + +// Brotli input routine: read the next chunk of memory. +const void* BrotliMemIn::Read(size_t n, size_t* output) { + if (pos_ == len_) { + return NULL; + } + if (n > len_ - pos_) + n = len_ - pos_; + const char* p = reinterpret_cast(buf_) + pos_; + pos_ += n; + *output = n; + return p; +} + +BrotliFileIn::BrotliFileIn(FILE* f, size_t max_read_size) + : f_(f), + buf_(malloc(max_read_size)), + buf_size_(max_read_size) {} + +BrotliFileIn::~BrotliFileIn() { + if (buf_) free(buf_); +} + +const void* BrotliFileIn::Read(size_t n, size_t* bytes_read) { + if (buf_ == NULL) { + *bytes_read = 0; + return NULL; + } + if (n > buf_size_) { + n = buf_size_; + } else if (n == 0) { + return feof(f_) ? NULL : buf_; + } + *bytes_read = fread(buf_, 1, n, f_); + if (*bytes_read == 0) { + return NULL; + } else { + return buf_; + } +} + +BrotliFileOut::BrotliFileOut(FILE* f) : f_(f) {} + +bool BrotliFileOut::Write(const void* buf, size_t n) { + if (fwrite(buf, n, 1, f_) != 1) { + return false; + } + return true; +} + + +} // namespace brotli diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.h new file mode 100644 index 0000000..704f7ad --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.h @@ -0,0 +1,130 @@ +// Copyright 2009 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Input and output classes for streaming brotli compression. + +#ifndef BROTLI_ENC_STREAMS_H_ +#define BROTLI_ENC_STREAMS_H_ + +#include +#include +#include +#include + +namespace brotli { + +// Input interface for the compression routines. +class BrotliIn { + public: + virtual ~BrotliIn() {} + + // Return a pointer to the next block of input of at most n bytes. + // Return the actual length in *nread. + // At end of data, return NULL. Don't return NULL if there is more data + // to read, even if called with n == 0. + // Read will only be called if some of its bytes are needed. + virtual const void* Read(size_t n, size_t* nread) = 0; +}; + +// Output interface for the compression routines. +class BrotliOut { + public: + virtual ~BrotliOut() {} + + // Write n bytes of data from buf. + // Return true if all written, false otherwise. + virtual bool Write(const void *buf, size_t n) = 0; +}; + +// Adapter class to make BrotliIn objects from raw memory. +class BrotliMemIn : public BrotliIn { + public: + BrotliMemIn(const void* buf, int len); + + void Reset(const void* buf, int len); + + // returns the amount of data consumed + int position() const { return pos_; } + + const void* Read(size_t n, size_t* OUTPUT) override; + + private: + const void* buf_; // start of input buffer + int len_; // length of input + int pos_; // current read position within input +}; + +// Adapter class to make BrotliOut objects from raw memory. +class BrotliMemOut : public BrotliOut { + public: + BrotliMemOut(void* buf, int len); + + void Reset(void* buf, int len); + + // returns the amount of data written + int position() const { return pos_; } + + bool Write(const void* buf, size_t n) override; + + private: + void* buf_; // start of output buffer + int len_; // length of output + int pos_; // current write position within output +}; + +// Adapter class to make BrotliOut objects from a string. +class BrotliStringOut : public BrotliOut { + public: + // Create a writer that appends its data to buf. + // buf->size() will grow to at most max_size + // buf is expected to be empty when constructing BrotliStringOut. + BrotliStringOut(std::string* buf, int max_size); + + void Reset(std::string* buf, int max_len); + + bool Write(const void* buf, size_t n) override; + + private: + std::string* buf_; // start of output buffer + int max_size_; // max length of output +}; + +// Adapter class to make BrotliIn object from a file. +class BrotliFileIn : public BrotliIn { + public: + BrotliFileIn(FILE* f, size_t max_read_size); + ~BrotliFileIn(); + + const void* Read(size_t n, size_t* bytes_read) override; + + private: + FILE* f_; + void* buf_; + size_t buf_size_; +}; + +// Adapter class to make BrotliOut object from a file. +class BrotliFileOut : public BrotliOut { + public: + explicit BrotliFileOut(FILE* f); + + bool Write(const void* buf, size_t n) override; + private: + FILE* f_; +}; + + +} // namespace brotli + +#endif // BROTLI_ENC_STREAMS_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.h.gch b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.h.gch new file mode 100644 index 0000000..5fef874 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/streams.h.gch differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/transform.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/transform.h new file mode 100644 index 0000000..67b1a73 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/transform.h @@ -0,0 +1,242 @@ +// Copyright 2010 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Transformations on dictionary words. + +#ifndef BROTLI_ENC_TRANSFORM_H_ +#define BROTLI_ENC_TRANSFORM_H_ + +#include + +#include "./dictionary.h" + +namespace brotli { + +enum WordTransformType { + kIdentity = 0, + kOmitLast1 = 1, + kOmitLast2 = 2, + kOmitLast3 = 3, + kOmitLast4 = 4, + kOmitLast5 = 5, + kOmitLast6 = 6, + kOmitLast7 = 7, + kOmitLast8 = 8, + kOmitLast9 = 9, + kUppercaseFirst = 10, + kUppercaseAll = 11, + kOmitFirst1 = 12, + kOmitFirst2 = 13, + kOmitFirst3 = 14, + kOmitFirst4 = 15, + kOmitFirst5 = 16, + kOmitFirst6 = 17, + kOmitFirst7 = 18, + kOmitFirst8 = 19, + kOmitFirst9 = 20, +}; + +struct Transform { + const char* prefix; + WordTransformType word_transform; + const char* suffix; +}; + +static const Transform kTransforms[] = { + { "", kIdentity, "" }, + { "", kIdentity, " " }, + { " ", kIdentity, " " }, + { "", kOmitFirst1, "" }, + { "", kUppercaseFirst, " " }, + { "", kIdentity, " the " }, + { " ", kIdentity, "" }, + { "s ", kIdentity, " " }, + { "", kIdentity, " of " }, + { "", kUppercaseFirst, "" }, + { "", kIdentity, " and " }, + { "", kOmitFirst2, "" }, + { "", kOmitLast1, "" }, + { ", ", kIdentity, " " }, + { "", kIdentity, ", " }, + { " ", kUppercaseFirst, " " }, + { "", kIdentity, " in " }, + { "", kIdentity, " to " }, + { "e ", kIdentity, " " }, + { "", kIdentity, "\"" }, + { "", kIdentity, "." }, + { "", kIdentity, "\">" }, + { "", kIdentity, "\n" }, + { "", kOmitLast3, "" }, + { "", kIdentity, "]" }, + { "", kIdentity, " for " }, + { "", kOmitFirst3, "" }, + { "", kOmitLast2, "" }, + { "", kIdentity, " a " }, + { "", kIdentity, " that " }, + { " ", kUppercaseFirst, "" }, + { "", kIdentity, ". " }, + { ".", kIdentity, "" }, + { " ", kIdentity, ", " }, + { "", kOmitFirst4, "" }, + { "", kIdentity, " with " }, + { "", kIdentity, "'" }, + { "", kIdentity, " from " }, + { "", kIdentity, " by " }, + { "", kOmitFirst5, "" }, + { "", kOmitFirst6, "" }, + { " the ", kIdentity, "" }, + { "", kOmitLast4, "" }, + { "", kIdentity, ". The " }, + { "", kUppercaseAll, "" }, + { "", kIdentity, " on " }, + { "", kIdentity, " as " }, + { "", kIdentity, " is " }, + { "", kOmitLast7, "" }, + { "", kOmitLast1, "ing " }, + { "", kIdentity, "\n\t" }, + { "", kIdentity, ":" }, + { " ", kIdentity, ". " }, + { "", kIdentity, "ed " }, + { "", kOmitFirst9, "" }, + { "", kOmitFirst7, "" }, + { "", kOmitLast6, "" }, + { "", kIdentity, "(" }, + { "", kUppercaseFirst, ", " }, + { "", kOmitLast8, "" }, + { "", kIdentity, " at " }, + { "", kIdentity, "ly " }, + { " the ", kIdentity, " of " }, + { "", kOmitLast5, "" }, + { "", kOmitLast9, "" }, + { " ", kUppercaseFirst, ", " }, + { "", kUppercaseFirst, "\"" }, + { ".", kIdentity, "(" }, + { "", kUppercaseAll, " " }, + { "", kUppercaseFirst, "\">" }, + { "", kIdentity, "=\"" }, + { " ", kIdentity, "." }, + { ".com/", kIdentity, "" }, + { " the ", kIdentity, " of the " }, + { "", kUppercaseFirst, "'" }, + { "", kIdentity, ". This " }, + { "", kIdentity, "," }, + { ".", kIdentity, " " }, + { "", kUppercaseFirst, "(" }, + { "", kUppercaseFirst, "." }, + { "", kIdentity, " not " }, + { " ", kIdentity, "=\"" }, + { "", kIdentity, "er " }, + { " ", kUppercaseAll, " " }, + { "", kIdentity, "al " }, + { " ", kUppercaseAll, "" }, + { "", kIdentity, "='" }, + { "", kUppercaseAll, "\"" }, + { "", kUppercaseFirst, ". " }, + { " ", kIdentity, "(" }, + { "", kIdentity, "ful " }, + { " ", kUppercaseFirst, ". " }, + { "", kIdentity, "ive " }, + { "", kIdentity, "less " }, + { "", kUppercaseAll, "'" }, + { "", kIdentity, "est " }, + { " ", kUppercaseFirst, "." }, + { "", kUppercaseAll, "\">" }, + { " ", kIdentity, "='" }, + { "", kUppercaseFirst, "," }, + { "", kIdentity, "ize " }, + { "", kUppercaseAll, "." }, + { "\xc2\xa0", kIdentity, "" }, + { " ", kIdentity, "," }, + { "", kUppercaseFirst, "=\"" }, + { "", kUppercaseAll, "=\"" }, + { "", kIdentity, "ous " }, + { "", kUppercaseAll, ", " }, + { "", kUppercaseFirst, "='" }, + { " ", kUppercaseFirst, "," }, + { " ", kUppercaseAll, "=\"" }, + { " ", kUppercaseAll, ", " }, + { "", kUppercaseAll, "," }, + { "", kUppercaseAll, "(" }, + { "", kUppercaseAll, ". " }, + { " ", kUppercaseAll, "." }, + { "", kUppercaseAll, "='" }, + { " ", kUppercaseAll, ". " }, + { " ", kUppercaseFirst, "=\"" }, + { " ", kUppercaseAll, "='" }, + { " ", kUppercaseFirst, "='" }, +}; + +static const int kNumTransforms = sizeof(kTransforms) / sizeof(kTransforms[0]); + +static int ToUpperCase(uint8_t *p, int len) { + if (len == 1 || p[0] < 0xc0) { + if (p[0] >= 'a' && p[0] <= 'z') { + p[0] ^= 32; + } + return 1; + } + if (p[0] < 0xe0) { + p[1] ^= 32; + return 2; + } + if (len == 2) { + return 2; + } + p[2] ^= 5; + return 3; +} + +inline std::string ApplyTransform( + const Transform& t, const uint8_t* word, int len) { + std::string ret(t.prefix); + if (t.word_transform <= kOmitLast9) { + len -= t.word_transform; + } + if (len > 0) { + if (t.word_transform >= kOmitFirst1) { + const int skip = t.word_transform - (kOmitFirst1 - 1); + if (len > skip) { + ret += std::string(word + skip, word + len); + } + } else { + ret += std::string(word, word + len); + uint8_t *uppercase = reinterpret_cast(&ret[ret.size() - len]); + if (t.word_transform == kUppercaseFirst) { + ToUpperCase(uppercase, len); + } else if (t.word_transform == kUppercaseAll) { + while (len > 0) { + int step = ToUpperCase(uppercase, len); + uppercase += step; + len -= step; + } + } + } + } + ret += std::string(t.suffix); + return ret; +} + +inline std::string GetTransformedDictionaryWord(int len_code, int word_id) { + int num_words = 1 << kBrotliDictionarySizeBitsByLength[len_code]; + int offset = kBrotliDictionaryOffsetsByLength[len_code]; + int t = word_id / num_words; + int word_idx = word_id % num_words; + offset += len_code * word_idx; + const uint8_t* word = &kBrotliDictionary[offset]; + return ApplyTransform(kTransforms[t], word, len_code); +} + +} // namespace brotli + +#endif // BROTLI_ENC_TRANSFORM_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/write_bits.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/write_bits.h new file mode 100644 index 0000000..c3140c1 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/enc/write_bits.h @@ -0,0 +1,91 @@ +// Copyright 2010 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Write bits into a byte array. + +#ifndef BROTLI_ENC_WRITE_BITS_H_ +#define BROTLI_ENC_WRITE_BITS_H_ + +#include +#include +#include + +#include "./port.h" + +namespace brotli { + +//#define BIT_WRITER_DEBUG + +// This function writes bits into bytes in increasing addresses, and within +// a byte least-significant-bit first. +// +// The function can write up to 56 bits in one go with WriteBits +// Example: let's assume that 3 bits (Rs below) have been written already: +// +// BYTE-0 BYTE+1 BYTE+2 +// +// 0000 0RRR 0000 0000 0000 0000 +// +// Now, we could write 5 or less bits in MSB by just sifting by 3 +// and OR'ing to BYTE-0. +// +// For n bits, we take the last 5 bits, OR that with high bits in BYTE-0, +// and locate the rest in BYTE+1, BYTE+2, etc. +inline void WriteBits(int n_bits, + uint64_t bits, + int * __restrict pos, + uint8_t * __restrict array) { +#ifdef BIT_WRITER_DEBUG + printf("WriteBits %2d 0x%016llx %10d\n", n_bits, bits, *pos); +#endif + assert(bits < 1ULL << n_bits); +#ifdef IS_LITTLE_ENDIAN + // This branch of the code can write up to 56 bits at a time, + // 7 bits are lost by being perhaps already in *p and at least + // 1 bit is needed to initialize the bit-stream ahead (i.e. if 7 + // bits are in *p and we write 57 bits, then the next write will + // access a byte that was never initialized). + uint8_t *p = &array[*pos >> 3]; + uint64_t v = *p; + v |= bits << (*pos & 7); + BROTLI_UNALIGNED_STORE64(p, v); // Set some bits. + *pos += n_bits; +#else + // implicit & 0xff is assumed for uint8_t arithmetics + uint8_t *array_pos = &array[*pos >> 3]; + const int bits_reserved_in_first_byte = (*pos & 7); + bits <<= bits_reserved_in_first_byte; + *array_pos++ |= bits; + for (int bits_left_to_write = n_bits - 8 + bits_reserved_in_first_byte; + bits_left_to_write >= 1; + bits_left_to_write -= 8) { + bits >>= 8; + *array_pos++ = bits; + } + *array_pos = 0; + *pos += n_bits; +#endif +} + +inline void WriteBitsPrepareStorage(int pos, uint8_t *array) { +#ifdef BIT_WRITER_DEBUG + printf("WriteBitsPrepareStorage %10d\n", pos); +#endif + assert((pos & 7) == 0); + array[pos >> 3] = 0; +} + +} // namespace brotli + +#endif // BROTLI_ENC_WRITE_BITS_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/fallback.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/fallback.cc new file mode 100644 index 0000000..0dfe3b0 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/fallback.cc @@ -0,0 +1,51 @@ +// Emscripten wrapper +#include +#include +#include "./woff2/woff2_enc.h" + +using namespace emscripten; +using std::string; + +int getSizePtr() { + int* sizePtr = reinterpret_cast(calloc(1, sizeof(int))); + return reinterpret_cast(sizePtr); +} + +int convert(int inputDataAddress, int inputLength, int outputSizePtrAddress) { + int* outputSizePtr = reinterpret_cast(outputSizePtrAddress); + char* inputData = reinterpret_cast(inputDataAddress); + + size_t outputSize = woff2::MaxWOFF2CompressedSize( + reinterpret_cast(inputData), + inputLength + ); + + uint8_t* outputData = reinterpret_cast(calloc(outputSize, sizeof(uint8_t))); + + + if(!woff2::ConvertTTFToWOFF2( + reinterpret_cast(inputData), + inputLength, + outputData, + &outputSize + )) { + // throw an error + } + + *outputSizePtr = outputSize; + + return reinterpret_cast(outputData); +} + +void freePtrs(int outputDataAddress, int sizePtrAddress) { + int* sizePtr = reinterpret_cast(sizePtrAddress); + char* outputData = reinterpret_cast(outputDataAddress); + free(outputData); + free(sizePtr); +} + +EMSCRIPTEN_BINDINGS(ttf2woff2_fallback) { + function("getSizePtr", &getSizePtr, allow_raw_pointers()); + function("convert", &convert, allow_raw_pointers()); + function("freePtrs", &freePtrs, allow_raw_pointers()); +} diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/buffer.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/buffer.h new file mode 100644 index 0000000..588ac0d --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/buffer.h @@ -0,0 +1,172 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// The parts of ots.h & opentype-sanitiser.h that we need, taken from the +// https://code.google.com/p/ots/ project. + +#ifndef WOFF2_BUFFER_H_ +#define WOFF2_BUFFER_H_ + +#if defined(_WIN32) +#include +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#define ntohl(x) _byteswap_ulong (x) +#define ntohs(x) _byteswap_ushort (x) +#define htonl(x) _byteswap_ulong (x) +#define htons(x) _byteswap_ushort (x) +#else +#include +#include +#endif + +#include +#include +#include +#include + +namespace woff2 { + +#if defined(_MSC_VER) || !defined(FONT_COMPRESSION_DEBUG) +#define FONT_COMPRESSION_FAILURE() false +#else +#define FONT_COMPRESSION_FAILURE() \ + woff2::Failure(__FILE__, __LINE__, __PRETTY_FUNCTION__) +inline bool Failure(const char *f, int l, const char *fn) { + fprintf(stderr, "ERROR at %s:%d (%s)\n", f, l, fn); + fflush(stderr); + return false; +} +#endif + +// ----------------------------------------------------------------------------- +// Buffer helper class +// +// This class perform some trival buffer operations while checking for +// out-of-bounds errors. As a family they return false if anything is amiss, +// updating the current offset otherwise. +// ----------------------------------------------------------------------------- +class Buffer { + public: + Buffer(const uint8_t *buffer, size_t len) + : buffer_(buffer), + length_(len), + offset_(0) { } + + bool Skip(size_t n_bytes) { + return Read(NULL, n_bytes); + } + + bool Read(uint8_t *buffer, size_t n_bytes) { + if (n_bytes > 1024 * 1024 * 1024) { + return FONT_COMPRESSION_FAILURE(); + } + if ((offset_ + n_bytes > length_) || + (offset_ > length_ - n_bytes)) { + return FONT_COMPRESSION_FAILURE(); + } + if (buffer) { + std::memcpy(buffer, buffer_ + offset_, n_bytes); + } + offset_ += n_bytes; + return true; + } + + inline bool ReadU8(uint8_t *value) { + if (offset_ + 1 > length_) { + return FONT_COMPRESSION_FAILURE(); + } + *value = buffer_[offset_]; + ++offset_; + return true; + } + + bool ReadU16(uint16_t *value) { + if (offset_ + 2 > length_) { + return FONT_COMPRESSION_FAILURE(); + } + std::memcpy(value, buffer_ + offset_, sizeof(uint16_t)); + *value = ntohs(*value); + offset_ += 2; + return true; + } + + bool ReadS16(int16_t *value) { + return ReadU16(reinterpret_cast(value)); + } + + bool ReadU24(uint32_t *value) { + if (offset_ + 3 > length_) { + return FONT_COMPRESSION_FAILURE(); + } + *value = static_cast(buffer_[offset_]) << 16 | + static_cast(buffer_[offset_ + 1]) << 8 | + static_cast(buffer_[offset_ + 2]); + offset_ += 3; + return true; + } + + bool ReadU32(uint32_t *value) { + if (offset_ + 4 > length_) { + return FONT_COMPRESSION_FAILURE(); + } + std::memcpy(value, buffer_ + offset_, sizeof(uint32_t)); + *value = ntohl(*value); + offset_ += 4; + return true; + } + + bool ReadS32(int32_t *value) { + return ReadU32(reinterpret_cast(value)); + } + + bool ReadTag(uint32_t *value) { + if (offset_ + 4 > length_) { + return FONT_COMPRESSION_FAILURE(); + } + std::memcpy(value, buffer_ + offset_, sizeof(uint32_t)); + offset_ += 4; + return true; + } + + bool ReadR64(uint64_t *value) { + if (offset_ + 8 > length_) { + return FONT_COMPRESSION_FAILURE(); + } + std::memcpy(value, buffer_ + offset_, sizeof(uint64_t)); + offset_ += 8; + return true; + } + + const uint8_t *buffer() const { return buffer_; } + size_t offset() const { return offset_; } + size_t length() const { return length_; } + + void set_offset(size_t newoffset) { offset_ = newoffset; } + + private: + const uint8_t * const buffer_; + const size_t length_; + size_t offset_; +}; + +} // namespace woff2 + +#endif // WOFF2_BUFFER_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/font.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/font.cc new file mode 100644 index 0000000..5b4bbe6 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/font.cc @@ -0,0 +1,400 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Font management utilities + +#include "./font.h" + +#include + +#include "./buffer.h" +#include "./port.h" +#include "./store_bytes.h" +#include "./table_tags.h" +#include "./woff2_common.h" + +namespace woff2 { + +Font::Table* Font::FindTable(uint32_t tag) { + std::map::iterator it = tables.find(tag); + return it == tables.end() ? 0 : &it->second; +} + +const Font::Table* Font::FindTable(uint32_t tag) const { + std::map::const_iterator it = tables.find(tag); + return it == tables.end() ? 0 : &it->second; +} + +std::vector Font::OutputOrderedTags() const { + std::vector output_order; + + for (const auto& i : tables) { + const Font::Table& table = i.second; + // This is a transformed table, we will write it together with the + // original version. + if (table.tag & 0x80808080) { + continue; + } + output_order.push_back(table.tag); + } + + // Alphabetize and do not put loca immediately after glyf + // This violates woff2 spec but results in a font that passes OTS + std::sort(output_order.begin(), output_order.end()); + // TODO(user): change to match spec once browsers are on newer OTS + /* + auto glyf_loc = std::find(output_order.begin(), output_order.end(), + kGlyfTableTag); + auto loca_loc = std::find(output_order.begin(), output_order.end(), + kLocaTableTag); + if (glyf_loc != output_order.end() && loca_loc != output_order.end()) { + output_order.erase(loca_loc); + output_order.insert(std::find(output_order.begin(), output_order.end(), + kGlyfTableTag) + 1, kLocaTableTag); + }*/ + + return output_order; +} + +bool ReadTrueTypeFont(Buffer* file, const uint8_t* data, size_t len, + Font* font) { + // We don't care about the search_range, entry_selector and range_shift + // fields, they will always be computed upon writing the font. + if (!file->ReadU16(&font->num_tables) || + !file->Skip(6)) { + return FONT_COMPRESSION_FAILURE(); + } + + std::map intervals; + for (uint16_t i = 0; i < font->num_tables; ++i) { + Font::Table table; + table.reuse_of = NULL; + if (!file->ReadU32(&table.tag) || + !file->ReadU32(&table.checksum) || + !file->ReadU32(&table.offset) || + !file->ReadU32(&table.length)) { + return FONT_COMPRESSION_FAILURE(); + } + if ((table.offset & 3) != 0 || + table.length > len || + len - table.length < table.offset) { + return FONT_COMPRESSION_FAILURE(); + } + intervals[table.offset] = table.length; + table.data = data + table.offset; + if (font->tables.find(table.tag) != font->tables.end()) { + return FONT_COMPRESSION_FAILURE(); + } + font->tables[table.tag] = table; + } + + // Check that tables are non-overlapping. + uint32_t last_offset = 12UL + 16UL * font->num_tables; + for (const auto& i : intervals) { + if (i.first < last_offset || i.first + i.second < i.first) { + return FONT_COMPRESSION_FAILURE(); + } + last_offset = i.first + i.second; + } + + return true; +} + +bool ReadCollectionFont(Buffer* file, const uint8_t* data, size_t len, + Font* font, + std::map* all_tables) { + if (!file->ReadU32(&font->flavor)) { + return FONT_COMPRESSION_FAILURE(); + } + if (!ReadTrueTypeFont(file, data, len, font)) { + return FONT_COMPRESSION_FAILURE(); + } + + for (auto& entry : font->tables) { + Font::Table& table = entry.second; + + if (all_tables->find(table.offset) == all_tables->end()) { + (*all_tables)[table.offset] = font->FindTable(table.tag); + } else { + table.reuse_of = (*all_tables)[table.offset]; + } + + } + return true; +} + +bool ReadTrueTypeCollection(Buffer* file, const uint8_t* data, size_t len, + FontCollection* font_collection) { + uint32_t num_fonts; + + if (!file->ReadU32(&font_collection->header_version) || + !file->ReadU32(&num_fonts)) { + return FONT_COMPRESSION_FAILURE(); + } + + std::vector offsets; + for (auto i = 0; i < num_fonts; i++) { + uint32_t offset; + if (!file->ReadU32(&offset)) { + return FONT_COMPRESSION_FAILURE(); + } + offsets.push_back(offset); + } + + font_collection->fonts.resize(offsets.size()); + std::vector::iterator font_it = font_collection->fonts.begin(); + + std::map all_tables; + for (const auto offset : offsets) { + file->set_offset(offset); + Font& font = *font_it++; + if (!ReadCollectionFont(file, data, len, &font, &all_tables)) { + return FONT_COMPRESSION_FAILURE(); + } + } + + return true; +} + +bool ReadFont(const uint8_t* data, size_t len, Font* font) { + Buffer file(data, len); + + if (!file.ReadU32(&font->flavor)) { + return FONT_COMPRESSION_FAILURE(); + } + + if (font->flavor == kTtcFontFlavor) { + return FONT_COMPRESSION_FAILURE(); + } + return ReadTrueTypeFont(&file, data, len, font); +} + +bool ReadFontCollection(const uint8_t* data, size_t len, + FontCollection* font_collection) { + Buffer file(data, len); + + uint32_t flavor; + if (!file.ReadU32(&flavor)) { + return FONT_COMPRESSION_FAILURE(); + } + + if (flavor != kTtcFontFlavor) { + font_collection->fonts.resize(1); + Font& font = font_collection->fonts[0]; + font.flavor = flavor; + return ReadTrueTypeFont(&file, data, len, &font); + } + return ReadTrueTypeCollection(&file, data, len, font_collection); +} + +size_t FontFileSize(const Font& font) { + size_t max_offset = 12ULL + 16ULL * font.num_tables; + for (const auto& i : font.tables) { + const Font::Table& table = i.second; + size_t padding_size = (4 - (table.length & 3)) & 3; + size_t end_offset = (padding_size + table.offset) + table.length; + max_offset = std::max(max_offset, end_offset); + } + return max_offset; +} + +size_t FontCollectionFileSize(const FontCollection& font_collection) { + size_t max_offset = 0; + for (auto& font : font_collection.fonts) { + // font file size actually just finds max offset + max_offset = std::max(max_offset, FontFileSize(font)); + } + return max_offset; +} + +bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size) { + size_t offset = 0; + return WriteFont(font, &offset, dst, dst_size); +} + +bool WriteTableRecord(const Font::Table* table, size_t* offset, uint8_t* dst, + size_t dst_size) { + if (dst_size < *offset + kSfntEntrySize) { + return FONT_COMPRESSION_FAILURE(); + } + if (table->IsReused()) { + table = table->reuse_of; + } + StoreU32(table->tag, offset, dst); + StoreU32(table->checksum, offset, dst); + StoreU32(table->offset, offset, dst); + StoreU32(table->length, offset, dst); + return true; +} + +bool WriteTable(const Font::Table& table, size_t* offset, uint8_t* dst, + size_t dst_size) { + if (!WriteTableRecord(&table, offset, dst, dst_size)) { + return false; + } + + // Write the actual table data if it's the first time we've seen it + if (!table.IsReused()) { + if (table.offset + table.length < table.offset || + dst_size < table.offset + table.length) { + return FONT_COMPRESSION_FAILURE(); + } + memcpy(dst + table.offset, table.data, table.length); + size_t padding_size = (4 - (table.length & 3)) & 3; + if (table.offset + table.length + padding_size < padding_size || + dst_size < table.offset + table.length + padding_size) { + return FONT_COMPRESSION_FAILURE(); + } + memset(dst + table.offset + table.length, 0, padding_size); + } + return true; +} + +bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, + size_t dst_size) { + if (dst_size < 12ULL + 16ULL * font.num_tables) { + return FONT_COMPRESSION_FAILURE(); + } + StoreU32(font.flavor, offset, dst); + Store16(font.num_tables, offset, dst); + uint16_t max_pow2 = font.num_tables ? Log2Floor(font.num_tables) : 0; + uint16_t search_range = max_pow2 ? 1 << (max_pow2 + 4) : 0; + uint16_t range_shift = (font.num_tables << 4) - search_range; + Store16(search_range, offset, dst); + Store16(max_pow2, offset, dst); + Store16(range_shift, offset, dst); + + for (const auto& i : font.tables) { + if (!WriteTable(i.second, offset, dst, dst_size)) { + return false; + } + } + + return true; +} + +bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst, + size_t dst_size) { + size_t offset = 0; + + // It's simpler if this just a simple sfnt + if (font_collection.fonts.size() == 1) { + return WriteFont(font_collection.fonts[0], &offset, dst, dst_size); + } + + // Write TTC header + StoreU32(kTtcFontFlavor, &offset, dst); + StoreU32(font_collection.header_version, &offset, dst); + StoreU32(font_collection.fonts.size(), &offset, dst); + + // Offset Table, zeroed for now + size_t offset_table = offset; // where to write offsets later + for (int i = 0; i < font_collection.fonts.size(); i++) { + StoreU32(0, &offset, dst); + } + + if (font_collection.header_version == 0x00020000) { + StoreU32(0, &offset, dst); // ulDsigTag + StoreU32(0, &offset, dst); // ulDsigLength + StoreU32(0, &offset, dst); // ulDsigOffset + } + + // Write fonts and their offsets. + for (int i = 0; i < font_collection.fonts.size(); i++) { + const auto& font = font_collection.fonts[i]; + StoreU32(offset, &offset_table, dst); + if (!WriteFont(font, &offset, dst, dst_size)) { + return false; + } + } + + return true; +} + +int NumGlyphs(const Font& font) { + const Font::Table* head_table = font.FindTable(kHeadTableTag); + const Font::Table* loca_table = font.FindTable(kLocaTableTag); + if (head_table == NULL || loca_table == NULL || head_table->length < 52) { + return 0; + } + int index_fmt = IndexFormat(font); + int num_glyphs = (loca_table->length / (index_fmt == 0 ? 2 : 4)) - 1; + return num_glyphs; +} + +int IndexFormat(const Font& font) { + const Font::Table* head_table = font.FindTable(kHeadTableTag); + if (head_table == NULL) { + return 0; + } + return head_table->data[51]; +} + +bool Font::Table::IsReused() const { + return this->reuse_of != NULL; +} + +bool GetGlyphData(const Font& font, int glyph_index, + const uint8_t** glyph_data, size_t* glyph_size) { + if (glyph_index < 0) { + return FONT_COMPRESSION_FAILURE(); + } + const Font::Table* head_table = font.FindTable(kHeadTableTag); + const Font::Table* loca_table = font.FindTable(kLocaTableTag); + const Font::Table* glyf_table = font.FindTable(kGlyfTableTag); + if (head_table == NULL || loca_table == NULL || glyf_table == NULL || + head_table->length < 52) { + return FONT_COMPRESSION_FAILURE(); + } + + int index_fmt = IndexFormat(font); + + Buffer loca_buf(loca_table->data, loca_table->length); + if (index_fmt == 0) { + uint16_t offset1, offset2; + if (!loca_buf.Skip(2 * glyph_index) || + !loca_buf.ReadU16(&offset1) || + !loca_buf.ReadU16(&offset2) || + offset2 < offset1 || + 2 * offset2 > glyf_table->length) { + return FONT_COMPRESSION_FAILURE(); + } + *glyph_data = glyf_table->data + 2 * offset1; + *glyph_size = 2 * (offset2 - offset1); + } else { + uint32_t offset1, offset2; + if (!loca_buf.Skip(4 * glyph_index) || + !loca_buf.ReadU32(&offset1) || + !loca_buf.ReadU32(&offset2) || + offset2 < offset1 || + offset2 > glyf_table->length) { + return FONT_COMPRESSION_FAILURE(); + } + *glyph_data = glyf_table->data + offset1; + *glyph_size = offset2 - offset1; + } + return true; +} + +bool RemoveDigitalSignature(Font* font) { + std::map::iterator it = + font->tables.find(kDsigTableTag); + if (it != font->tables.end()) { + font->tables.erase(it); + font->num_tables = font->tables.size(); + } + return true; +} + +} // namespace woff2 diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/font.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/font.h new file mode 100644 index 0000000..ff7f85f --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/font.h @@ -0,0 +1,110 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Data model for a font file in sfnt format, reading and writing functions and +// accessors for the glyph data. + +#ifndef WOFF2_FONT_H_ +#define WOFF2_FONT_H_ + +#include +#include +#include +#include + +namespace woff2 { + +// Represents an sfnt font file. Only the table directory is parsed, for the +// table data we only store a raw pointer, therefore a font object is valid only +// as long the data from which it was parsed is around. +struct Font { + uint32_t flavor; + uint16_t num_tables; + + struct Table { + uint32_t tag; + uint32_t checksum; + uint32_t offset; + uint32_t length; + const uint8_t* data; + + // Buffer used to mutate the data before writing out. + std::vector buffer; + + // If we've seen this tag/offset before, pointer to the first time we saw it + // If this is the first time we've seen this table, NULL + // Intended use is to bypass re-processing tables + Font::Table* reuse_of; + + // Is this table reused by a TTC + bool IsReused() const; + }; + std::map tables; + std::vector OutputOrderedTags() const; + + Table* FindTable(uint32_t tag); + const Table* FindTable(uint32_t tag) const; +}; + +// Accomodates both singular (OTF, TTF) and collection (TTC) fonts +struct FontCollection { + uint32_t header_version; + // (offset, first use of table*) pairs + std::map tables; + std::vector fonts; +}; + +// Parses the font from the given data. Returns false on parsing failure or +// buffer overflow. The font is valid only so long the input data pointer is +// valid. Does NOT support collections. +bool ReadFont(const uint8_t* data, size_t len, Font* font); + +// Parses the font from the given data. Returns false on parsing failure or +// buffer overflow. The font is valid only so long the input data pointer is +// valid. Supports collections. +bool ReadFontCollection(const uint8_t* data, size_t len, FontCollection* fonts); + +// Returns the file size of the font. +size_t FontFileSize(const Font& font); +size_t FontCollectionFileSize(const FontCollection& font); + +// Writes the font into the specified dst buffer. The dst_size should be the +// same as returned by FontFileSize(). Returns false upon buffer overflow (which +// should not happen if dst_size was computed by FontFileSize()). +bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size); +// Write the font at a specific offset +bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, size_t dst_size); + +bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst, + size_t dst_size); + +// Returns the number of glyphs in the font. +// NOTE: Currently this works only for TrueType-flavored fonts, will return +// zero for CFF-flavored fonts. +int NumGlyphs(const Font& font); + +// Returns the index format of the font +int IndexFormat(const Font& font); + +// Sets *glyph_data and *glyph_size to point to the location of the glyph data +// with the given index. Returns false if the glyph is not found. +bool GetGlyphData(const Font& font, int glyph_index, + const uint8_t** glyph_data, size_t* glyph_size); + +// Removes the digital signature (DSIG) table +bool RemoveDigitalSignature(Font* font); + +} // namespace woff2 + +#endif // WOFF2_FONT_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/glyph.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/glyph.cc new file mode 100644 index 0000000..4cef0d9 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/glyph.cc @@ -0,0 +1,380 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Glyph manipulation + +#include "./glyph.h" + +#include +#include +#include "./buffer.h" +#include "./store_bytes.h" + +namespace woff2 { + +static const int32_t kFLAG_ONCURVE = 1; +static const int32_t kFLAG_XSHORT = 1 << 1; +static const int32_t kFLAG_YSHORT = 1 << 2; +static const int32_t kFLAG_REPEAT = 1 << 3; +static const int32_t kFLAG_XREPEATSIGN = 1 << 4; +static const int32_t kFLAG_YREPEATSIGN = 1 << 5; +static const int32_t kFLAG_ARG_1_AND_2_ARE_WORDS = 1 << 0; +static const int32_t kFLAG_WE_HAVE_A_SCALE = 1 << 3; +static const int32_t kFLAG_MORE_COMPONENTS = 1 << 5; +static const int32_t kFLAG_WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; +static const int32_t kFLAG_WE_HAVE_A_TWO_BY_TWO = 1 << 7; +static const int32_t kFLAG_WE_HAVE_INSTRUCTIONS = 1 << 8; + +bool ReadCompositeGlyphData(Buffer* buffer, Glyph* glyph) { + glyph->have_instructions = false; + glyph->composite_data = buffer->buffer() + buffer->offset(); + size_t start_offset = buffer->offset(); + uint16_t flags = kFLAG_MORE_COMPONENTS; + while (flags & kFLAG_MORE_COMPONENTS) { + if (!buffer->ReadU16(&flags)) { + return FONT_COMPRESSION_FAILURE(); + } + glyph->have_instructions |= (flags & kFLAG_WE_HAVE_INSTRUCTIONS) != 0; + size_t arg_size = 2; // glyph index + if (flags & kFLAG_ARG_1_AND_2_ARE_WORDS) { + arg_size += 4; + } else { + arg_size += 2; + } + if (flags & kFLAG_WE_HAVE_A_SCALE) { + arg_size += 2; + } else if (flags & kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) { + arg_size += 4; + } else if (flags & kFLAG_WE_HAVE_A_TWO_BY_TWO) { + arg_size += 8; + } + if (!buffer->Skip(arg_size)) { + return FONT_COMPRESSION_FAILURE(); + } + } + if (buffer->offset() - start_offset > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + glyph->composite_data_size = buffer->offset() - start_offset; + return true; +} + +bool ReadGlyph(const uint8_t* data, size_t len, Glyph* glyph) { + Buffer buffer(data, len); + + int16_t num_contours; + if (!buffer.ReadS16(&num_contours)) { + return FONT_COMPRESSION_FAILURE(); + } + + if (num_contours == 0) { + // Empty glyph. + return true; + } + + // Read the bounding box. + if (!buffer.ReadS16(&glyph->x_min) || + !buffer.ReadS16(&glyph->y_min) || + !buffer.ReadS16(&glyph->x_max) || + !buffer.ReadS16(&glyph->y_max)) { + return FONT_COMPRESSION_FAILURE(); + } + + if (num_contours > 0) { + // Simple glyph. + glyph->contours.resize(num_contours); + + // Read the number of points per contour. + uint16_t last_point_index = 0; + for (int i = 0; i < num_contours; ++i) { + uint16_t point_index; + if (!buffer.ReadU16(&point_index)) { + return FONT_COMPRESSION_FAILURE(); + } + uint16_t num_points = point_index - last_point_index + (i == 0 ? 1 : 0); + glyph->contours[i].resize(num_points); + last_point_index = point_index; + } + + // Read the instructions. + if (!buffer.ReadU16(&glyph->instructions_size)) { + return FONT_COMPRESSION_FAILURE(); + } + glyph->instructions_data = data + buffer.offset(); + if (!buffer.Skip(glyph->instructions_size)) { + return FONT_COMPRESSION_FAILURE(); + } + + // Read the run-length coded flags. + std::vector > flags(num_contours); + uint8_t flag = 0; + uint8_t flag_repeat = 0; + for (int i = 0; i < num_contours; ++i) { + flags[i].resize(glyph->contours[i].size()); + for (int j = 0; j < glyph->contours[i].size(); ++j) { + if (flag_repeat == 0) { + if (!buffer.ReadU8(&flag)) { + return FONT_COMPRESSION_FAILURE(); + } + if (flag & kFLAG_REPEAT) { + if (!buffer.ReadU8(&flag_repeat)) { + return FONT_COMPRESSION_FAILURE(); + } + } + } else { + flag_repeat--; + } + flags[i][j] = flag; + glyph->contours[i][j].on_curve = flag & kFLAG_ONCURVE; + } + } + + // Read the x coordinates. + int prev_x = 0; + for (int i = 0; i < num_contours; ++i) { + for (int j = 0; j < glyph->contours[i].size(); ++j) { + uint8_t flag = flags[i][j]; + if (flag & kFLAG_XSHORT) { + // single byte x-delta coord value + uint8_t x_delta; + if (!buffer.ReadU8(&x_delta)) { + return FONT_COMPRESSION_FAILURE(); + } + int sign = (flag & kFLAG_XREPEATSIGN) ? 1 : -1; + glyph->contours[i][j].x = prev_x + sign * x_delta; + } else { + // double byte x-delta coord value + int16_t x_delta = 0; + if (!(flag & kFLAG_XREPEATSIGN)) { + if (!buffer.ReadS16(&x_delta)) { + return FONT_COMPRESSION_FAILURE(); + } + } + glyph->contours[i][j].x = prev_x + x_delta; + } + prev_x = glyph->contours[i][j].x; + } + } + + // Read the y coordinates. + int prev_y = 0; + for (int i = 0; i < num_contours; ++i) { + for (int j = 0; j < glyph->contours[i].size(); ++j) { + uint8_t flag = flags[i][j]; + if (flag & kFLAG_YSHORT) { + // single byte y-delta coord value + uint8_t y_delta; + if (!buffer.ReadU8(&y_delta)) { + return FONT_COMPRESSION_FAILURE(); + } + int sign = (flag & kFLAG_YREPEATSIGN) ? 1 : -1; + glyph->contours[i][j].y = prev_y + sign * y_delta; + } else { + // double byte y-delta coord value + int16_t y_delta = 0; + if (!(flag & kFLAG_YREPEATSIGN)) { + if (!buffer.ReadS16(&y_delta)) { + return FONT_COMPRESSION_FAILURE(); + } + } + glyph->contours[i][j].y = prev_y + y_delta; + } + prev_y = glyph->contours[i][j].y; + } + } + } else if (num_contours == -1) { + // Composite glyph. + if (!ReadCompositeGlyphData(&buffer, glyph)) { + return FONT_COMPRESSION_FAILURE(); + } + // Read the instructions. + if (glyph->have_instructions) { + if (!buffer.ReadU16(&glyph->instructions_size)) { + return FONT_COMPRESSION_FAILURE(); + } + glyph->instructions_data = data + buffer.offset(); + if (!buffer.Skip(glyph->instructions_size)) { + return FONT_COMPRESSION_FAILURE(); + } + } else { + glyph->instructions_size = 0; + } + } else { + return FONT_COMPRESSION_FAILURE(); + } + return true; +} + +namespace { + +void StoreBbox(const Glyph& glyph, size_t* offset, uint8_t* dst) { + Store16(glyph.x_min, offset, dst); + Store16(glyph.y_min, offset, dst); + Store16(glyph.x_max, offset, dst); + Store16(glyph.y_max, offset, dst); +} + +void StoreInstructions(const Glyph& glyph, size_t* offset, uint8_t* dst) { + Store16(glyph.instructions_size, offset, dst); + StoreBytes(glyph.instructions_data, glyph.instructions_size, offset, dst); +} + +bool StoreEndPtsOfContours(const Glyph& glyph, size_t* offset, uint8_t* dst) { + int end_point = -1; + for (const auto& contour : glyph.contours) { + end_point += contour.size(); + if (contour.size() > std::numeric_limits::max() || + end_point > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + Store16(end_point, offset, dst); + } + return true; +} + +bool StorePoints(const Glyph& glyph, size_t* offset, + uint8_t* dst, size_t dst_size) { + int last_flag = -1; + int repeat_count = 0; + int last_x = 0; + int last_y = 0; + size_t x_bytes = 0; + size_t y_bytes = 0; + + // Store the flags and calculate the total size of the x and y coordinates. + for (const auto& contour : glyph.contours) { + for (const auto& point : contour) { + int flag = point.on_curve ? kFLAG_ONCURVE : 0; + int dx = point.x - last_x; + int dy = point.y - last_y; + if (dx == 0) { + flag |= kFLAG_XREPEATSIGN; + } else if (dx > -256 && dx < 256) { + flag |= kFLAG_XSHORT | (dx > 0 ? kFLAG_XREPEATSIGN : 0); + x_bytes += 1; + } else { + x_bytes += 2; + } + if (dy == 0) { + flag |= kFLAG_YREPEATSIGN; + } else if (dy > -256 && dy < 256) { + flag |= kFLAG_YSHORT | (dy > 0 ? kFLAG_YREPEATSIGN : 0); + y_bytes += 1; + } else { + y_bytes += 2; + } + if (flag == last_flag && repeat_count != 255) { + dst[*offset - 1] |= kFLAG_REPEAT; + repeat_count++; + } else { + if (repeat_count != 0) { + if (*offset >= dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + dst[(*offset)++] = repeat_count; + } + if (*offset >= dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + dst[(*offset)++] = flag; + repeat_count = 0; + } + last_x = point.x; + last_y = point.y; + last_flag = flag; + } + } + if (repeat_count != 0) { + if (*offset >= dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + dst[(*offset)++] = repeat_count; + } + + if (*offset + x_bytes + y_bytes > dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + + // Store the x and y coordinates. + size_t x_offset = *offset; + size_t y_offset = *offset + x_bytes; + last_x = 0; + last_y = 0; + for (const auto& contour : glyph.contours) { + for (const auto& point : contour) { + int dx = point.x - last_x; + int dy = point.y - last_y; + if (dx == 0) { + // pass + } else if (dx > -256 && dx < 256) { + dst[x_offset++] = std::abs(dx); + } else { + Store16(dx, &x_offset, dst); + } + if (dy == 0) { + // pass + } else if (dy > -256 && dy < 256) { + dst[y_offset++] = std::abs(dy); + } else { + Store16(dy, &y_offset, dst); + } + last_x += dx; + last_y += dy; + } + } + *offset = y_offset; + return true; +} + +} // namespace + +bool StoreGlyph(const Glyph& glyph, uint8_t* dst, size_t* dst_size) { + size_t offset = 0; + if (glyph.composite_data_size > 0) { + // Composite glyph. + if (*dst_size < ((10ULL + glyph.composite_data_size) + + ((glyph.have_instructions ? 2ULL : 0) + + glyph.instructions_size))) { + return FONT_COMPRESSION_FAILURE(); + } + Store16(-1, &offset, dst); + StoreBbox(glyph, &offset, dst); + StoreBytes(glyph.composite_data, glyph.composite_data_size, &offset, dst); + if (glyph.have_instructions) { + StoreInstructions(glyph, &offset, dst); + } + } else if (glyph.contours.size() > 0) { + // Simple glyph. + if (glyph.contours.size() > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + if (*dst_size < ((12ULL + 2 * glyph.contours.size()) + + glyph.instructions_size)) { + return FONT_COMPRESSION_FAILURE(); + } + Store16(glyph.contours.size(), &offset, dst); + StoreBbox(glyph, &offset, dst); + if (!StoreEndPtsOfContours(glyph, &offset, dst)) { + return FONT_COMPRESSION_FAILURE(); + } + StoreInstructions(glyph, &offset, dst); + if (!StorePoints(glyph, &offset, dst, *dst_size)) { + return FONT_COMPRESSION_FAILURE(); + } + } + *dst_size = offset; + return true; +} + +} // namespace woff2 diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/glyph.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/glyph.h new file mode 100644 index 0000000..0ee755c --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/glyph.h @@ -0,0 +1,71 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Data model and I/O for glyph data within sfnt format files for the purpose of +// performing the preprocessing step of the WOFF 2.0 conversion. + +#ifndef WOFF2_GLYPH_H_ +#define WOFF2_GLYPH_H_ + +#include +#include +#include + +namespace woff2 { + +// Represents a parsed simple or composite glyph. The composite glyph data and +// instructions are un-parsed and we keep only pointers to the raw data, +// therefore the glyph is valid only so long the data from which it was parsed +// is around. +class Glyph { + public: + Glyph() : instructions_size(0), composite_data_size(0) {} + + // Bounding box. + int16_t x_min; + int16_t x_max; + int16_t y_min; + int16_t y_max; + + // Instructions. + uint16_t instructions_size; + const uint8_t* instructions_data; + + // Data model for simple glyphs. + struct Point { + int x; + int y; + bool on_curve; + }; + std::vector > contours; + + // Data for composite glyphs. + const uint8_t* composite_data; + uint32_t composite_data_size; + bool have_instructions; +}; + +// Parses the glyph from the given data. Returns false on parsing failure or +// buffer overflow. The glyph is valid only so long the input data pointer is +// valid. +bool ReadGlyph(const uint8_t* data, size_t len, Glyph* glyph); + +// Stores the glyph into the specified dst buffer. The *dst_size is the buffer +// size on entry and is set to the actual (unpadded) stored size on exit. +// Returns false on buffer overflow. +bool StoreGlyph(const Glyph& glyph, uint8_t* dst, size_t* dst_size); + +} // namespace woff2 + +#endif // WOFF2_GLYPH_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/normalize.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/normalize.cc new file mode 100644 index 0000000..a16f7b6 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/normalize.cc @@ -0,0 +1,319 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Glyph normalization + +#include "./normalize.h" + +#include +#include + +#include "./buffer.h" +#include "./port.h" +#include "./font.h" +#include "./glyph.h" +#include "./round.h" +#include "./store_bytes.h" +#include "./table_tags.h" +#include "./woff2_common.h" + +namespace woff2 { + +namespace { + +void StoreLoca(int index_fmt, uint32_t value, size_t* offset, uint8_t* dst) { + if (index_fmt == 0) { + Store16(value >> 1, offset, dst); + } else { + StoreU32(value, offset, dst); + } +} + +} // namespace + +namespace { + +bool WriteNormalizedLoca(int index_fmt, int num_glyphs, Font* font) { + Font::Table* glyf_table = font->FindTable(kGlyfTableTag); + Font::Table* loca_table = font->FindTable(kLocaTableTag); + + int glyph_sz = index_fmt == 0 ? 2 : 4; + loca_table->buffer.resize(Round4(num_glyphs + 1) * glyph_sz); + loca_table->length = (num_glyphs + 1) * glyph_sz; + + uint8_t* glyf_dst = &glyf_table->buffer[0]; + uint8_t* loca_dst = &loca_table->buffer[0]; + uint32_t glyf_offset = 0; + size_t loca_offset = 0; + + for (int i = 0; i < num_glyphs; ++i) { + StoreLoca(index_fmt, glyf_offset, &loca_offset, loca_dst); + Glyph glyph; + const uint8_t* glyph_data; + size_t glyph_size; + if (!GetGlyphData(*font, i, &glyph_data, &glyph_size) || + (glyph_size > 0 && !ReadGlyph(glyph_data, glyph_size, &glyph))) { + return FONT_COMPRESSION_FAILURE(); + } + size_t glyf_dst_size = glyf_table->buffer.size() - glyf_offset; + if (!StoreGlyph(glyph, glyf_dst + glyf_offset, &glyf_dst_size)) { + return FONT_COMPRESSION_FAILURE(); + } + glyf_dst_size = Round4(glyf_dst_size); + if (glyf_dst_size > std::numeric_limits::max() || + glyf_offset + static_cast(glyf_dst_size) < glyf_offset || + (index_fmt == 0 && glyf_offset + glyf_dst_size >= (1UL << 17))) { + return FONT_COMPRESSION_FAILURE(); + } + glyf_offset += glyf_dst_size; + } + if (glyf_offset == 0) { + return false; + } + + StoreLoca(index_fmt, glyf_offset, &loca_offset, loca_dst); + + glyf_table->buffer.resize(glyf_offset); + glyf_table->data = &glyf_table->buffer[0]; + glyf_table->length = glyf_offset; + loca_table->data = &loca_table->buffer[0]; + + return true; +} + +} // namespace + +namespace { + +bool MakeEditableBuffer(Font* font, int tableTag) { + Font::Table* table = font->FindTable(tableTag); + if (table == NULL) { + return FONT_COMPRESSION_FAILURE(); + } + if (table->IsReused()) { + return true; + } + int sz = Round4(table->length); + table->buffer.resize(sz); + uint8_t* buf = &table->buffer[0]; + memcpy(buf, table->data, sz); + table->data = buf; + return true; +} + +} // namespace + +bool NormalizeGlyphs(Font* font) { + Font::Table* cff_table = font->FindTable(kCffTableTag); + Font::Table* head_table = font->FindTable(kHeadTableTag); + Font::Table* glyf_table = font->FindTable(kGlyfTableTag); + Font::Table* loca_table = font->FindTable(kLocaTableTag); + if (head_table == NULL) { + return FONT_COMPRESSION_FAILURE(); + } + // CFF, no loca, no glyf is OK for CFF. If so, don't normalize. + if (cff_table != NULL && loca_table == NULL && glyf_table == NULL) { + return true; + } + if (loca_table == NULL || glyf_table == NULL) { + return FONT_COMPRESSION_FAILURE(); + } + + // Must share neither or both loca & glyf + if (loca_table->IsReused() != glyf_table->IsReused()) { + return FONT_COMPRESSION_FAILURE(); + } + if (loca_table->IsReused()) { + return true; + } + + int index_fmt = head_table->data[51]; + int num_glyphs = NumGlyphs(*font); + + // We need to allocate a bit more than its original length for the normalized + // glyf table, since it can happen that the glyphs in the original table are + // 2-byte aligned, while in the normalized table they are 4-byte aligned. + // That gives a maximum of 2 bytes increase per glyph. However, there is no + // theoretical guarantee that the total size of the flags plus the coordinates + // is the smallest possible in the normalized version, so we have to allow + // some general overhead. + // TODO(user) Figure out some more precise upper bound on the size of + // the overhead. + size_t max_normalized_glyf_size = 1.1 * glyf_table->length + 2 * num_glyphs; + + glyf_table->buffer.resize(max_normalized_glyf_size); + + // if we can't write a loca using short's (index_fmt 0) + // try again using longs (index_fmt 1) + if (!WriteNormalizedLoca(index_fmt, num_glyphs, font)) { + if (index_fmt != 0) { + return FONT_COMPRESSION_FAILURE(); + } + + // Rewrite loca with 4-byte entries & update head to match + index_fmt = 1; + if (!WriteNormalizedLoca(index_fmt, num_glyphs, font)) { + return FONT_COMPRESSION_FAILURE(); + } + head_table->buffer[51] = 1; + } + + return true; +} + +bool NormalizeOffsets(Font* font) { + uint32_t offset = 12 + 16 * font->num_tables; + for (auto tag : font->OutputOrderedTags()) { + auto& table = font->tables[tag]; + table.offset = offset; + offset += Round4(table.length); + } + return true; +} + +namespace { + +uint32_t ComputeHeaderChecksum(const Font& font) { + uint32_t checksum = font.flavor; + uint16_t max_pow2 = font.num_tables ? Log2Floor(font.num_tables) : 0; + uint16_t search_range = max_pow2 ? 1 << (max_pow2 + 4) : 0; + uint16_t range_shift = (font.num_tables << 4) - search_range; + checksum += (font.num_tables << 16 | search_range); + checksum += (max_pow2 << 16 | range_shift); + for (const auto& i : font.tables) { + const Font::Table* table = &i.second; + if (table->IsReused()) { + table = table->reuse_of; + } + checksum += table->tag; + checksum += table->checksum; + checksum += table->offset; + checksum += table->length; + } + return checksum; +} + +} // namespace + +bool FixChecksums(Font* font) { + Font::Table* head_table = font->FindTable(kHeadTableTag); + if (head_table == NULL) { + return FONT_COMPRESSION_FAILURE(); + } + if (head_table->reuse_of != NULL) { + head_table = head_table->reuse_of; + } + if (head_table->length < 12) { + return FONT_COMPRESSION_FAILURE(); + } + + uint8_t* head_buf = &head_table->buffer[0]; + size_t offset = 8; + StoreU32(0, &offset, head_buf); + uint32_t file_checksum = 0; + uint32_t head_checksum = 0; + for (auto& i : font->tables) { + Font::Table* table = &i.second; + if (table->IsReused()) { + table = table->reuse_of; + } + table->checksum = ComputeULongSum(table->data, table->length); + file_checksum += table->checksum; + + if (table->tag == kHeadTableTag) { + head_checksum = table->checksum; + } + } + + file_checksum += ComputeHeaderChecksum(*font); + offset = 8; + StoreU32(0xb1b0afba - file_checksum, &offset, head_buf); + + return true; +} + +namespace { +bool MarkTransformed(Font* font) { + Font::Table* head_table = font->FindTable(kHeadTableTag); + if (head_table == NULL) { + return FONT_COMPRESSION_FAILURE(); + } + if (head_table->reuse_of != NULL) { + head_table = head_table->reuse_of; + } + if (head_table->length < 17) { + return FONT_COMPRESSION_FAILURE(); + } + // set bit 11 of head table 'flags' to indicate that font has undergone + // lossless modifying transform + int head_flags = head_table->data[16]; + head_table->buffer[16] = head_flags | 0x08; + return true; +} +} // namespace + + +bool NormalizeWithoutFixingChecksums(Font* font) { + return (MakeEditableBuffer(font, kHeadTableTag) && + RemoveDigitalSignature(font) && + MarkTransformed(font) && + NormalizeGlyphs(font) && + NormalizeOffsets(font)); +} + +bool NormalizeFont(Font* font) { + return (NormalizeWithoutFixingChecksums(font) && + FixChecksums(font)); +} + +bool NormalizeFontCollection(FontCollection* font_collection) { + if (font_collection->fonts.size() == 1) { + return NormalizeFont(&font_collection->fonts[0]); + } + + uint32_t offset = CollectionHeaderSize(font_collection->header_version, + font_collection->fonts.size()); + for (auto& font : font_collection->fonts) { + if (!NormalizeWithoutFixingChecksums(&font)) { + fprintf(stderr, "Font normalization failed.\n"); + return false; + } + offset += kSfntHeaderSize + kSfntEntrySize * font.num_tables; + } + + // Start table offsets after TTC Header and Sfnt Headers + for (auto& font : font_collection->fonts) { + for (auto tag : font.OutputOrderedTags()) { + Font::Table& table = font.tables[tag]; + if (table.IsReused()) { + table.offset = table.reuse_of->offset; + } else { + table.offset = offset; + offset += Round4(table.length); + } + } + } + + // Now we can fix the checksums + for (auto& font : font_collection->fonts) { + if (!FixChecksums(&font)) { + fprintf(stderr, "Failed to fix checksums\n"); + return false; + } + } + + return true; +} + +} // namespace woff2 diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/normalize.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/normalize.h new file mode 100644 index 0000000..e015348 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/normalize.h @@ -0,0 +1,47 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Functions for normalizing fonts. Since the WOFF 2.0 decoder creates font +// files in normalized form, the WOFF 2.0 conversion is guaranteed to be +// lossless (in a bitwise sense) only for normalized font files. + +#ifndef WOFF2_NORMALIZE_H_ +#define WOFF2_NORMALIZE_H_ + +namespace woff2 { + +struct Font; +struct FontCollection; + +// Changes the offset fields of the table headers so that the data for the +// tables will be written in order of increasing tag values, without any gaps +// other than the 4-byte padding. +bool NormalizeOffsets(Font* font); + +// Changes the checksum fields of the table headers and the checksum field of +// the head table so that it matches the current data. +bool FixChecksums(Font* font); + +// Parses each of the glyphs in the font and writes them again to the glyf +// table in normalized form, as defined by the StoreGlyph() function. Changes +// the loca table accordigly. +bool NormalizeGlyphs(Font* font); + +// Performs all of the normalization steps above. +bool NormalizeFont(Font* font); +bool NormalizeFontCollection(FontCollection* font_collection); + +} // namespace woff2 + +#endif // WOFF2_NORMALIZE_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/port.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/port.h new file mode 100644 index 0000000..b0caf38 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/port.h @@ -0,0 +1,48 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Helper function for bit twiddling + +#ifndef WOFF2_PORT_H_ +#define WOFF2_PORT_H_ + +#include + +namespace woff2 { + +typedef unsigned int uint32; + +inline int Log2Floor(uint32 n) { +#if defined(__GNUC__) + return n == 0 ? -1 : 31 ^ __builtin_clz(n); +#else + if (n == 0) + return -1; + int log = 0; + uint32 value = n; + for (int i = 4; i >= 0; --i) { + int shift = (1 << i); + uint32 x = value >> shift; + if (x != 0) { + value = x; + log += shift; + } + } + assert(value == 1); + return log; +#endif +} + +} // namespace woff2 +#endif // WOFF2_PORT_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/round.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/round.h new file mode 100644 index 0000000..abb81f8 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/round.h @@ -0,0 +1,35 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Helper for rounding + +#ifndef WOFF2_ROUND_H_ +#define WOFF2_ROUND_H_ + +#include + +namespace woff2 { + +// Round a value up to the nearest multiple of 4. Don't round the value in the +// case that rounding up overflows. +template T Round4(T value) { + if (std::numeric_limits::max() - value < 3) { + return value; + } + return (value + 3) & ~3; +} + +} // namespace woff2 + +#endif // WOFF2_ROUND_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/store_bytes.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/store_bytes.h new file mode 100644 index 0000000..a9a3401 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/store_bytes.h @@ -0,0 +1,61 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Helper functions for storing integer values into byte streams. +// No bounds checking is performed, that is the responsibility of the caller. + +#ifndef WOFF2_STORE_BYTES_H_ +#define WOFF2_STORE_BYTES_H_ + +#include +#include +#include + +namespace woff2 { + +inline size_t StoreU32(uint8_t* dst, size_t offset, uint32_t x) { + dst[offset] = x >> 24; + dst[offset + 1] = x >> 16; + dst[offset + 2] = x >> 8; + dst[offset + 3] = x; + return offset + 4; +} + +inline size_t Store16(uint8_t* dst, size_t offset, int x) { + dst[offset] = x >> 8; + dst[offset + 1] = x; + return offset + 2; +} + +inline void StoreU32(uint32_t val, size_t* offset, uint8_t* dst) { + dst[(*offset)++] = val >> 24; + dst[(*offset)++] = val >> 16; + dst[(*offset)++] = val >> 8; + dst[(*offset)++] = val; +} + +inline void Store16(int val, size_t* offset, uint8_t* dst) { + dst[(*offset)++] = val >> 8; + dst[(*offset)++] = val; +} + +inline void StoreBytes(const uint8_t* data, size_t len, + size_t* offset, uint8_t* dst) { + memcpy(&dst[*offset], data, len); + *offset += len; +} + +} // namespace woff2 + +#endif // WOFF2_STORE_BYTES_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/table_tags.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/table_tags.cc new file mode 100644 index 0000000..0071e00 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/table_tags.cc @@ -0,0 +1,90 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Font table tags + +#include "./table_tags.h" + +namespace woff2 { + +// Note that the byte order is big-endian, not the same as ots.cc +#define TAG(a, b, c, d) ((a << 24) | (b << 16) | (c << 8) | d) + +const uint32_t kKnownTags[63] = { + TAG('c', 'm', 'a', 'p'), // 0 + TAG('h', 'e', 'a', 'd'), // 1 + TAG('h', 'h', 'e', 'a'), // 2 + TAG('h', 'm', 't', 'x'), // 3 + TAG('m', 'a', 'x', 'p'), // 4 + TAG('n', 'a', 'm', 'e'), // 5 + TAG('O', 'S', '/', '2'), // 6 + TAG('p', 'o', 's', 't'), // 7 + TAG('c', 'v', 't', ' '), // 8 + TAG('f', 'p', 'g', 'm'), // 9 + TAG('g', 'l', 'y', 'f'), // 10 + TAG('l', 'o', 'c', 'a'), // 11 + TAG('p', 'r', 'e', 'p'), // 12 + TAG('C', 'F', 'F', ' '), // 13 + TAG('V', 'O', 'R', 'G'), // 14 + TAG('E', 'B', 'D', 'T'), // 15 + TAG('E', 'B', 'L', 'C'), // 16 + TAG('g', 'a', 's', 'p'), // 17 + TAG('h', 'd', 'm', 'x'), // 18 + TAG('k', 'e', 'r', 'n'), // 19 + TAG('L', 'T', 'S', 'H'), // 20 + TAG('P', 'C', 'L', 'T'), // 21 + TAG('V', 'D', 'M', 'X'), // 22 + TAG('v', 'h', 'e', 'a'), // 23 + TAG('v', 'm', 't', 'x'), // 24 + TAG('B', 'A', 'S', 'E'), // 25 + TAG('G', 'D', 'E', 'F'), // 26 + TAG('G', 'P', 'O', 'S'), // 27 + TAG('G', 'S', 'U', 'B'), // 28 + TAG('E', 'B', 'S', 'C'), // 29 + TAG('J', 'S', 'T', 'F'), // 30 + TAG('M', 'A', 'T', 'H'), // 31 + TAG('C', 'B', 'D', 'T'), // 32 + TAG('C', 'B', 'L', 'C'), // 33 + TAG('C', 'O', 'L', 'R'), // 34 + TAG('C', 'P', 'A', 'L'), // 35 + TAG('S', 'V', 'G', ' '), // 36 + TAG('s', 'b', 'i', 'x'), // 37 + TAG('a', 'c', 'n', 't'), // 38 + TAG('a', 'v', 'a', 'r'), // 39 + TAG('b', 'd', 'a', 't'), // 40 + TAG('b', 'l', 'o', 'c'), // 41 + TAG('b', 's', 'l', 'n'), // 42 + TAG('c', 'v', 'a', 'r'), // 43 + TAG('f', 'd', 's', 'c'), // 44 + TAG('f', 'e', 'a', 't'), // 45 + TAG('f', 'm', 't', 'x'), // 46 + TAG('f', 'v', 'a', 'r'), // 47 + TAG('g', 'v', 'a', 'r'), // 48 + TAG('h', 's', 't', 'y'), // 49 + TAG('j', 'u', 's', 't'), // 50 + TAG('l', 'c', 'a', 'r'), // 51 + TAG('m', 'o', 'r', 't'), // 52 + TAG('m', 'o', 'r', 'x'), // 53 + TAG('o', 'p', 'b', 'd'), // 54 + TAG('p', 'r', 'o', 'p'), // 55 + TAG('t', 'r', 'a', 'k'), // 56 + TAG('Z', 'a', 'p', 'f'), // 57 + TAG('S', 'i', 'l', 'f'), // 58 + TAG('G', 'l', 'a', 't'), // 59 + TAG('G', 'l', 'o', 'c'), // 60 + TAG('F', 'e', 'a', 't'), // 61 + TAG('S', 'i', 'l', 'l'), // 62 +}; + +} // namespace woff2 diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/table_tags.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/table_tags.h new file mode 100644 index 0000000..c9b09bb --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/table_tags.h @@ -0,0 +1,35 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Font table tags + +#ifndef WOFF2_TABLE_TAGS_H_ +#define WOFF2_TABLE_TAGS_H_ + +#include + +namespace woff2 { + +// Tags of popular tables. +static const uint32_t kGlyfTableTag = 0x676c7966; +static const uint32_t kHeadTableTag = 0x68656164; +static const uint32_t kLocaTableTag = 0x6c6f6361; +static const uint32_t kDsigTableTag = 0x44534947; +static const uint32_t kCffTableTag = 0x43464620; + +extern const uint32_t kKnownTags[]; + +} // namespace woff2 + +#endif // WOFF2_TABLE_TAGS_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/transform.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/transform.cc new file mode 100644 index 0000000..66c6e08 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/transform.cc @@ -0,0 +1,288 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Library for preprocessing fonts as part of the WOFF 2.0 conversion. + +#include "./transform.h" + +#include // for std::abs + +#include "./buffer.h" +#include "./font.h" +#include "./glyph.h" +#include "./table_tags.h" +#include "./variable_length.h" + +namespace woff2 { + +namespace { + +const int FLAG_ARG_1_AND_2_ARE_WORDS = 1 << 0; +const int FLAG_WE_HAVE_INSTRUCTIONS = 1 << 8; + +void WriteBytes(std::vector* out, const uint8_t* data, size_t len) { + if (len == 0) return; + size_t offset = out->size(); + out->resize(offset + len); + memcpy(&(*out)[offset], data, len); +} + +void WriteBytes(std::vector* out, const std::vector& in) { + for (int i = 0; i < in.size(); ++i) { + out->push_back(in[i]); + } +} + +void WriteUShort(std::vector* out, int value) { + out->push_back(value >> 8); + out->push_back(value & 255); +} + +void WriteLong(std::vector* out, int value) { + out->push_back((value >> 24) & 255); + out->push_back((value >> 16) & 255); + out->push_back((value >> 8) & 255); + out->push_back(value & 255); +} + +// Glyf table preprocessing, based on +// GlyfEncoder.java +class GlyfEncoder { + public: + explicit GlyfEncoder(int num_glyphs) + : n_glyphs_(num_glyphs) { + bbox_bitmap_.resize(((num_glyphs + 31) >> 5) << 2); + } + + bool Encode(int glyph_id, const Glyph& glyph) { + if (glyph.composite_data_size > 0) { + WriteCompositeGlyph(glyph_id, glyph); + } else if (glyph.contours.size() > 0) { + WriteSimpleGlyph(glyph_id, glyph); + } else { + WriteUShort(&n_contour_stream_, 0); + } + return true; + } + + void GetTransformedGlyfBytes(std::vector* result) { + WriteLong(result, 0); // version + WriteUShort(result, n_glyphs_); + WriteUShort(result, 0); // index_format, will be set later + WriteLong(result, n_contour_stream_.size()); + WriteLong(result, n_points_stream_.size()); + WriteLong(result, flag_byte_stream_.size()); + WriteLong(result, glyph_stream_.size()); + WriteLong(result, composite_stream_.size()); + WriteLong(result, bbox_bitmap_.size() + bbox_stream_.size()); + WriteLong(result, instruction_stream_.size()); + WriteBytes(result, n_contour_stream_); + WriteBytes(result, n_points_stream_); + WriteBytes(result, flag_byte_stream_); + WriteBytes(result, glyph_stream_); + WriteBytes(result, composite_stream_); + WriteBytes(result, bbox_bitmap_); + WriteBytes(result, bbox_stream_); + WriteBytes(result, instruction_stream_); + } + + private: + void WriteInstructions(const Glyph& glyph) { + Write255UShort(&glyph_stream_, glyph.instructions_size); + WriteBytes(&instruction_stream_, + glyph.instructions_data, glyph.instructions_size); + } + + bool ShouldWriteSimpleGlyphBbox(const Glyph& glyph) { + if (glyph.contours.empty() || glyph.contours[0].empty()) { + return glyph.x_min || glyph.y_min || glyph.x_max || glyph.y_max; + } + + int16_t x_min = glyph.contours[0][0].x; + int16_t y_min = glyph.contours[0][0].y; + int16_t x_max = x_min; + int16_t y_max = y_min; + for (const auto& contour : glyph.contours) { + for (const auto& point : contour) { + if (point.x < x_min) x_min = point.x; + if (point.x > x_max) x_max = point.x; + if (point.y < y_min) y_min = point.y; + if (point.y > y_max) y_max = point.y; + } + } + + if (glyph.x_min != x_min) + return true; + if (glyph.y_min != y_min) + return true; + if (glyph.x_max != x_max) + return true; + if (glyph.y_max != y_max) + return true; + + return false; + } + + void WriteSimpleGlyph(int glyph_id, const Glyph& glyph) { + int num_contours = glyph.contours.size(); + WriteUShort(&n_contour_stream_, num_contours); + if (ShouldWriteSimpleGlyphBbox(glyph)) { + WriteBbox(glyph_id, glyph); + } + for (int i = 0; i < num_contours; i++) { + Write255UShort(&n_points_stream_, glyph.contours[i].size()); + } + int lastX = 0; + int lastY = 0; + for (int i = 0; i < num_contours; i++) { + int num_points = glyph.contours[i].size(); + for (int j = 0; j < num_points; j++) { + int x = glyph.contours[i][j].x; + int y = glyph.contours[i][j].y; + int dx = x - lastX; + int dy = y - lastY; + WriteTriplet(glyph.contours[i][j].on_curve, dx, dy); + lastX = x; + lastY = y; + } + } + if (num_contours > 0) { + WriteInstructions(glyph); + } + } + + void WriteCompositeGlyph(int glyph_id, const Glyph& glyph) { + WriteUShort(&n_contour_stream_, -1); + WriteBbox(glyph_id, glyph); + WriteBytes(&composite_stream_, + glyph.composite_data, + glyph.composite_data_size); + if (glyph.have_instructions) { + WriteInstructions(glyph); + } + } + + void WriteBbox(int glyph_id, const Glyph& glyph) { + bbox_bitmap_[glyph_id >> 3] |= 0x80 >> (glyph_id & 7); + WriteUShort(&bbox_stream_, glyph.x_min); + WriteUShort(&bbox_stream_, glyph.y_min); + WriteUShort(&bbox_stream_, glyph.x_max); + WriteUShort(&bbox_stream_, glyph.y_max); + } + + void WriteTriplet(bool on_curve, int x, int y) { + int abs_x = std::abs(x); + int abs_y = std::abs(y); + int on_curve_bit = on_curve ? 0 : 128; + int x_sign_bit = (x < 0) ? 0 : 1; + int y_sign_bit = (y < 0) ? 0 : 1; + int xy_sign_bits = x_sign_bit + 2 * y_sign_bit; + if (x == 0 && abs_y < 1280) { + flag_byte_stream_.push_back(on_curve_bit + + ((abs_y & 0xf00) >> 7) + y_sign_bit); + glyph_stream_.push_back(abs_y & 0xff); + } else if (y == 0 && abs_x < 1280) { + flag_byte_stream_.push_back(on_curve_bit + 10 + + ((abs_x & 0xf00) >> 7) + x_sign_bit); + glyph_stream_.push_back(abs_x & 0xff); + } else if (abs_x < 65 && abs_y < 65) { + flag_byte_stream_.push_back(on_curve_bit + 20 + + ((abs_x - 1) & 0x30) + + (((abs_y - 1) & 0x30) >> 2) + + xy_sign_bits); + glyph_stream_.push_back((((abs_x - 1) & 0xf) << 4) | ((abs_y - 1) & 0xf)); + } else if (abs_x < 769 && abs_y < 769) { + flag_byte_stream_.push_back(on_curve_bit + 84 + + 12 * (((abs_x - 1) & 0x300) >> 8) + + (((abs_y - 1) & 0x300) >> 6) + xy_sign_bits); + glyph_stream_.push_back((abs_x - 1) & 0xff); + glyph_stream_.push_back((abs_y - 1) & 0xff); + } else if (abs_x < 4096 && abs_y < 4096) { + flag_byte_stream_.push_back(on_curve_bit + 120 + xy_sign_bits); + glyph_stream_.push_back(abs_x >> 4); + glyph_stream_.push_back(((abs_x & 0xf) << 4) | (abs_y >> 8)); + glyph_stream_.push_back(abs_y & 0xff); + } else { + flag_byte_stream_.push_back(on_curve_bit + 124 + xy_sign_bits); + glyph_stream_.push_back(abs_x >> 8); + glyph_stream_.push_back(abs_x & 0xff); + glyph_stream_.push_back(abs_y >> 8); + glyph_stream_.push_back(abs_y & 0xff); + } + } + + std::vector n_contour_stream_; + std::vector n_points_stream_; + std::vector flag_byte_stream_; + std::vector composite_stream_; + std::vector bbox_bitmap_; + std::vector bbox_stream_; + std::vector glyph_stream_; + std::vector instruction_stream_; + int n_glyphs_; +}; + +} // namespace + +bool TransformGlyfAndLocaTables(Font* font) { + // no transform for CFF + const Font::Table* glyf_table = font->FindTable(kGlyfTableTag); + const Font::Table* loca_table = font->FindTable(kLocaTableTag); + if (font->FindTable(kCffTableTag) != NULL + && glyf_table == NULL + && loca_table == NULL) { + return true; + } + // Must share neither or both loca/glyf + if (glyf_table->IsReused() != loca_table->IsReused()) { + return FONT_COMPRESSION_FAILURE(); + } + if (glyf_table->IsReused()) { + return true; + } + Font::Table* transformed_glyf = &font->tables[kGlyfTableTag ^ 0x80808080]; + Font::Table* transformed_loca = &font->tables[kLocaTableTag ^ 0x80808080]; + + int num_glyphs = NumGlyphs(*font); + GlyfEncoder encoder(num_glyphs); + for (int i = 0; i < num_glyphs; ++i) { + Glyph glyph; + const uint8_t* glyph_data; + size_t glyph_size; + if (!GetGlyphData(*font, i, &glyph_data, &glyph_size) || + (glyph_size > 0 && !ReadGlyph(glyph_data, glyph_size, &glyph))) { + return FONT_COMPRESSION_FAILURE(); + } + encoder.Encode(i, glyph); + } + encoder.GetTransformedGlyfBytes(&transformed_glyf->buffer); + + const Font::Table* head_table = font->FindTable(kHeadTableTag); + if (head_table == NULL || head_table->length < 52) { + return FONT_COMPRESSION_FAILURE(); + } + transformed_glyf->buffer[7] = head_table->data[51]; // index_format + + transformed_glyf->tag = kGlyfTableTag ^ 0x80808080; + transformed_glyf->length = transformed_glyf->buffer.size(); + transformed_glyf->data = transformed_glyf->buffer.data(); + + transformed_loca->tag = kLocaTableTag ^ 0x80808080; + transformed_loca->length = 0; + transformed_loca->data = NULL; + + return true; +} + +} // namespace woff2 diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/transform.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/transform.h new file mode 100644 index 0000000..15dc73e --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/transform.h @@ -0,0 +1,31 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Library for preprocessing fonts as part of the WOFF 2.0 conversion. + +#ifndef WOFF2_TRANSFORM_H_ +#define WOFF2_TRANSFORM_H_ + +#include "./font.h" + +namespace woff2 { + +// Adds the transformed versions of the glyf and loca tables to the font. The +// transformed loca table has zero length. The tag of the transformed tables is +// derived from the original tag by flipping the MSBs of every byte. +bool TransformGlyfAndLocaTables(Font* font); + +} // namespace woff2 + +#endif // WOFF2_TRANSFORM_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/variable_length.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/variable_length.cc new file mode 100644 index 0000000..9a85623 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/variable_length.cc @@ -0,0 +1,133 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Helper functions for woff2 variable length types: 255UInt16 and UIntBase128 + +#include "./variable_length.h" + +namespace woff2 { + +size_t Size255UShort(uint16_t value) { + size_t result = 3; + if (value < 253) { + result = 1; + } else if (value < 762) { + result = 2; + } else { + result = 3; + } + return result; +} + +void Write255UShort(std::vector* out, int value) { + if (value < 253) { + out->push_back(value); + } else if (value < 506) { + out->push_back(255); + out->push_back(value - 253); + } else if (value < 762) { + out->push_back(254); + out->push_back(value - 506); + } else { + out->push_back(253); + out->push_back(value >> 8); + out->push_back(value & 0xff); + } +} + +void Store255UShort(int val, size_t* offset, uint8_t* dst) { + std::vector packed; + Write255UShort(&packed, val); + for (uint8_t val : packed) { + dst[(*offset)++] = val; + } +} + +// Based on section 6.1.1 of MicroType Express draft spec +bool Read255UShort(Buffer* buf, unsigned int* value) { + static const int kWordCode = 253; + static const int kOneMoreByteCode2 = 254; + static const int kOneMoreByteCode1 = 255; + static const int kLowestUCode = 253; + uint8_t code = 0; + if (!buf->ReadU8(&code)) { + return FONT_COMPRESSION_FAILURE(); + } + if (code == kWordCode) { + uint16_t result = 0; + if (!buf->ReadU16(&result)) { + return FONT_COMPRESSION_FAILURE(); + } + *value = result; + return true; + } else if (code == kOneMoreByteCode1) { + uint8_t result = 0; + if (!buf->ReadU8(&result)) { + return FONT_COMPRESSION_FAILURE(); + } + *value = result + kLowestUCode; + return true; + } else if (code == kOneMoreByteCode2) { + uint8_t result = 0; + if (!buf->ReadU8(&result)) { + return FONT_COMPRESSION_FAILURE(); + } + *value = result + kLowestUCode * 2; + return true; + } else { + *value = code; + return true; + } +} + +bool ReadBase128(Buffer* buf, uint32_t* value) { + uint32_t result = 0; + for (size_t i = 0; i < 5; ++i) { + uint8_t code = 0; + if (!buf->ReadU8(&code)) { + return FONT_COMPRESSION_FAILURE(); + } + // If any of the top seven bits are set then we're about to overflow. + if (result & 0xfe000000) { + return FONT_COMPRESSION_FAILURE(); + } + result = (result << 7) | (code & 0x7f); + if ((code & 0x80) == 0) { + *value = result; + return true; + } + } + // Make sure not to exceed the size bound + return FONT_COMPRESSION_FAILURE(); +} + +size_t Base128Size(size_t n) { + size_t size = 1; + for (; n >= 128; n >>= 7) ++size; + return size; +} + +void StoreBase128(size_t len, size_t* offset, uint8_t* dst) { + size_t size = Base128Size(len); + for (int i = 0; i < size; ++i) { + int b = static_cast((len >> (7 * (size - i - 1))) & 0x7f); + if (i < size - 1) { + b |= 0x80; + } + dst[(*offset)++] = b; + } +} + +} // namespace woff2 + diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/variable_length.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/variable_length.h new file mode 100644 index 0000000..2816ae2 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/variable_length.h @@ -0,0 +1,38 @@ +// Copyright 2015 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Helper functions for woff2 variable length types: 255UInt16 and UIntBase128 + +#ifndef WOFF2_VARIABLE_LENGTH_H_ +#define WOFF2_VARIABLE_LENGTH_H_ + +#include +#include +#include "./buffer.h" + +namespace woff2 { + +size_t Size255UShort(uint16_t value); +bool Read255UShort(Buffer* buf, unsigned int* value); +void Write255UShort(std::vector* out, int value); +void Store255UShort(int val, size_t* offset, uint8_t* dst); + +size_t Base128Size(size_t n); +bool ReadBase128(Buffer* buf, uint32_t* value); +void StoreBase128(size_t len, size_t* offset, uint8_t* dst); + +} // namespace woff2 + +#endif // WOFF2_VARIABLE_LENGTH_H_ + diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_common.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_common.cc new file mode 100644 index 0000000..de5998b --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_common.cc @@ -0,0 +1,46 @@ +// Copyright 2013 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Helpers common across multiple parts of woff2 + +#include + +#include "./woff2_common.h" + +namespace woff2 { + + +uint32_t ComputeULongSum(const uint8_t* buf, size_t size) { + uint32_t checksum = 0; + for (size_t i = 0; i < size; i += 4) { + // We assume the addition is mod 2^32, which is valid because unsigned + checksum += (buf[i] << 24) | (buf[i + 1] << 16) | + (buf[i + 2] << 8) | buf[i + 3]; + } + return checksum; +} + +size_t CollectionHeaderSize(uint32_t header_version, uint32_t num_fonts) { + size_t size = 0; + if (header_version == 0x00020000) { + size += 12; // ulDsig{Tag,Length,Offset} + } + if (header_version == 0x00010000 || header_version == 0x00020000) { + size += 12 // TTCTag, Version, numFonts + + 4 * num_fonts; // OffsetTable[numFonts] + } + return size; +} + +} // namespace woff2 diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_common.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_common.h new file mode 100644 index 0000000..e6cfdf2 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_common.h @@ -0,0 +1,72 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Common definition for WOFF2 encoding/decoding + +#ifndef WOFF2_WOFF2_COMMON_H_ +#define WOFF2_WOFF2_COMMON_H_ + +#include +#include + +#include + +namespace woff2 { + +static const uint32_t kWoff2Signature = 0x774f4632; // "wOF2" + +const unsigned int kWoff2FlagsContinueStream = 1 << 4; +const unsigned int kWoff2FlagsTransform = 1 << 5; + +// TrueType Collection ID string: 'ttcf' +static const uint32_t kTtcFontFlavor = 0x74746366; + +static const size_t kSfntHeaderSize = 12; +static const size_t kSfntEntrySize = 16; + +struct Point { + int x; + int y; + bool on_curve; +}; + +struct Table { + uint32_t tag; + uint32_t flags; + uint32_t src_offset; + uint32_t src_length; + + uint32_t transform_length; + + uint32_t dst_offset; + uint32_t dst_length; + const uint8_t* dst_data; + + bool operator<(const Table& other) const { + return tag < other.tag; + } +}; + + +// Size of the collection header. 0 if version indicates this isn't a +// collection. Ref http://www.microsoft.com/typography/otspec/otff.htm, +// True Type Collections +size_t CollectionHeaderSize(uint32_t header_version, uint32_t num_fonts); + +// Compute checksum over size bytes of buf +uint32_t ComputeULongSum(const uint8_t* buf, size_t size); + +} // namespace woff2 + +#endif // WOFF2_WOFF2_COMMON_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_dec.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_dec.cc new file mode 100644 index 0000000..7740a5d --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_dec.cc @@ -0,0 +1,1130 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Library for converting WOFF2 format font files to their TTF versions. + +#include "./woff2_dec.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "./buffer.h" +#include "./decode.h" +#include "./round.h" +#include "./store_bytes.h" +#include "./table_tags.h" +#include "./variable_length.h" +#include "./woff2_common.h" + +namespace woff2 { + +namespace { + +using std::string; +using std::vector; + + +// simple glyph flags +const int kGlyfOnCurve = 1 << 0; +const int kGlyfXShort = 1 << 1; +const int kGlyfYShort = 1 << 2; +const int kGlyfRepeat = 1 << 3; +const int kGlyfThisXIsSame = 1 << 4; +const int kGlyfThisYIsSame = 1 << 5; + +// composite glyph flags +// See CompositeGlyph.java in sfntly for full definitions +const int FLAG_ARG_1_AND_2_ARE_WORDS = 1 << 0; +const int FLAG_WE_HAVE_A_SCALE = 1 << 3; +const int FLAG_MORE_COMPONENTS = 1 << 5; +const int FLAG_WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; +const int FLAG_WE_HAVE_A_TWO_BY_TWO = 1 << 7; +const int FLAG_WE_HAVE_INSTRUCTIONS = 1 << 8; + +const size_t kCheckSumAdjustmentOffset = 8; + +const size_t kEndPtsOfContoursOffset = 10; +const size_t kCompositeGlyphBegin = 10; + +// metadata for a TTC font entry +struct TtcFont { + uint32_t flavor; + uint32_t dst_offset; + std::vector table_indices; +}; + +int WithSign(int flag, int baseval) { + // Precondition: 0 <= baseval < 65536 (to avoid integer overflow) + return (flag & 1) ? baseval : -baseval; +} + +bool TripletDecode(const uint8_t* flags_in, const uint8_t* in, size_t in_size, + unsigned int n_points, std::vector* result, + size_t* in_bytes_consumed) { + int x = 0; + int y = 0; + + if (n_points > in_size) { + return FONT_COMPRESSION_FAILURE(); + } + unsigned int triplet_index = 0; + + for (unsigned int i = 0; i < n_points; ++i) { + uint8_t flag = flags_in[i]; + bool on_curve = !(flag >> 7); + flag &= 0x7f; + unsigned int n_data_bytes; + if (flag < 84) { + n_data_bytes = 1; + } else if (flag < 120) { + n_data_bytes = 2; + } else if (flag < 124) { + n_data_bytes = 3; + } else { + n_data_bytes = 4; + } + if (triplet_index + n_data_bytes > in_size || + triplet_index + n_data_bytes < triplet_index) { + return FONT_COMPRESSION_FAILURE(); + } + int dx, dy; + if (flag < 10) { + dx = 0; + dy = WithSign(flag, ((flag & 14) << 7) + in[triplet_index]); + } else if (flag < 20) { + dx = WithSign(flag, (((flag - 10) & 14) << 7) + in[triplet_index]); + dy = 0; + } else if (flag < 84) { + int b0 = flag - 20; + int b1 = in[triplet_index]; + dx = WithSign(flag, 1 + (b0 & 0x30) + (b1 >> 4)); + dy = WithSign(flag >> 1, 1 + ((b0 & 0x0c) << 2) + (b1 & 0x0f)); + } else if (flag < 120) { + int b0 = flag - 84; + dx = WithSign(flag, 1 + ((b0 / 12) << 8) + in[triplet_index]); + dy = WithSign(flag >> 1, + 1 + (((b0 % 12) >> 2) << 8) + in[triplet_index + 1]); + } else if (flag < 124) { + int b2 = in[triplet_index + 1]; + dx = WithSign(flag, (in[triplet_index] << 4) + (b2 >> 4)); + dy = WithSign(flag >> 1, ((b2 & 0x0f) << 8) + in[triplet_index + 2]); + } else { + dx = WithSign(flag, (in[triplet_index] << 8) + in[triplet_index + 1]); + dy = WithSign(flag >> 1, + (in[triplet_index + 2] << 8) + in[triplet_index + 3]); + } + triplet_index += n_data_bytes; + // Possible overflow but coordinate values are not security sensitive + x += dx; + y += dy; + result->push_back(Point()); + Point& back = result->back(); + back.x = x; + back.y = y; + back.on_curve = on_curve; + } + *in_bytes_consumed = triplet_index; + return true; +} + +// This function stores just the point data. On entry, dst points to the +// beginning of a simple glyph. Returns true on success. +bool StorePoints(const std::vector& points, + unsigned int n_contours, unsigned int instruction_length, + uint8_t* dst, size_t dst_size, size_t* glyph_size) { + // I believe that n_contours < 65536, in which case this is safe. However, a + // comment and/or an assert would be good. + unsigned int flag_offset = kEndPtsOfContoursOffset + 2 * n_contours + 2 + + instruction_length; + int last_flag = -1; + int repeat_count = 0; + int last_x = 0; + int last_y = 0; + unsigned int x_bytes = 0; + unsigned int y_bytes = 0; + + for (unsigned int i = 0; i < points.size(); ++i) { + const Point& point = points[i]; + int flag = point.on_curve ? kGlyfOnCurve : 0; + int dx = point.x - last_x; + int dy = point.y - last_y; + if (dx == 0) { + flag |= kGlyfThisXIsSame; + } else if (dx > -256 && dx < 256) { + flag |= kGlyfXShort | (dx > 0 ? kGlyfThisXIsSame : 0); + x_bytes += 1; + } else { + x_bytes += 2; + } + if (dy == 0) { + flag |= kGlyfThisYIsSame; + } else if (dy > -256 && dy < 256) { + flag |= kGlyfYShort | (dy > 0 ? kGlyfThisYIsSame : 0); + y_bytes += 1; + } else { + y_bytes += 2; + } + + if (flag == last_flag && repeat_count != 255) { + dst[flag_offset - 1] |= kGlyfRepeat; + repeat_count++; + } else { + if (repeat_count != 0) { + if (flag_offset >= dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + dst[flag_offset++] = repeat_count; + } + if (flag_offset >= dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + dst[flag_offset++] = flag; + repeat_count = 0; + } + last_x = point.x; + last_y = point.y; + last_flag = flag; + } + + if (repeat_count != 0) { + if (flag_offset >= dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + dst[flag_offset++] = repeat_count; + } + unsigned int xy_bytes = x_bytes + y_bytes; + if (xy_bytes < x_bytes || + flag_offset + xy_bytes < flag_offset || + flag_offset + xy_bytes > dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + + int x_offset = flag_offset; + int y_offset = flag_offset + x_bytes; + last_x = 0; + last_y = 0; + for (unsigned int i = 0; i < points.size(); ++i) { + int dx = points[i].x - last_x; + if (dx == 0) { + // pass + } else if (dx > -256 && dx < 256) { + dst[x_offset++] = std::abs(dx); + } else { + // will always fit for valid input, but overflow is harmless + x_offset = Store16(dst, x_offset, dx); + } + last_x += dx; + int dy = points[i].y - last_y; + if (dy == 0) { + // pass + } else if (dy > -256 && dy < 256) { + dst[y_offset++] = std::abs(dy); + } else { + y_offset = Store16(dst, y_offset, dy); + } + last_y += dy; + } + *glyph_size = y_offset; + return true; +} + +// Compute the bounding box of the coordinates, and store into a glyf buffer. +// A precondition is that there are at least 10 bytes available. +void ComputeBbox(const std::vector& points, uint8_t* dst) { + int x_min = 0; + int y_min = 0; + int x_max = 0; + int y_max = 0; + + for (unsigned int i = 0; i < points.size(); ++i) { + int x = points[i].x; + int y = points[i].y; + if (i == 0 || x < x_min) x_min = x; + if (i == 0 || x > x_max) x_max = x; + if (i == 0 || y < y_min) y_min = y; + if (i == 0 || y > y_max) y_max = y; + } + size_t offset = 2; + offset = Store16(dst, offset, x_min); + offset = Store16(dst, offset, y_min); + offset = Store16(dst, offset, x_max); + offset = Store16(dst, offset, y_max); +} + +// Process entire bbox stream. This is done as a separate pass to allow for +// composite bbox computations (an optional more aggressive transform). +bool ProcessBboxStream(Buffer* bbox_stream, unsigned int n_glyphs, + const std::vector& loca_values, uint8_t* glyf_buf, + size_t glyf_buf_length) { + const uint8_t* buf = bbox_stream->buffer(); + if (n_glyphs >= 65536 || loca_values.size() != n_glyphs + 1) { + return FONT_COMPRESSION_FAILURE(); + } + // Safe because n_glyphs is bounded + unsigned int bitmap_length = ((n_glyphs + 31) >> 5) << 2; + if (!bbox_stream->Skip(bitmap_length)) { + return FONT_COMPRESSION_FAILURE(); + } + for (unsigned int i = 0; i < n_glyphs; ++i) { + if (buf[i >> 3] & (0x80 >> (i & 7))) { + uint32_t loca_offset = loca_values[i]; + if (loca_values[i + 1] - loca_offset < kEndPtsOfContoursOffset) { + return FONT_COMPRESSION_FAILURE(); + } + if (glyf_buf_length < 2 + 10 || + loca_offset > glyf_buf_length - 2 - 10) { + return FONT_COMPRESSION_FAILURE(); + } + if (!bbox_stream->Read(glyf_buf + loca_offset + 2, 8)) { + return FONT_COMPRESSION_FAILURE(); + } + } + } + return true; +} + +bool ProcessComposite(Buffer* composite_stream, uint8_t* dst, + size_t dst_size, size_t* glyph_size, bool* have_instructions) { + size_t start_offset = composite_stream->offset(); + bool we_have_instructions = false; + + uint16_t flags = FLAG_MORE_COMPONENTS; + while (flags & FLAG_MORE_COMPONENTS) { + if (!composite_stream->ReadU16(&flags)) { + return FONT_COMPRESSION_FAILURE(); + } + we_have_instructions |= (flags & FLAG_WE_HAVE_INSTRUCTIONS) != 0; + size_t arg_size = 2; // glyph index + if (flags & FLAG_ARG_1_AND_2_ARE_WORDS) { + arg_size += 4; + } else { + arg_size += 2; + } + if (flags & FLAG_WE_HAVE_A_SCALE) { + arg_size += 2; + } else if (flags & FLAG_WE_HAVE_AN_X_AND_Y_SCALE) { + arg_size += 4; + } else if (flags & FLAG_WE_HAVE_A_TWO_BY_TWO) { + arg_size += 8; + } + if (!composite_stream->Skip(arg_size)) { + return FONT_COMPRESSION_FAILURE(); + } + } + size_t composite_glyph_size = composite_stream->offset() - start_offset; + if (composite_glyph_size + kCompositeGlyphBegin > dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + Store16(dst, 0, 0xffff); // nContours = -1 for composite glyph + std::memcpy(dst + kCompositeGlyphBegin, + composite_stream->buffer() + start_offset, + composite_glyph_size); + *glyph_size = kCompositeGlyphBegin + composite_glyph_size; + *have_instructions = we_have_instructions; + return true; +} + +// Build TrueType loca table +bool StoreLoca(const std::vector& loca_values, int index_format, + uint8_t* dst, size_t dst_size) { + const uint64_t loca_size = loca_values.size(); + const uint64_t offset_size = index_format ? 4 : 2; + if ((loca_size << 2) >> 2 != loca_size) { + return FONT_COMPRESSION_FAILURE(); + } + if (offset_size * loca_size > dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + size_t offset = 0; + for (size_t i = 0; i < loca_values.size(); ++i) { + uint32_t value = loca_values[i]; + if (index_format) { + offset = StoreU32(dst, offset, value); + } else { + offset = Store16(dst, offset, value >> 1); + } + } + return true; +} + +// Reconstruct entire glyf table based on transformed original +bool ReconstructGlyf(const uint8_t* data, size_t data_size, + uint8_t* dst, size_t dst_size, + uint8_t* loca_buf, size_t loca_size) { + static const int kNumSubStreams = 7; + Buffer file(data, data_size); + uint32_t version; + std::vector > substreams(kNumSubStreams); + + if (!file.ReadU32(&version)) { + return FONT_COMPRESSION_FAILURE(); + } + uint16_t num_glyphs; + uint16_t index_format; + if (!file.ReadU16(&num_glyphs) || + !file.ReadU16(&index_format)) { + return FONT_COMPRESSION_FAILURE(); + } + + unsigned int offset = (2 + kNumSubStreams) * 4; + if (offset > data_size) { + return FONT_COMPRESSION_FAILURE(); + } + // Invariant from here on: data_size >= offset + for (int i = 0; i < kNumSubStreams; ++i) { + uint32_t substream_size; + if (!file.ReadU32(&substream_size)) { + return FONT_COMPRESSION_FAILURE(); + } + if (substream_size > data_size - offset) { + return FONT_COMPRESSION_FAILURE(); + } + substreams[i] = std::make_pair(data + offset, substream_size); + offset += substream_size; + } + Buffer n_contour_stream(substreams[0].first, substreams[0].second); + Buffer n_points_stream(substreams[1].first, substreams[1].second); + Buffer flag_stream(substreams[2].first, substreams[2].second); + Buffer glyph_stream(substreams[3].first, substreams[3].second); + Buffer composite_stream(substreams[4].first, substreams[4].second); + Buffer bbox_stream(substreams[5].first, substreams[5].second); + Buffer instruction_stream(substreams[6].first, substreams[6].second); + + std::vector loca_values(num_glyphs + 1); + std::vector n_points_vec; + std::vector points; + uint32_t loca_offset = 0; + for (unsigned int i = 0; i < num_glyphs; ++i) { + size_t glyph_size = 0; + uint16_t n_contours = 0; + if (!n_contour_stream.ReadU16(&n_contours)) { + return FONT_COMPRESSION_FAILURE(); + } + uint8_t* glyf_dst = dst + loca_offset; + size_t glyf_dst_size = dst_size - loca_offset; + if (n_contours == 0xffff) { + // composite glyph + bool have_instructions = false; + unsigned int instruction_size = 0; + if (!ProcessComposite(&composite_stream, glyf_dst, glyf_dst_size, + &glyph_size, &have_instructions)) { + return FONT_COMPRESSION_FAILURE(); + } + if (have_instructions) { + if (!Read255UShort(&glyph_stream, &instruction_size)) { + return FONT_COMPRESSION_FAILURE(); + } + if (instruction_size + 2 > glyf_dst_size - glyph_size) { + return FONT_COMPRESSION_FAILURE(); + } + Store16(glyf_dst, glyph_size, instruction_size); + if (!instruction_stream.Read(glyf_dst + glyph_size + 2, + instruction_size)) { + return FONT_COMPRESSION_FAILURE(); + } + glyph_size += instruction_size + 2; + } + } else if (n_contours > 0) { + // simple glyph + n_points_vec.clear(); + points.clear(); + unsigned int total_n_points = 0; + unsigned int n_points_contour; + for (unsigned int j = 0; j < n_contours; ++j) { + if (!Read255UShort(&n_points_stream, &n_points_contour)) { + return FONT_COMPRESSION_FAILURE(); + } + n_points_vec.push_back(n_points_contour); + if (total_n_points + n_points_contour < total_n_points) { + return FONT_COMPRESSION_FAILURE(); + } + total_n_points += n_points_contour; + } + unsigned int flag_size = total_n_points; + if (flag_size > flag_stream.length() - flag_stream.offset()) { + return FONT_COMPRESSION_FAILURE(); + } + const uint8_t* flags_buf = flag_stream.buffer() + flag_stream.offset(); + const uint8_t* triplet_buf = glyph_stream.buffer() + + glyph_stream.offset(); + size_t triplet_size = glyph_stream.length() - glyph_stream.offset(); + size_t triplet_bytes_consumed = 0; + if (!TripletDecode(flags_buf, triplet_buf, triplet_size, total_n_points, + &points, &triplet_bytes_consumed)) { + return FONT_COMPRESSION_FAILURE(); + } + const uint32_t header_and_endpts_contours_size = + kEndPtsOfContoursOffset + 2 * n_contours; + if (glyf_dst_size < header_and_endpts_contours_size) { + return FONT_COMPRESSION_FAILURE(); + } + Store16(glyf_dst, 0, n_contours); + ComputeBbox(points, glyf_dst); + size_t offset = kEndPtsOfContoursOffset; + int end_point = -1; + for (unsigned int contour_ix = 0; contour_ix < n_contours; ++contour_ix) { + end_point += n_points_vec[contour_ix]; + if (end_point >= 65536) { + return FONT_COMPRESSION_FAILURE(); + } + offset = Store16(glyf_dst, offset, end_point); + } + if (!flag_stream.Skip(flag_size)) { + return FONT_COMPRESSION_FAILURE(); + } + if (!glyph_stream.Skip(triplet_bytes_consumed)) { + return FONT_COMPRESSION_FAILURE(); + } + unsigned int instruction_size; + if (!Read255UShort(&glyph_stream, &instruction_size)) { + return FONT_COMPRESSION_FAILURE(); + } + if (glyf_dst_size - header_and_endpts_contours_size < + instruction_size + 2) { + return FONT_COMPRESSION_FAILURE(); + } + uint8_t* instruction_dst = glyf_dst + header_and_endpts_contours_size; + Store16(instruction_dst, 0, instruction_size); + if (!instruction_stream.Read(instruction_dst + 2, instruction_size)) { + return FONT_COMPRESSION_FAILURE(); + } + if (!StorePoints(points, n_contours, instruction_size, + glyf_dst, glyf_dst_size, &glyph_size)) { + return FONT_COMPRESSION_FAILURE(); + } + } else { + glyph_size = 0; + } + loca_values[i] = loca_offset; + if (glyph_size + 3 < glyph_size) { + return FONT_COMPRESSION_FAILURE(); + } + glyph_size = Round4(glyph_size); + if (glyph_size > dst_size - loca_offset) { + // This shouldn't happen, but this test defensively maintains the + // invariant that loca_offset <= dst_size. + return FONT_COMPRESSION_FAILURE(); + } + loca_offset += glyph_size; + } + loca_values[num_glyphs] = loca_offset; + if (!ProcessBboxStream(&bbox_stream, num_glyphs, loca_values, + dst, dst_size)) { + return FONT_COMPRESSION_FAILURE(); + } + return StoreLoca(loca_values, index_format, loca_buf, loca_size); +} + +// This is linear search, but could be changed to binary because we +// do have a guarantee that the tables are sorted by tag. But the total +// cpu time is expected to be very small in any case. +const Table* FindTable(const std::vector& tables, uint32_t tag) { + size_t n_tables = tables.size(); + for (size_t i = 0; i < n_tables; ++i) { + if (tables[i].tag == tag) { + return &tables[i]; + } + } + return NULL; +} + +bool ReconstructTransformedGlyf(const uint8_t* transformed_buf, + size_t transformed_size, const Table* glyf_table, const Table* loca_table, + uint8_t* dst, size_t dst_length) { + if (glyf_table == NULL || loca_table == NULL) { + return FONT_COMPRESSION_FAILURE(); + } + if (static_cast(glyf_table->dst_offset + glyf_table->dst_length) > + dst_length) { + return FONT_COMPRESSION_FAILURE(); + } + if (static_cast(loca_table->dst_offset + loca_table->dst_length) > + dst_length) { + return FONT_COMPRESSION_FAILURE(); + } + return ReconstructGlyf(transformed_buf, transformed_size, + dst + glyf_table->dst_offset, glyf_table->dst_length, + dst + loca_table->dst_offset, loca_table->dst_length); +} + +bool ReconstructTransformed(const std::vector
& tables, uint32_t tag, + const uint8_t* transformed_buf, size_t transformed_size, + uint8_t* dst, size_t dst_length) { + if (tag == kGlyfTableTag) { + const Table* glyf_table = FindTable(tables, tag); + const Table* loca_table = FindTable(tables, kLocaTableTag); + return ReconstructTransformedGlyf(transformed_buf, transformed_size, + glyf_table, loca_table, dst, dst_length); + } else if (tag == kLocaTableTag) { + // processing was already done by glyf table, but validate + if (!FindTable(tables, kGlyfTableTag)) { + return FONT_COMPRESSION_FAILURE(); + } + } else { + // transform for the tag is not known + return FONT_COMPRESSION_FAILURE(); + } + return true; +} + +uint32_t ComputeChecksum(const Table* table, const uint8_t* dst) { + return ComputeULongSum(dst + table->dst_offset, table->dst_length); +} + +const Table* FindTable(TtcFont ttc_font, const std::vector
& tables, + uint32_t tag) { + for (const auto i : ttc_font.table_indices) { + if (tables[i].tag == tag) return &tables[i]; + } + return NULL; +} + +bool FixCollectionChecksums(size_t header_version, + const std::vector
& tables, const std::vector& ttc_fonts, + uint8_t* dst) { + size_t offset = CollectionHeaderSize(header_version, ttc_fonts.size()); + + for (const auto& ttc_font : ttc_fonts) { + offset += 12; // move to start of Offset Table + const std::vector& table_indices = ttc_font.table_indices; + + const Table* head_table = FindTable(ttc_font, tables, kHeadTableTag); + if (head_table == NULL || + head_table->dst_length < kCheckSumAdjustmentOffset + 4) { + return FONT_COMPRESSION_FAILURE(); + } + + size_t first_table_offset = std::numeric_limits::max(); + for (const auto index : table_indices) { + const auto& table = tables[index]; + if (table.dst_offset < first_table_offset) { + first_table_offset = table.dst_offset; + } + } + + size_t adjustment_offset = head_table->dst_offset + + kCheckSumAdjustmentOffset; + StoreU32(dst, adjustment_offset, 0); + + uint32_t file_checksum = 0; + // compute each tables checksum + for (auto i = 0; i < table_indices.size(); i++) { + const Table& table = tables[table_indices[i]]; + uint32_t table_checksum = ComputeChecksum(&table, dst); + size_t checksum_offset = offset + 4; // skip past tag to checkSum + + // write the checksum for the Table Record + StoreU32(dst, checksum_offset, table_checksum); + file_checksum += table_checksum; + // next Table Record + offset += 16; + } + + size_t header_size = kSfntHeaderSize + + kSfntEntrySize * table_indices.size(); + uint32_t header_checksum = ComputeULongSum(dst + ttc_font.dst_offset, + header_size); + + file_checksum += header_checksum; + uint32_t checksum_adjustment = 0xb1b0afba - file_checksum; + StoreU32(dst, adjustment_offset, checksum_adjustment); + } + + return true; +} + +bool FixChecksums(const std::vector
& tables, uint8_t* dst) { + const Table* head_table = FindTable(tables, kHeadTableTag); + if (head_table == NULL || + head_table->dst_length < kCheckSumAdjustmentOffset + 4) { + return FONT_COMPRESSION_FAILURE(); + } + size_t adjustment_offset = head_table->dst_offset + kCheckSumAdjustmentOffset; + StoreU32(dst, adjustment_offset, 0); + size_t n_tables = tables.size(); + uint32_t file_checksum = 0; + for (size_t i = 0; i < n_tables; ++i) { + uint32_t checksum = ComputeChecksum(&tables[i], dst); + StoreU32(dst, kSfntHeaderSize + i * kSfntEntrySize + 4, checksum); + file_checksum += checksum; + } + file_checksum += ComputeULongSum(dst, + kSfntHeaderSize + kSfntEntrySize * n_tables); + uint32_t checksum_adjustment = 0xb1b0afba - file_checksum; + StoreU32(dst, adjustment_offset, checksum_adjustment); + return true; +} + +bool Woff2Uncompress(uint8_t* dst_buf, size_t dst_size, + const uint8_t* src_buf, size_t src_size) { + size_t uncompressed_size = dst_size; + int ok = BrotliDecompressBuffer(src_size, src_buf, + &uncompressed_size, dst_buf); + if (!ok || uncompressed_size != dst_size) { + return FONT_COMPRESSION_FAILURE(); + } + return true; +} + +bool ReadTableDirectory(Buffer* file, std::vector
* tables, + size_t num_tables) { + for (size_t i = 0; i < num_tables; ++i) { + Table* table = &(*tables)[i]; + uint8_t flag_byte; + if (!file->ReadU8(&flag_byte)) { + return FONT_COMPRESSION_FAILURE(); + } + uint32_t tag; + if ((flag_byte & 0x3f) == 0x3f) { + if (!file->ReadU32(&tag)) { + return FONT_COMPRESSION_FAILURE(); + } + } else { + tag = kKnownTags[flag_byte & 0x3f]; + } + // Bits 6 and 7 are reserved and must be 0. + if ((flag_byte & 0xC0) != 0) { + return FONT_COMPRESSION_FAILURE(); + } + uint32_t flags = 0; + if (i > 0) { + flags |= kWoff2FlagsContinueStream; + } + // Always transform the glyf and loca tables + if (tag == kGlyfTableTag || tag == kLocaTableTag) { + flags |= kWoff2FlagsTransform; + } + uint32_t dst_length; + if (!ReadBase128(file, &dst_length)) { + return FONT_COMPRESSION_FAILURE(); + } + uint32_t transform_length = dst_length; + if ((flags & kWoff2FlagsTransform) != 0) { + if (!ReadBase128(file, &transform_length)) { + return FONT_COMPRESSION_FAILURE(); + } + if (tag == kLocaTableTag && transform_length) { + return FONT_COMPRESSION_FAILURE(); + } + } + table->tag = tag; + table->flags = flags; + table->transform_length = transform_length; + table->dst_length = dst_length; + } + return true; +} + +} // namespace + +size_t ComputeWOFF2FinalSize(const uint8_t* data, size_t length) { + Buffer file(data, length); + uint32_t total_length; + + if (!file.Skip(16) || + !file.ReadU32(&total_length)) { + return 0; + } + return total_length; +} + +// Writes a single Offset Table entry +size_t StoreOffsetTable(uint8_t* result, size_t offset, uint32_t flavor, + uint16_t num_tables) { + offset = StoreU32(result, offset, flavor); // sfnt version + offset = Store16(result, offset, num_tables); // num_tables + unsigned max_pow2 = 0; + while (1u << (max_pow2 + 1) <= num_tables) { + max_pow2++; + } + const uint16_t output_search_range = (1u << max_pow2) << 4; + offset = Store16(result, offset, output_search_range); // searchRange + offset = Store16(result, offset, max_pow2); // entrySelector + // rangeShift + offset = Store16(result, offset, (num_tables << 4) - output_search_range); + return offset; +} + +size_t StoreTableEntry(uint8_t* result, const Table& table, size_t offset) { + offset = StoreU32(result, offset, table.tag); + offset = StoreU32(result, offset, 0); // checksum, to fill in later + offset = StoreU32(result, offset, table.dst_offset); + offset = StoreU32(result, offset, table.dst_length); + return offset; +} + +// First table goes after all the headers, table directory, etc +uint64_t ComputeOffsetToFirstTable(const uint32_t header_version, + const uint16_t num_tables, + const std::vector& ttc_fonts) { + uint64_t offset = kSfntHeaderSize + + kSfntEntrySize * static_cast(num_tables); + if (header_version) { + offset = CollectionHeaderSize(header_version, ttc_fonts.size()) + + kSfntHeaderSize * ttc_fonts.size(); + for (const auto& ttc_font : ttc_fonts) { + offset += + kSfntEntrySize * ttc_font.table_indices.size(); + } + } + return offset; +} + +bool ConvertWOFF2ToTTF(uint8_t* result, size_t result_length, + const uint8_t* data, size_t length) { + Buffer file(data, length); + + uint32_t signature; + uint32_t flavor; + if (!file.ReadU32(&signature) || signature != kWoff2Signature || + !file.ReadU32(&flavor)) { + return FONT_COMPRESSION_FAILURE(); + } + + // TODO(user): Should call IsValidVersionTag() here. + + uint32_t reported_length; + if (!file.ReadU32(&reported_length) || length != reported_length) { + return FONT_COMPRESSION_FAILURE(); + } + uint16_t num_tables; + if (!file.ReadU16(&num_tables) || !num_tables) { + return FONT_COMPRESSION_FAILURE(); + } + // We don't care about these fields of the header: + // uint16_t reserved + // uint32_t total_sfnt_size, the caller already passes it as result_length + if (!file.Skip(6)) { + return FONT_COMPRESSION_FAILURE(); + } + uint32_t compressed_length; + if (!file.ReadU32(&compressed_length)) { + return FONT_COMPRESSION_FAILURE(); + } + // We don't care about these fields of the header: + // uint16_t major_version, minor_version + if (!file.Skip(2 * 2)) { + return FONT_COMPRESSION_FAILURE(); + } + uint32_t meta_offset; + uint32_t meta_length; + uint32_t meta_length_orig; + if (!file.ReadU32(&meta_offset) || + !file.ReadU32(&meta_length) || + !file.ReadU32(&meta_length_orig)) { + return FONT_COMPRESSION_FAILURE(); + } + if (meta_offset) { + if (meta_offset >= length || length - meta_offset < meta_length) { + return FONT_COMPRESSION_FAILURE(); + } + } + uint32_t priv_offset; + uint32_t priv_length; + if (!file.ReadU32(&priv_offset) || + !file.ReadU32(&priv_length)) { + return FONT_COMPRESSION_FAILURE(); + } + if (priv_offset) { + if (priv_offset >= length || length - priv_offset < priv_length) { + return FONT_COMPRESSION_FAILURE(); + } + } + std::vector
tables(num_tables); + if (!ReadTableDirectory(&file, &tables, num_tables)) { + return FONT_COMPRESSION_FAILURE(); + } + + uint32_t header_version = 0; + // for each font in a ttc, metadata to use when rebuilding + std::vector ttc_fonts; + std::map loca_by_glyf; + + if (flavor == kTtcFontFlavor) { + if (!file.ReadU32(&header_version)) { + return FONT_COMPRESSION_FAILURE(); + } + uint32_t num_fonts; + if (!Read255UShort(&file, &num_fonts) || !num_fonts) { + return FONT_COMPRESSION_FAILURE(); + } + ttc_fonts.resize(num_fonts); + + for (auto i = 0; i < num_fonts; i++) { + TtcFont& ttc_font = ttc_fonts[i]; + uint32_t num_tables; + if (!Read255UShort(&file, &num_tables) || !num_tables) { + return FONT_COMPRESSION_FAILURE(); + } + if (!file.ReadU32(&ttc_font.flavor)) { + return FONT_COMPRESSION_FAILURE(); + } + + ttc_font.table_indices.resize(num_tables); + + const Table* glyf_table = NULL; + const Table* loca_table = NULL; + uint16_t glyf_idx; + uint16_t loca_idx; + + for (auto j = 0; j < num_tables; j++) { + unsigned int table_idx; + if (!Read255UShort(&file, &table_idx)) { + return FONT_COMPRESSION_FAILURE(); + } + ttc_font.table_indices[j] = table_idx; + + const Table& table = tables[table_idx]; + if (table.tag == kLocaTableTag) { + loca_table = &table; + loca_idx = table_idx; + } + if (table.tag == kGlyfTableTag) { + glyf_table = &table; + glyf_idx = table_idx; + } + + } + + if ((glyf_table == NULL) != (loca_table == NULL)) { + fprintf(stderr, "Cannot have just one of glyf/loca\n"); + return FONT_COMPRESSION_FAILURE(); + } + + if (glyf_table != NULL && loca_table != NULL) { + loca_by_glyf[glyf_table] = loca_table; + } + } + } + + const uint64_t first_table_offset = + ComputeOffsetToFirstTable(header_version, num_tables, ttc_fonts); + + if (first_table_offset > result_length) { + return FONT_COMPRESSION_FAILURE(); + } + + uint64_t src_offset = file.offset(); + uint64_t dst_offset = first_table_offset; + + + uint64_t uncompressed_sum = 0; + for (uint16_t i = 0; i < num_tables; ++i) { + Table* table = &tables[i]; + table->src_offset = src_offset; + table->src_length = (i == 0 ? compressed_length : 0); + src_offset += table->src_length; + if (src_offset > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + src_offset = Round4(src_offset); + table->dst_offset = dst_offset; + dst_offset += table->dst_length; + if (dst_offset > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + dst_offset = Round4(dst_offset); + + uncompressed_sum += table->src_length; + if (uncompressed_sum > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + } + // Enforce same 30M limit on uncompressed tables as OTS + if (uncompressed_sum > 30 * 1024 * 1024) { + return FONT_COMPRESSION_FAILURE(); + } + if (src_offset > length || dst_offset != result_length) { + fprintf(stderr, "offset fail; src_offset %lu length %lu " + "dst_offset %lu result_length %lu\n", + src_offset, length, dst_offset, result_length); + return FONT_COMPRESSION_FAILURE(); + } + + // Re-order tables in output (OTSpec) order + if (header_version) { + // collection; we have to sort the table offset vector in each font + for (auto& ttc_font : ttc_fonts) { + std::map sorted_index_by_tag; + for (auto table_index : ttc_font.table_indices) { + sorted_index_by_tag[tables[table_index].tag] = table_index; + } + uint16_t index = 0; + for (auto& i : sorted_index_by_tag) { + ttc_font.table_indices[index++] = i.second; + } + } + } else { + // non-collection; we can just sort the tables + std::sort(tables.begin(), tables.end()); + } + + if (meta_offset) { + if (src_offset != meta_offset) { + return FONT_COMPRESSION_FAILURE(); + } + src_offset = Round4(meta_offset + meta_length); + if (src_offset > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + } + + if (priv_offset) { + if (src_offset != priv_offset) { + return FONT_COMPRESSION_FAILURE(); + } + src_offset = Round4(priv_offset + priv_length); + if (src_offset > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + } + + if (src_offset != Round4(length)) { + return FONT_COMPRESSION_FAILURE(); + } + + // Start building the font + size_t offset = 0; + size_t offset_table = 0; + if (header_version) { + // TTC header + offset = StoreU32(result, offset, flavor); // TAG TTCTag + offset = StoreU32(result, offset, header_version); // FIXED Version + offset = StoreU32(result, offset, ttc_fonts.size()); // ULONG numFonts + // Space for ULONG OffsetTable[numFonts] (zeroed initially) + offset_table = offset; // keep start of offset table for later + for (int i = 0; i < ttc_fonts.size(); i++) { + offset = StoreU32(result, offset, 0); // will fill real values in later + } + // space for DSIG fields for header v2 + if (header_version == 0x00020000) { + offset = StoreU32(result, offset, 0); // ULONG ulDsigTag + offset = StoreU32(result, offset, 0); // ULONG ulDsigLength + offset = StoreU32(result, offset, 0); // ULONG ulDsigOffset + } + + // write Offset Tables and store the location of each in TTC Header + for (auto& ttc_font : ttc_fonts) { + // write Offset Table location into TTC Header + offset_table = StoreU32(result, offset_table, offset); + + // write the actual offset table so our header doesn't lie + ttc_font.dst_offset = offset; + offset = StoreOffsetTable(result, offset, ttc_font.flavor, + ttc_font.table_indices.size()); + + // write table entries + for (const auto table_index : ttc_font.table_indices) { + offset = StoreTableEntry(result, tables[table_index], offset); + } + } + } else { + offset = StoreOffsetTable(result, offset, flavor, num_tables); + for (uint16_t i = 0; i < num_tables; ++i) { + offset = StoreTableEntry(result, tables[i], offset); + } + } + + std::vector uncompressed_buf; + bool continue_valid = false; + const uint8_t* transform_buf = NULL; + for (uint16_t i = 0; i < num_tables; ++i) { + const Table* table = &tables[i]; + uint32_t flags = table->flags; + const uint8_t* src_buf = data + table->src_offset; + size_t transform_length = table->transform_length; + if ((flags & kWoff2FlagsContinueStream) != 0) { + if (!continue_valid) { + return FONT_COMPRESSION_FAILURE(); + } + } else if ((flags & kWoff2FlagsContinueStream) == 0) { + uint64_t total_size = transform_length; + for (uint16_t j = i + 1; j < num_tables; ++j) { + if ((tables[j].flags & kWoff2FlagsContinueStream) == 0) { + break; + } + total_size += tables[j].transform_length; + if (total_size > std::numeric_limits::max()) { + return FONT_COMPRESSION_FAILURE(); + } + } + uncompressed_buf.resize(total_size); + if (!Woff2Uncompress(&uncompressed_buf[0], total_size, + src_buf, compressed_length)) { + return FONT_COMPRESSION_FAILURE(); + } + transform_buf = &uncompressed_buf[0]; + continue_valid = true; + } else { + return FONT_COMPRESSION_FAILURE(); + } + + if ((flags & kWoff2FlagsTransform) == 0) { + if (transform_length != table->dst_length) { + return FONT_COMPRESSION_FAILURE(); + } + if (static_cast(table->dst_offset + transform_length) > + result_length) { + return FONT_COMPRESSION_FAILURE(); + } + + std::memcpy(result + table->dst_offset, transform_buf, + transform_length); + } else { + if (header_version) { + if (table->tag == kGlyfTableTag) { + const Table* loca_table = loca_by_glyf[table]; + if (!ReconstructTransformedGlyf(transform_buf, transform_length, + table, loca_table, result, result_length)) { + return FONT_COMPRESSION_FAILURE(); + } + } else if (table->tag != kLocaTableTag) { + // transform for this tag not known + return FONT_COMPRESSION_FAILURE(); + } + } else { + if (!ReconstructTransformed(tables, table->tag, + transform_buf, transform_length, result, result_length)) { + return FONT_COMPRESSION_FAILURE(); + } + } + } + if (continue_valid) { + transform_buf += transform_length; + if (transform_buf > &uncompressed_buf[0] + uncompressed_buf.size()) { + return FONT_COMPRESSION_FAILURE(); + } + } + } + + if (header_version) { + if (!FixCollectionChecksums(header_version, tables, ttc_fonts, result)) { + return FONT_COMPRESSION_FAILURE(); + } + } else { + if (!FixChecksums(tables, result)) { + return FONT_COMPRESSION_FAILURE(); + } + } + + return true; +} + +} // namespace woff2 diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_dec.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_dec.h new file mode 100644 index 0000000..74ba7f5 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_dec.h @@ -0,0 +1,36 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Library for converting WOFF2 format font files to their TTF versions. + +#ifndef WOFF2_WOFF2_DEC_H_ +#define WOFF2_WOFF2_DEC_H_ + +#include +#include + +namespace woff2 { + +// Compute the size of the final uncompressed font, or 0 on error. +size_t ComputeWOFF2FinalSize(const uint8_t *data, size_t length); + +// Decompresses the font into the target buffer. The result_length should +// be the same as determined by ComputeFinalSize(). Returns true on successful +// decompression. +bool ConvertWOFF2ToTTF(uint8_t *result, size_t result_length, + const uint8_t *data, size_t length); + +} // namespace woff2 + +#endif // WOFF2_WOFF2_DEC_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_enc.cc b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_enc.cc new file mode 100644 index 0000000..f461189 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_enc.cc @@ -0,0 +1,443 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Library for converting TTF format font files to their WOFF2 versions. + +#include "./woff2_enc.h" + +#include +#include +#include +#include +#include +#include + +#include "./buffer.h" +#include "./../enc/encode.h" +#include "./font.h" +#include "./normalize.h" +#include "./round.h" +#include "./store_bytes.h" +#include "./table_tags.h" +#include "./transform.h" +#include "./variable_length.h" +#include "./woff2_common.h" + +namespace woff2 { + +namespace { + +using std::string; +using std::vector; + + +const size_t kWoff2HeaderSize = 48; +const size_t kWoff2EntrySize = 20; + +bool Compress(const uint8_t* data, const size_t len, + uint8_t* result, uint32_t* result_len, + brotli::BrotliParams::Mode mode) { + size_t compressed_len = *result_len; + brotli::BrotliParams params; + params.mode = mode; + if (brotli::BrotliCompressBuffer(params, len, data, &compressed_len, result) + == 0) { + return false; + } + *result_len = compressed_len; + return true; +} + +bool Woff2Compress(const uint8_t* data, const size_t len, + uint8_t* result, uint32_t* result_len) { + return Compress(data, len, result, result_len, + brotli::BrotliParams::MODE_FONT); +} + +bool TextCompress(const uint8_t* data, const size_t len, + uint8_t* result, uint32_t* result_len) { + return Compress(data, len, result, result_len, + brotli::BrotliParams::MODE_TEXT); +} + +int KnownTableIndex(uint32_t tag) { + for (int i = 0; i < 63; ++i) { + if (tag == kKnownTags[i]) return i; + } + return 63; +} + +void StoreTableEntry(const Table& table, size_t* offset, uint8_t* dst) { + uint8_t flag_byte = KnownTableIndex(table.tag); + dst[(*offset)++] = flag_byte; + // The index here is treated as a set of flag bytes because + // bits 6 and 7 of the byte are reserved for future use as flags. + // 0x3f or 63 means an arbitrary table tag. + if ((flag_byte & 0x3f) == 0x3f) { + StoreU32(table.tag, offset, dst); + } + StoreBase128(table.src_length, offset, dst); + if ((table.flags & kWoff2FlagsTransform) != 0) { + StoreBase128(table.transform_length, offset, dst); + } +} + +size_t TableEntrySize(const Table& table) { + uint8_t flag_byte = KnownTableIndex(table.tag); + size_t size = ((flag_byte & 0x3f) != 0x3f) ? 1 : 5; + size += Base128Size(table.src_length); + if ((table.flags & kWoff2FlagsTransform) != 0) { + size += Base128Size(table.transform_length); + } + return size; +} + +size_t ComputeWoff2Length(const FontCollection& font_collection, + const std::vector
& tables, + std::map index_by_offset, + size_t extended_metadata_length) { + size_t size = kWoff2HeaderSize; + + for (const auto& table : tables) { + size += TableEntrySize(table); + } + + // for collections only, collection tables + if (font_collection.fonts.size() > 1) { + size += 4; // UInt32 Version of TTC Header + size += Size255UShort(font_collection.fonts.size()); // 255UInt16 numFonts + + size += 4 * font_collection.fonts.size(); // UInt32 flavor for each + + for (const auto& font : font_collection.fonts) { + size += Size255UShort(font.tables.size()); // 255UInt16 numTables + for (const auto& entry : font.tables) { + const Font::Table& table = entry.second; + // no collection entry for xform table + if (table.tag & 0x80808080) continue; + + uint16_t table_index = index_by_offset[table.offset]; + size += Size255UShort(table_index); // 255UInt16 index entry + } + } + } + + // compressed data + for (const auto& table : tables) { + size += table.dst_length; + size = Round4(size); + } + + size += extended_metadata_length; + return size; +} + +size_t ComputeTTFLength(const std::vector
& tables) { + size_t size = 12 + 16 * tables.size(); // sfnt header + for (const auto& table : tables) { + size += Round4(table.src_length); + } + return size; +} + +size_t ComputeUncompressedLength(const Font& font) { + // sfnt header + offset table + size_t size = 12 + 16 * font.num_tables; + for (const auto& entry : font.tables) { + const Font::Table& table = entry.second; + if (table.tag & 0x80808080) continue; // xform tables don't stay + if (table.IsReused()) continue; // don't have to pay twice + size += Round4(table.length); + } + return size; +} + +size_t ComputeUncompressedLength(const FontCollection& font_collection) { + if (font_collection.fonts.size() == 1) { + return ComputeUncompressedLength(font_collection.fonts[0]); + } + size_t size = CollectionHeaderSize(font_collection.header_version, + font_collection.fonts.size()); + for (const auto& font : font_collection.fonts) { + size += ComputeUncompressedLength(font); + } + return size; +} + +size_t ComputeTotalTransformLength(const Font& font) { + size_t total = 0; + for (const auto& i : font.tables) { + const Font::Table& table = i.second; + if (table.IsReused()) { + continue; + } + if (table.tag & 0x80808080 || !font.FindTable(table.tag ^ 0x80808080)) { + // Count transformed tables and non-transformed tables that do not have + // transformed versions. + total += table.length; + } + } + return total; +} + +} // namespace + +size_t MaxWOFF2CompressedSize(const uint8_t* data, size_t length) { + return MaxWOFF2CompressedSize(data, length, ""); +} + +size_t MaxWOFF2CompressedSize(const uint8_t* data, size_t length, + const string& extended_metadata) { + // Except for the header size, which is 32 bytes larger in woff2 format, + // all other parts should be smaller (table header in short format, + // transformations and compression). Just to be sure, we will give some + // headroom anyway. + return length + 1024 + extended_metadata.length(); +} + +uint32_t CompressedBufferSize(uint32_t original_size) { + return 1.2 * original_size + 10240; +} + +bool ConvertTTFToWOFF2(const uint8_t *data, size_t length, + uint8_t *result, size_t *result_length) { + return ConvertTTFToWOFF2(data, length, result, result_length, ""); +} + +bool TransformFontCollection(FontCollection* font_collection) { + for (auto& font : font_collection->fonts) { + if (!TransformGlyfAndLocaTables(&font)) { + fprintf(stderr, "Font transformation failed.\n"); + return false; + } + } + + return true; +} + +bool ConvertTTFToWOFF2(const uint8_t *data, size_t length, + uint8_t *result, size_t *result_length, + const string& extended_metadata) { + FontCollection font_collection; + if (!ReadFontCollection(data, length, &font_collection)) { + fprintf(stderr, "Parsing of the input font failed.\n"); + return false; + } + + if (!NormalizeFontCollection(&font_collection)) { + return false; + } + + if (!TransformFontCollection(&font_collection)) { + return false; + } + + // Although the compressed size of each table in the final woff2 file won't + // be larger than its transform_length, we have to allocate a large enough + // buffer for the compressor, since the compressor can potentially increase + // the size. If the compressor overflows this, it should return false and + // then this function will also return false. + + size_t total_transform_length = 0; + for (const auto& font : font_collection.fonts) { + total_transform_length += ComputeTotalTransformLength(font); + } + size_t compression_buffer_size = CompressedBufferSize(total_transform_length); + std::vector compression_buf(compression_buffer_size); + uint32_t total_compressed_length = compression_buffer_size; + + // Collect all transformed data into one place. + std::vector transform_buf(total_transform_length); + size_t transform_offset = 0; + for (const auto& font : font_collection.fonts) { + for (const auto& i : font.tables) { + const Font::Table* table = font.FindTable(i.second.tag ^ 0x80808080); + if (i.second.IsReused()) continue; + if (i.second.tag & 0x80808080) continue; + + if (table == NULL) table = &i.second; + StoreBytes(table->data, table->length, + &transform_offset, &transform_buf[0]); + } + } + // Compress all transformed data in one stream. + if (!Woff2Compress(transform_buf.data(), total_transform_length, + &compression_buf[0], + &total_compressed_length)) { + fprintf(stderr, "Compression of combined table failed.\n"); + return false; + } + + // Compress the extended metadata + // TODO(user): how does this apply to collections + uint32_t compressed_metadata_buf_length = + CompressedBufferSize(extended_metadata.length()); + std::vector compressed_metadata_buf(compressed_metadata_buf_length); + + if (extended_metadata.length() > 0) { + if (!TextCompress((const uint8_t*)extended_metadata.data(), + extended_metadata.length(), + compressed_metadata_buf.data(), + &compressed_metadata_buf_length)) { + fprintf(stderr, "Compression of extended metadata failed.\n"); + return false; + } + } else { + compressed_metadata_buf_length = 0; + } + + std::vector
tables; + std::map index_by_offset; + + for (const auto& font : font_collection.fonts) { + + for (const auto tag : font.OutputOrderedTags()) { + const Font::Table& src_table = font.tables.at(tag); + if (src_table.IsReused()) { + continue; + } + + if (index_by_offset.find(src_table.offset) == index_by_offset.end()) { + index_by_offset[src_table.offset] = tables.size(); + } else { + return false; + } + + Table table; + table.tag = src_table.tag; + table.flags = 0; + table.src_length = src_table.length; + table.transform_length = src_table.length; + const uint8_t* transformed_data = src_table.data; + const Font::Table* transformed_table = + font.FindTable(src_table.tag ^ 0x80808080); + if (transformed_table != NULL) { + table.flags |= kWoff2FlagsTransform; + table.transform_length = transformed_table->length; + transformed_data = transformed_table->data; + } + if (tables.empty()) { + table.dst_length = total_compressed_length; + table.dst_data = &compression_buf[0]; + } else { + table.dst_length = 0; + table.dst_data = NULL; + table.flags |= kWoff2FlagsContinueStream; + } + tables.push_back(table); + } + } + + size_t woff2_length = ComputeWoff2Length(font_collection, tables, + index_by_offset, compressed_metadata_buf_length); + if (woff2_length > *result_length) { + fprintf(stderr, "Result allocation was too small (%zd vs %zd bytes).\n", + *result_length, woff2_length); + return false; + } + *result_length = woff2_length; + + const Font& first_font = font_collection.fonts[0]; + size_t offset = 0; + + // start of woff2 header (http://www.w3.org/TR/WOFF2/#woff20Header) + StoreU32(kWoff2Signature, &offset, result); + if (font_collection.fonts.size() == 1) { + StoreU32(first_font.flavor, &offset, result); + } else { + StoreU32(kTtcFontFlavor, &offset, result); + } + StoreU32(woff2_length, &offset, result); + Store16(tables.size(), &offset, result); + Store16(0, &offset, result); // reserved + // totalSfntSize + StoreU32(ComputeUncompressedLength(font_collection), &offset, result); + StoreU32(total_compressed_length, &offset, result); // totalCompressedSize + + // TODO(user): is always taking this from the first tables head OK? + // font revision + StoreBytes(first_font.FindTable(kHeadTableTag)->data + 4, 4, &offset, result); + if (compressed_metadata_buf_length > 0) { + StoreU32(woff2_length - compressed_metadata_buf_length, + &offset, result); // metaOffset + StoreU32(compressed_metadata_buf_length, &offset, result); // metaLength + StoreU32(extended_metadata.length(), &offset, result); // metaOrigLength + } else { + StoreU32(0, &offset, result); // metaOffset + StoreU32(0, &offset, result); // metaLength + StoreU32(0, &offset, result); // metaOrigLength + } + StoreU32(0, &offset, result); // privOffset + StoreU32(0, &offset, result); // privLength + // end of woff2 header + + // table directory (http://www.w3.org/TR/WOFF2/#table_dir_format) + for (const auto& table : tables) { + StoreTableEntry(table, &offset, result); + } + + // for collections only, collection table directory + if (font_collection.fonts.size() > 1) { + StoreU32(font_collection.header_version, &offset, result); + Store255UShort(font_collection.fonts.size(), &offset, result); + for (const Font& font : font_collection.fonts) { + + uint16_t num_tables = 0; + for (const auto& entry : font.tables) { + const Font::Table& table = entry.second; + if (table.tag & 0x80808080) continue; // don't write xform tables + num_tables++; + } + Store255UShort(num_tables, &offset, result); + + StoreU32(font.flavor, &offset, result); + for (const auto& entry : font.tables) { + const Font::Table& table = entry.second; + if (table.tag & 0x80808080) continue; // don't write xform tables + + // for reused tables, only the original has an updated offset + uint32_t table_offset = + table.IsReused() ? table.reuse_of->offset : table.offset; + uint32_t table_length = + table.IsReused() ? table.reuse_of->length : table.length; + if (index_by_offset.find(table_offset) == index_by_offset.end()) { + fprintf(stderr, "Missing table index for offset 0x%08x\n", + table_offset); + return false; + } + uint16_t index = index_by_offset[table_offset]; + Store255UShort(index, &offset, result); + + } + + } + } + + // compressed data format (http://www.w3.org/TR/WOFF2/#table_format) + for (const auto& table : tables) { + StoreBytes(table.dst_data, table.dst_length, &offset, result); + offset = Round4(offset); + } + StoreBytes(compressed_metadata_buf.data(), compressed_metadata_buf_length, + &offset, result); + + if (*result_length != offset) { + fprintf(stderr, "Mismatch between computed and actual length " + "(%zd vs %zd)\n", *result_length, offset); + return false; + } + return true; +} + +} // namespace woff2 diff --git a/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_enc.h b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_enc.h new file mode 100644 index 0000000..d6eb4db --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/csrc/woff2/woff2_enc.h @@ -0,0 +1,46 @@ +// Copyright 2014 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Library for converting WOFF2 format font files to their TTF versions. + +#ifndef WOFF2_WOFF2_ENC_H_ +#define WOFF2_WOFF2_ENC_H_ + +#include +#include +#include + +using std::string; + + +namespace woff2 { + +// Returns an upper bound on the size of the compressed file. +size_t MaxWOFF2CompressedSize(const uint8_t* data, size_t length); +size_t MaxWOFF2CompressedSize(const uint8_t* data, size_t length, + const string& extended_metadata); + +// Compresses the font into the target buffer. *result_length should be at least +// the value returned by MaxWOFF2CompressedSize(), upon return, it is set to the +// actual compressed size. Returns true on successful compression. +bool ConvertTTFToWOFF2(const uint8_t *data, size_t length, + uint8_t *result, size_t *result_length); + +bool ConvertTTFToWOFF2(const uint8_t *data, size_t length, + uint8_t *result, size_t *result_length, + const string& extended_metadata); + +} // namespace woff2 + +#endif // WOFF2_WOFF2_ENC_H_ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/jssrc/index.js b/packages/字体精简工具/node_modules/ttf2woff2/jssrc/index.js new file mode 100644 index 0000000..bb97560 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/jssrc/index.js @@ -0,0 +1,33 @@ +'use strict'; + +var theTTFToWOFF2Module = require('./ttf2woff2'); + +module.exports = function ttf2woff2(inputContent) { + + // Prepare input + var inputBuffer = theTTFToWOFF2Module._malloc(inputContent.length + 1); + var outputSizePtr = theTTFToWOFF2Module._malloc(4); // eslint-disable-line + var outputBufferPtr; + var outputSize; + var outputContent; + var i; + + theTTFToWOFF2Module.writeArrayToMemory(inputContent, inputBuffer); + + // Run + outputBufferPtr = theTTFToWOFF2Module.convert( + inputBuffer, inputContent.length, outputSizePtr + ); + + // Retrieve output + outputSize = theTTFToWOFF2Module.getValue(outputSizePtr, 'i32'); + outputContent = Buffer.alloc(outputSize); + + for (i = 0; i < outputSize; i++) { + outputContent[i] = theTTFToWOFF2Module.getValue(outputBufferPtr + i, 'i8'); + } + + theTTFToWOFF2Module.freePtrs(outputBufferPtr, outputSizePtr); + + return outputContent; +}; diff --git a/packages/字体精简工具/node_modules/ttf2woff2/jssrc/post.js b/packages/字体精简工具/node_modules/ttf2woff2/jssrc/post.js new file mode 100644 index 0000000..aabad8e --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/jssrc/post.js @@ -0,0 +1,6 @@ +// This file need to be append to the build in order to work with browserify +// Shamelessly stolen here: https://github.com/fabiosantoscode/require-emscripten/blob/master/post-js.postjs +module.exports = Module; + +// Do not recurse into module and waste all day +Module.inspect = function() { return '[Module]'; }; diff --git a/packages/字体精简工具/node_modules/ttf2woff2/jssrc/ttf2woff2.js b/packages/字体精简工具/node_modules/ttf2woff2/jssrc/ttf2woff2.js new file mode 100644 index 0000000..87cec13 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/jssrc/ttf2woff2.js @@ -0,0 +1,19 @@ +var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i=TOTAL_MEMORY){var success=enlargeMemory();if(!success){DYNAMICTOP=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc((str.length<<2)+1);writeStringToMemory(str,ret)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;function UTF8ArrayToString(u8Array,idx){var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;function UTF16ToString(ptr){var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}Module["lengthBytesUTF32"]=lengthBytesUTF32;function demangle(func){var hasLibcxxabi=!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed char","h":"unsigned char","t":"unsigned short","j":"unsigned int","m":"unsigned long","x":"long long","y":"unsigned long long","z":"..."};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre="";for(var a=0;a"}else{ret=name}paramLoop:while(i0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var parsed=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}parsed=parse()}catch(e){parsed+="?"}if(parsed.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return parsed}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){if(x%4096>0){x+=4096-x%4096}return x}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function enlargeMemory(){var OLD_TOTAL_MEMORY=TOTAL_MEMORY;var LIMIT=Math.pow(2,31);if(DYNAMICTOP>=LIMIT)return false;while(TOTAL_MEMORY<=DYNAMICTOP){if(TOTAL_MEMORY=LIMIT)return false;try{if(ArrayBuffer.transfer){buffer=ArrayBuffer.transfer(buffer,TOTAL_MEMORY)}else{var oldHEAP8=HEAP8;buffer=new ArrayBuffer(TOTAL_MEMORY)}}catch(e){return false}var success=_emscripten_replace_memory(buffer);if(!success)return false;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer);if(!ArrayBuffer.transfer){HEAP8.set(oldHEAP8)}return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||536870912;var totalMemory=64*1024;while(totalMemory0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i>0]=chr;i=i+1}}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i>0]=array[i]}}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var Math_clz32=Math.clz32;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var ASM_CONSTS=[];STATIC_BASE=8;STATICTOP=STATIC_BASE+324960;__ATINIT__.push({func:(function(){__GLOBAL__sub_I_fallback_cc()})},{func:(function(){__GLOBAL__sub_I_bind_cpp()})});allocate([154,153,153,153,153,153,185,63,219,249,126,106,188,116,163,63,219,249,126,106,188,116,147,63,57,180,200,118,190,159,138,63,252,169,241,210,77,98,80,63,252,169,241,210,77,98,80,63,252,169,241,210,77,98,80,63,252,169,241,210,77,98,80,63,51,51,51,51,51,51,227,191,102,102,102,102,102,102,238,63,184,30,133,235,81,184,242,63,82,184,30,133,235,81,244,63,195,245,40,92,143,194,237,63,195,245,40,92,143,194,237,63,184,30,133,235,81,184,238,63,184,30,133,235,81,184,238,63,174,71,225,122,20,174,239,63,174,71,225,122,20,174,239,63,205,204,204,204,204,204,240,63,205,204,204,204,204,204,240,63,102,102,102,102,102,102,242,63,102,102,102,102,102,102,242,63,0,0,0,0,0,0,244,63,0,0,0,0,0,0,244,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,20,0,0,138,222,4,0,248,0,0,0,0,0,0,0,124,20,0,0,162,222,4,0,0,1,0,0,0,0,0,0,84,20,0,0,204,222,4,0,84,20,0,0,185,222,4,0,164,20,0,0,40,228,4,0,0,0,0,0,1,0,0,0,184,1,0,0,0,0,0,0,164,20,0,0,233,227,4,0,0,0,0,0,1,0,0,0,184,1,0,0,0,0,0,0,164,20,0,0,132,227,4,0,0,0,0,0,1,0,0,0,184,1,0,0,0,0,0,0,84,20,0,0,113,227,4,0,84,20,0,0,82,227,4,0,84,20,0,0,51,227,4,0,84,20,0,0,20,227,4,0,84,20,0,0,245,226,4,0,84,20,0,0,214,226,4,0,84,20,0,0,183,226,4,0,84,20,0,0,152,226,4,0,84,20,0,0,121,226,4,0,84,20,0,0,90,226,4,0,84,20,0,0,59,226,4,0,84,20,0,0,28,226,4,0,84,20,0,0,253,225,4,0,84,20,0,0,195,227,4,0,124,20,0,0,103,228,4,0,208,1,0,0,0,0,0,0,84,20,0,0,116,228,4,0,124,20,0,0,129,228,4,0,208,1,0,0,0,0,0,0,124,20,0,0,145,228,4,0,216,1,0,0,0,0,0,0,84,20,0,0,162,228,4,0,124,20,0,0,175,228,4,0,248,1,0,0,0,0,0,0,124,20,0,0,208,228,4,0,0,2,0,0,0,0,0,0,124,20,0,0,242,228,4,0,0,2,0,0,0,0,0,0,56,20,0,0,26,229,4,0,56,20,0,0,28,229,4,0,56,20,0,0,30,229,4,0,56,20,0,0,32,229,4,0,56,20,0,0,34,229,4,0,56,20,0,0,36,229,4,0,56,20,0,0,38,229,4,0,56,20,0,0,40,229,4,0,56,20,0,0,42,229,4,0,56,20,0,0,44,229,4,0,56,20,0,0,46,229,4,0,56,20,0,0,48,229,4,0,56,20,0,0,50,229,4,0,124,20,0,0,52,229,4,0,16,2,0,0,0,0,0,0,124,20,0,0,89,229,4,0,16,2,0,0,0,0,0,0,104,2,0,0,104,2,0,0,104,2,0,0,104,2,0,0,104,2,0,0,48,2,0,0,104,2,0,0,104,2,0,0,112,97,109,99,100,97,101,104,97,101,104,104,120,116,109,104,112,120,97,109,101,109,97,110,50,47,83,79,116,115,111,112,32,116,118,99,109,103,112,102,102,121,108,103,97,99,111,108,112,101,114,112,32,70,70,67,71,82,79,86,84,68,66,69,67,76,66,69,112,115,97,103,120,109,100,104,110,114,101,107,72,83,84,76,84,76,67,80,88,77,68,86,97,101,104,118,120,116,109,118,69,83,65,66,70,69,68,71,83,79,80,71,66,85,83,71,67,83,66,69,70,84,83,74,72,84,65,77,84,68,66,67,67,76,66,67,82,76,79,67,76,65,80,67,32,71,86,83,120,105,98,115,116,110,99,97,114,97,118,97,116,97,100,98,99,111,108,98,110,108,115,98,114,97,118,99,99,115,100,102,116,97,101,102,120,116,109,102,114,97,118,102,114,97,118,103,121,116,115,104,116,115,117,106,114,97,99,108,116,114,111,109,120,114,111,109,100,98,112,111,112,111,114,112,107,97,114,116,102,112,97,90,102,108,105,83,116,97,108,71,99,111,108,71,116,97,101,70,108,108,105,83,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,254,255,255,255,2,0,0,0,253,255,255,255,3,0,0,0,255,255,255,255,1,0,0,0,254,255,255,255,2,0,0,0,253,255,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,24,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,12,0,0,0,14,0,0,0,18,0,0,0,22,0,0,0,30,0,0,0,38,0,0,0,54,0,0,0,70,0,0,0,102,0,0,0,134,0,0,0,198,0,0,0,70,1,0,0,70,2,0,0,70,4,0,0,70,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,1,0,0,0,2,0,0,0,5,0,0,0,2,0,0,0,9,0,0,0,2,0,0,0,13,0,0,0,2,0,0,0,17,0,0,0,3,0,0,0,25,0,0,0,3,0,0,0,33,0,0,0,3,0,0,0,41,0,0,0,3,0,0,0,49,0,0,0,4,0,0,0,65,0,0,0,4,0,0,0,81,0,0,0,4,0,0,0,97,0,0,0,4,0,0,0,113,0,0,0,5,0,0,0,145,0,0,0,5,0,0,0,177,0,0,0,5,0,0,0,209,0,0,0,5,0,0,0,241,0,0,0,6,0,0,0,49,1,0,0,6,0,0,0,113,1,0,0,7,0,0,0,241,1,0,0,8,0,0,0,241,2,0,0,9,0,0,0,241,4,0,0,10,0,0,0,241,8,0,0,11,0,0,0,241,16,0,0,12,0,0,0,241,32,0,0,13,0,0,0,241,64,0,0,24,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,12,0,0,0,14,0,0,0,24,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,8,0,0,0,10,0,0,0,14,0,0,0,18,0,0,0,26,0,0,0,34,0,0,0,50,0,0,0,66,0,0,0,98,0,0,0,130,0,0,0,194,0,0,0,66,1,0,0,66,2,0,0,66,4,0,0,66,8,0,0,66,24,0,0,66,88,0,0,2,0,0,0,3,0,0,0,6,0,0,0,4,0,0,0,5,0,0,0,8,0,0,0,7,0,0,0,9,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,11,0,0,0,11,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,9,0,0,0,9,0,0,0,8,0,0,0,7,0,0,0,7,0,0,0,8,0,0,0,7,0,0,0,7,0,0,0,6,0,0,0,6,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,36,0,0,0,84,0,0,0,140,0,0,0,172,0,0,0,208,0,0,0,248,0,0,0,36,1,0,0,84,1,0,0,110,1,0,0,138,1,0,0,153,1,0,0,161,1,0,128,169,1,0,128,187,1,0,0,197,1,0,0,207,1,0,64,212,1,0,192,217,1,0,160,220,1,0,179,218,4,0,0,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,180,218,4,0,180,218,4,0,0,0,0,0,180,218,4,0,179,218,4,0,12,0,0,0,179,218,4,0,179,218,4,0,10,0,0,0,180,218,4,0,179,218,4,0,0,0,0,0,182,218,4,0,180,218,4,0,0,0,0,0,179,218,4,0,188,218,4,0,0,0,0,0,180,218,4,0,179,218,4,0,0,0,0,0,191,218,4,0,179,218,4,0,10,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,196,218,4,0,179,218,4,0,13,0,0,0,179,218,4,0,179,218,4,0,1,0,0,0,179,218,4,0,202,218,4,0,0,0,0,0,180,218,4,0,179,218,4,0,0,0,0,0,202,218,4,0,180,218,4,0,10,0,0,0,180,218,4,0,179,218,4,0,0,0,0,0,205,218,4,0,179,218,4,0,0,0,0,0,210,218,4,0,215,218,4,0,0,0,0,0,180,218,4,0,179,218,4,0,0,0,0,0,218,218,4,0,179,218,4,0,0,0,0,0,95,245,4,0,179,218,4,0,0,0,0,0,220,218,4,0,179,218,4,0,0,0,0,0,223,218,4,0,179,218,4,0,3,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,225,218,4,0,179,218,4,0,0,0,0,0,227,218,4,0,179,218,4,0,14,0,0,0,179,218,4,0,179,218,4,0,2,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,233,218,4,0,179,218,4,0,0,0,0,0,237,218,4,0,180,218,4,0,10,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,244,218,4,0,95,245,4,0,0,0,0,0,179,218,4,0,180,218,4,0,0,0,0,0,202,218,4,0,179,218,4,0,15,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,247,218,4,0,179,218,4,0,0,0,0,0,254,218,4,0,179,218,4,0,0,0,0,0,0,219,4,0,179,218,4,0,0,0,0,0,7,219,4,0,179,218,4,0,16,0,0,0,179,218,4,0,179,218,4,0,17,0,0,0,179,218,4,0,182,218,4,0,0,0,0,0,179,218,4,0,179,218,4,0,4,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,12,219,4,0,179,218,4,0,11,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,19,219,4,0,179,218,4,0,0,0,0,0,24,219,4,0,179,218,4,0,0,0,0,0,29,219,4,0,179,218,4,0,7,0,0,0,179,218,4,0,179,218,4,0,1,0,0,0,34,219,4,0,179,218,4,0,0,0,0,0,39,219,4,0,179,218,4,0,0,0,0,0,42,219,4,0,180,218,4,0,0,0,0,0,244,218,4,0,179,218,4,0,0,0,0,0,44,219,4,0,179,218,4,0,20,0,0,0,179,218,4,0,179,218,4,0,18,0,0,0,179,218,4,0,179,218,4,0,6,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,48,219,4,0,179,218,4,0,10,0,0,0,202,218,4,0,179,218,4,0,8,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,50,219,4,0,179,218,4,0,0,0,0,0,55,219,4,0,182,218,4,0,0,0,0,0,191,218,4,0,179,218,4,0,5,0,0,0,179,218,4,0,179,218,4,0,9,0,0,0,179,218,4,0,180,218,4,0,10,0,0,0,202,218,4,0,179,218,4,0,10,0,0,0,218,218,4,0,95,245,4,0,0,0,0,0,48,219,4,0,179,218,4,0,11,0,0,0,180,218,4,0,179,218,4,0,10,0,0,0,220,218,4,0,179,218,4,0,0,0,0,0,59,219,4,0,180,218,4,0,0,0,0,0,95,245,4,0,62,219,4,0,0,0,0,0,179,218,4,0,182,218,4,0,0,0,0,0,68,219,4,0,179,218,4,0,10,0,0,0,254,218,4,0,179,218,4,0,0,0,0,0,77,219,4,0,179,218,4,0,0,0,0,0,85,219,4,0,95,245,4,0,0,0,0,0,180,218,4,0,179,218,4,0,10,0,0,0,48,219,4,0,179,218,4,0,10,0,0,0,95,245,4,0,179,218,4,0,0,0,0,0,87,219,4,0,180,218,4,0,0,0,0,0,59,219,4,0,179,218,4,0,0,0,0,0,93,219,4,0,180,218,4,0,11,0,0,0,180,218,4,0,179,218,4,0,0,0,0,0,97,219,4,0,180,218,4,0,11,0,0,0,179,218,4,0,179,218,4,0,0,0,0,0,101,219,4,0,179,218,4,0,11,0,0,0,218,218,4,0,179,218,4,0,10,0,0,0,244,218,4,0,180,218,4,0,0,0,0,0,48,219,4,0,179,218,4,0,0,0,0,0,104,219,4,0,180,218,4,0,10,0,0,0,244,218,4,0,179,218,4,0,0,0,0,0,109,219,4,0,179,218,4,0,0,0,0,0,114,219,4,0,179,218,4,0,11,0,0,0,254,218,4,0,179,218,4,0,0,0,0,0,120,219,4,0,180,218,4,0,10,0,0,0,95,245,4,0,179,218,4,0,11,0,0,0,220,218,4,0,180,218,4,0,0,0,0,0,101,219,4,0,179,218,4,0,10,0,0,0,85,219,4,0,179,218,4,0,0,0,0,0,125,219,4,0,179,218,4,0,11,0,0,0,95,245,4,0,130,219,4,0,0,0,0,0,179,218,4,0,180,218,4,0,0,0,0,0,85,219,4,0,179,218,4,0,10,0,0,0,59,219,4,0,179,218,4,0,11,0,0,0,59,219,4,0,179,218,4,0,0,0,0,0,133,219,4,0,179,218,4,0,11,0,0,0,202,218,4,0,179,218,4,0,10,0,0,0,101,219,4,0,180,218,4,0,10,0,0,0,85,219,4,0,180,218,4,0,11,0,0,0,59,219,4,0,180,218,4,0,11,0,0,0,202,218,4,0,179,218,4,0,11,0,0,0,85,219,4,0,179,218,4,0,11,0,0,0,48,219,4,0,179,218,4,0,11,0,0,0,244,218,4,0,180,218,4,0,11,0,0,0,95,245,4,0,179,218,4,0,11,0,0,0,101,219,4,0,180,218,4,0,11,0,0,0,244,218,4,0,180,218,4,0,10,0,0,0,59,219,4,0,180,218,4,0,11,0,0,0,101,219,4,0,180,218,4,0,10,0,0,0,101,219,4,0,0,0,0,0,8,0,0,0,4,0,0,0,12,0,0,0,2,0,0,0,10,0,0,0,6,0,0,0,14,0,0,0,1,0,0,0,9,0,0,0,5,0,0,0,13,0,0,0,3,0,0,0,11,0,0,0,7,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,13,224,202,63,0,0,0,64,120,154,20,64,7,112,37,64,180,171,51,64,0,0,64,64,13,224,74,64,120,154,84,64,84,103,93,64,7,112,101,64,1,212,108,64,180,171,115,64,127,10,122,64,0,0,128,64,127,204,130,64,7,112,133,64,6,239,135,64,60,77,138,64,221,141,140,64,170,179,142,64,5,193,144,64,3,184,146,64,120,154,148,64,1,106,150,64,10,40,152,64,218,213,153,64,149,116,155,64,63,5,157,64,199,136,158,64,0,0,160,64,173,107,161,64,127,204,162,64,22,35,164,64,7,112,165,64,216,179,166,64,6,239,167,64,4,34,169,64,60,77,170,64,17,113,171,64,221,141,172,64,246,163,173,64,170,179,174,64,67,189,175,64,5,193,176,64,49,191,177,64,3,184,178,64,180,171,179,64,120,154,180,64,130,132,181,64,1,106,182,64,32,75,183,64,10,40,184,64,230,0,185,64,218,213,185,64,9,167,186,64,149,116,187,64,157,62,188,64,63,5,189,64,154,200,189,64,199,136,190,64,225,69,191,64,0,0,192,64,61,183,192,64,173,107,193,64,103,29,194,64,127,204,194,64,8,121,195,64,22,35,196,64,186,202,196,64,7,112,197,64,11,19,198,64,216,179,198,64,124,82,199,64,6,239,199,64,132,137,200,64,4,34,201,64,146,184,201,64,60,77,202,64,13,224,202,64,17,113,203,64,83,0,204,64,221,141,204,64,187,25,205,64,246,163,205,64,152,44,206,64,170,179,206,64,53,57,207,64,67,189,207,64,219,63,208,64,5,193,208,64,202,64,209,64,49,191,209,64,66,60,210,64,3,184,210,64,124,50,211,64,180,171,211,64,176,35,212,64,120,154,212,64,18,16,213,64,130,132,213,64,208,247,213,64,1,106,214,64,25,219,214,64,32,75,215,64,25,186,215,64,10,40,216,64,247,148,216,64,230,0,217,64,219,107,217,64,218,213,217,64,232,62,218,64,9,167,218,64,65,14,219,64,149,116,219,64,7,218,219,64,157,62,220,64,89,162,220,64,63,5,221,64,84,103,221,64,154,200,221,64,20,41,222,64,199,136,222,64,180,231,222,64,225,69,223,64,78,163,223,64,0,0,224,64,249,91,224,64,61,183,224,64,205,17,225,64,173,107,225,64,224,196,225,64,103,29,226,64,70,117,226,64,127,204,226,64,20,35,227,64,8,121,227,64,94,206,227,64,22,35,228,64,52,119,228,64,186,202,228,64,170,29,229,64,7,112,229,64,209,193,229,64,11,19,230,64,183,99,230,64,216,179,230,64,110,3,231,64,124,82,231,64,3,161,231,64,6,239,231,64,133,60,232,64,132,137,232,64,3,214,232,64,4,34,233,64,136,109,233,64,146,184,233,64,35,3,234,64,60,77,234,64,223,150,234,64,13,224,234,64,200,40,235,64,17,113,235,64,233,184,235,64,83,0,236,64,78,71,236,64,221,141,236,64,1,212,236,64,187,25,237,64,12,95,237,64,246,163,237,64,121,232,237,64,152,44,238,64,82,112,238,64,170,179,238,64,160,246,238,64,53,57,239,64,107,123,239,64,67,189,239,64,189,254,239,64,219,63,240,64,157,128,240,64,5,193,240,64,20,1,241,64,202,64,241,64,41,128,241,64,49,191,241,64,228,253,241,64,66,60,242,64,76,122,242,64,3,184,242,64,104,245,242,64,124,50,243,64,64,111,243,64,180,171,243,64,217,231,243,64,176,35,244,64,59,95,244,64,120,154,244,64,106,213,244,64,18,16,245,64,111,74,245,64,130,132,245,64,77,190,245,64,208,247,245,64,12,49,246,64,1,106,246,64,176,162,246,64,25,219,246,64,63,19,247,64,32,75,247,64,190,130,247,64,25,186,247,64,50,241,247,64,10,40,248,64,161,94,248,64,247,148,248,64,14,203,248,64,230,0,249,64,127,54,249,64,219,107,249,64,249,160,249,64,218,213,249,64,127,10,250,64,232,62,250,64,22,115,250,64,9,167,250,64,194,218,250,64,65,14,251,64,135,65,251,64,149,116,251,64,106,167,251,64,7,218,251,64,109,12,252,64,157,62,252,64,150,112,252,64,89,162,252,64,231,211,252,64,63,5,253,64,100,54,253,64,84,103,253,64,16,152,253,64,154,200,253,64,240,248,253,64,20,41,254,64,6,89,254,64,199,136,254,64,86,184,254,64,180,231,254,64,227,22,255,64,225,69,255,64,175,116,255,64,78,163,255,64,190,209,255,64,0,0,0,0,216,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,232,0,0,0,3,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,192,1,0,0,5,0,0,0,6,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,216,1,0,0,7,0,0,0,8,0,0,0,2,0,0,0,0,0,0,0,232,1,0,0,7,0,0,0,9,0,0,0,2,0,0,0,0,0,0,0,32,2,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,3,0,0,0,0,0,0,0,16,2,0,0,10,0,0,0,14,0,0,0,12,0,0,0,13,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,152,2,0,0,10,0,0,0,15,0,0,0,12,0,0,0,13,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,168,2,0,0,10,0,0,0,16,0,0,0,12,0,0,0,13,0,0,0,4,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,206,231,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,21,0,0,120,21,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,0,75,243,4,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,67,239,4,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,5,0,0,0,7,0,0,0,11,0,0,0,13,0,0,0,17,0,0,0,19,0,0,0,23,0,0,0,29,0,0,0,31,0,0,0,37,0,0,0,41,0,0,0,43,0,0,0,47,0,0,0,53,0,0,0,59,0,0,0,61,0,0,0,67,0,0,0,71,0,0,0,73,0,0,0,79,0,0,0,83,0,0,0,89,0,0,0,97,0,0,0,101,0,0,0,103,0,0,0,107,0,0,0,109,0,0,0,113,0,0,0,127,0,0,0,131,0,0,0,137,0,0,0,139,0,0,0,149,0,0,0,151,0,0,0,157,0,0,0,163,0,0,0,167,0,0,0,173,0,0,0,179,0,0,0,181,0,0,0,191,0,0,0,193,0,0,0,197,0,0,0,199,0,0,0,211,0,0,0,1,0,0,0,11,0,0,0,13,0,0,0,17,0,0,0,19,0,0,0,23,0,0,0,29,0,0,0,31,0,0,0,37,0,0,0,41,0,0,0,43,0,0,0,47,0,0,0,53,0,0,0,59,0,0,0,61,0,0,0,67,0,0,0,71,0,0,0,73,0,0,0,79,0,0,0,83,0,0,0,89,0,0,0,97,0,0,0,101,0,0,0,103,0,0,0,107,0,0,0,109,0,0,0,113,0,0,0,121,0,0,0,127,0,0,0,131,0,0,0,137,0,0,0,139,0,0,0,143,0,0,0,149,0,0,0,151,0,0,0,157,0,0,0,163,0,0,0,167,0,0,0,169,0,0,0,173,0,0,0,179,0,0,0,181,0,0,0,187,0,0,0,191,0,0,0,193,0,0,0,197,0,0,0,199,0,0,0,209,0,0,0,72,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,158,0,0,0,0,0,0,0,0,0,0,230,178,0,0,0,0,0,0,0,0,0,0,0,0,75,17,0,0,0,0,0,0,0,0,100,19,172,26,164,30,0,0,4,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,70,101,75,0,0,0,0,0,0,132,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,104,205,8,0,0,0,0,100,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,14,0,0,0,0,0,0,0,0,200,89,0,0,0,0,0,0,0,0,0,0,0,0,38,188,0,0,199,133,0,0,0,0,0,0,0,0,0,0,102,189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,76,0,0,0,0,196,93,0,0,0,0,0,0,100,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,80,100,9,0,0,37,81,104,57,134,34,0,0,4,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,26,38,28,0,0,0,0,232,85,199,89,0,0,0,0,201,13,0,0,72,7,0,0,0,0,0,0,0,0,0,0,0,0,38,43,0,0,0,0,232,95,0,0,0,0,0,0,107,25,0,0,0,0,70,144,72,84,167,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,159,0,0,0,0,0,0,230,153,200,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,31,0,0,0,0,9,100,0,0,0,0,0,0,168,3,132,14,141,12,71,61,0,0,0,0,0,0,0,0,0,0,39,205,0,0,229,67,0,0,0,0,0,0,0,0,40,5,165,22,0,0,37,82,0,0,0,0,72,25,39,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,52,0,0,0,0,0,0,40,14,0,0,0,0,0,0,234,115,100,120,0,0,5,122,0,0,196,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,87,0,0,70,146,0,0,0,0,0,0,0,0,72,28,167,1,0,0,36,96,201,84,228,68,0,0,0,0,0,0,0,0,0,0,0,0,41,7,0,0,0,0,0,0,72,1,133,23,0,0,0,0,0,0,6,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,242,82,16,0,0,0,0,0,0,0,0,68,47,169,33,0,0,0,0,4,66,0,0,70,143,0,0,0,0,0,0,38,138,0,0,6,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,82,0,0,134,242,0,0,0,0,0,0,0,0,0,0,5,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,57,72,17,71,101,0,0,0,0,0,0,0,0,137,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,120,230,11,42,51,198,50,0,0,0,0,0,0,164,59,0,0,134,158,8,118,166,242,0,0,0,0,0,0,164,78,0,0,0,0,0,0,0,0,0,0,196,30,0,0,0,0,0,0,134,204,0,0,0,0,0,0,0,0,41,6,0,0,203,49,68,35,0,0,0,0,0,0,0,0,0,0,4,103,0,0,0,0,0,0,0,0,0,0,197,14,0,0,0,0,8,70,7,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,126,197,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,184,203,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,9,231,199,0,0,0,0,10,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,219,138,46,0,0,17,2,0,0,232,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,32,0,0,0,0,136,112,198,224,200,16,197,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,243,0,0,0,0,232,38,100,14,0,0,69,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,65,37,0,0,0,70,92,72,12,69,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,31,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,43,0,0,0,0,0,0,0,0,133,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,104,0,0,0,0,168,99,132,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,66,0,0,0,0,0,0,166,107,0,0,0,0,202,36,0,0,0,0,0,0,180,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,148,73,36,69,33,0,0,0,0,0,0,0,0,41,15,68,6,136,93,0,0,0,0,68,58,237,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,47,0,0,233,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,83,232,43,198,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,22,0,0,0,0,164,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,50,228,4,0,0,0,0,106,73,196,63,234,60,167,3,141,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,71,0,0,166,70,0,0,6,183,0,0,0,0,0,0,0,0,0,0,0,0,137,46,0,0,0,0,100,98,236,49,134,47,9,25,0,0,0,0,0,0,0,0,132,64,0,0,132,105,235,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,102,0,0,0,0,0,0,40,38,231,206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,98,68,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,127,0,0,0,0,0,0,0,0,0,0,133,85,0,0,0,0,0,0,0,0,0,0,166,127,0,0,0,0,0,0,102,3,0,0,0,0,0,0,102,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,101,232,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,7,0,0,0,0,0,0,104,34,198,42,0,0,0,0,0,0,0,0,0,0,164,113,0,0,100,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,85,0,0,0,0,0,0,198,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,20,38,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,214,72,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,201,0,0,0,0,0,0,0,0,0,0,101,14,0,0,0,0,0,0,0,0,78,39,196,36,0,0,0,0,0,0,228,122,76,22,37,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,106,134,224,0,0,0,0,0,0,0,0,0,0,0,0,172,27,0,0,232,70,68,15,0,0,0,0,0,0,0,0,235,72,0,0,0,0,101,22,0,0,0,0,0,0,0,0,0,0,68,8,0,0,166,96,0,0,7,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,4,0,0,9,19,0,0,0,0,166,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,74,0,0,0,0,133,70,0,0,0,0,0,0,166,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,69,0,0,102,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,89,7,68,168,79,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,115,0,0,38,144,0,0,0,0,0,0,164,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,162,0,0,0,0,40,121,38,216,72,39,132,7,0,0,0,0,0,0,0,0,0,0,6,143,0,0,103,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,52,167,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,103,0,0,197,100,0,0,0,0,0,0,0,0,0,0,0,0,73,54,100,6,0,0,0,0,0,0,0,0,0,0,231,19,0,0,0,0,0,0,197,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,33,0,0,0,0,0,0,0,0,41,100,132,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,52,138,68,5,19,43,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,3,71,4,0,0,165,94,0,0,0,0,72,112,39,194,0,0,37,90,0,0,0,0,0,0,0,0,136,126,0,0,0,0,0,0,0,0,164,98,0,0,68,112,234,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,30,165,34,0,0,0,0,0,0,100,54,0,0,0,0,0,0,0,0,0,0,230,163,0,0,0,0,0,0,0,0,0,0,0,0,110,26,165,54,0,0,0,0,0,0,37,33,0,0,0,0,202,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,251,0,0,196,87,0,0,5,101,0,0,0,0,0,0,0,0,104,92,197,20,0,0,0,0,0,0,0,0,0,0,0,0,169,44,228,14,137,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,101,233,40,0,0,0,0,68,56,0,0,0,0,0,0,166,74,0,0,0,0,0,0,70,200,0,0,0,0,106,41,68,94,0,0,0,0,0,0,0,0,0,0,6,171,0,0,0,0,170,69,0,0,0,0,0,0,232,99,69,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,113,0,0,0,0,0,0,0,0,0,0,114,2,196,7,108,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,174,0,0,0,0,0,0,0,0,8,15,199,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,75,36,25,0,0,0,0,136,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,155,0,0,0,0,0,0,0,0,8,121,0,0,0,0,0,0,0,0,0,0,0,0,70,110,0,0,0,0,0,0,100,113,42,41,133,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,22,72,3,133,79,0,0,0,0,40,33,6,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,15,70,76,0,0,0,0,0,0,0,0,232,14,102,249,0,0,0,0,0,0,0,0,0,0,0,0,76,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,69,0,0,0,0,0,0,0,0,0,0,0,0,198,197,0,0,71,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,99,0,0,0,0,0,0,7,54,0,0,0,0,0,0,0,0,0,0,0,0,136,10,199,15,0,0,0,0,0,0,0,0,200,98,0,0,44,47,6,8,0,0,38,191,0,0,0,0,0,0,0,0,73,66,38,40,171,33,7,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,122,0,0,0,0,0,0,73,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,3,134,212,0,0,0,0,202,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,22,102,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,96,0,0,0,0,0,0,103,247,0,0,164,112,206,31],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);allocate([142,17,0,0,0,0,0,0,0,0,0,0,8,55,164,4,0,0,132,63,0,0,0,0,0,0,4,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,30,0,0,0,0,164,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,94,5,115,0,0,7,131,0,0,37,19,0,0,0,0,234,48,0,0,0,0,7,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,15,0,0,0,0,0,0,0,0,6,80,0,0,100,60,169,8,7,202,0,0,0,0,0,0,0,0,0,0,199,91,0,0,0,0,0,0,0,0,0,0,0,0,10,60,0,0,233,61,0,0,9,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,109,169,28,0,0,0,0,0,0,0,0,134,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,126,132,93,0,0,102,69,0,0,0,0,0,0,0,0,0,0,0,0,40,24,0,0,8,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,123,0,0,0,0,0,0,133,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,10,6,196,0,0,0,0,11,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,20,133,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,45,50,15,0,0,0,0,132,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,20,4,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,115,0,0,0,0,0,0,0,0,105,103,0,0,72,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,112,229,79,0,0,0,0,0,0,0,0,0,0,198,201,0,0,0,0,0,0,135,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,120,196,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,112,0,0,36,71,0,0,0,0,0,0,0,0,104,99,166,255,0,0,0,0,0,0,0,0,0,0,0,0,9,13,134,6,0,0,0,0,0,0,0,0,0,0,164,37,0,0,0,0,0,0,0,0,104,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,4,0,0,0,0,0,0,0,0,198,61,0,0,166,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,126,0,0,166,119,0,0,0,0,8,9,198,38,0,0,0,0,0,0,71,71,0,0,0,0,40,56,0,0,8,8,166,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,87,70,206,237,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,42,0,0,0,0,0,0,0,0,230,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,112,0,0,0,0,82,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,101,230,86,0,0,0,0,0,0,0,0,104,67,167,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,32,0,0,108,125,0,0,0,0,0,0,136,30,228,25,0,0,133,64,0,0,0,0,12,120,0,0,136,18,133,0,0,0,135,158,203,3,134,93,0,0,0,0,203,67,0,0,0,0,0,0,204,0,0,0,0,0,4,106,203,72,39,173,200,107,36,118,0,0,0,0,0,0,0,0,72,87,164,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,76,11,124,0,0,0,0,198,109,0,0,231,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,47,0,0,134,175,0,0,0,0,0,0,0,0,72,123,0,0,137,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,74,135,71,0,0,103,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,87,135,93,0,0,0,0,0,0,0,0,0,0,0,0,233,10,0,0,0,0,229,15,0,0,0,0,108,10,198,24,0,0,0,0,0,0,0,0,0,0,0,0,10,108,133,34,0,0,0,0,0,0,0,0,200,90,6,219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,133,0,0,133,95,0,0,0,0,0,0,0,0,107,85,0,0,202,68,166,38,0,0,0,0,72,109,134,151,0,0,0,0,0,0,134,170,0,0,71,123,170,47,102,90,0,0,0,0,0,0,167,196,0,0,0,0,0,0,0,0,0,0,38,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,194,0,0,0,0,0,0,0,0,170,61,70,24,0,0,0,0,0,0,0,0,8,53,5,3,0,0,0,0,0,0,0,0,0,0,0,0,40,67,197,1,171,67,0,0,104,79,196,15,0,0,0,0,0,0,132,39,0,0,0,0,0,0,0,0,169,107,196,124,40,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,44,4,8,0,0,0,0,0,0,0,0,10,38,39,197,0,0,0,0,0,0,0,0,0,0,102,138,0,0,0,0,0,0,0,0,0,0,38,116,0,0,0,0,0,0,199,142,0,0,0,0,0,0,0,0,41,36,230,21,0,0,5,54,0,0,230,34,0,0,0,0,0,0,0,0,0,0,39,98,0,0,0,0,107,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,10,0,0,0,0,0,0,0,0,0,0,0,0,101,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,165,0,0,0,0,0,0,0,0,203,65,0,0,232,69,197,96,237,15,0,0,0,0,0,0,203,116,231,145,0,0,103,120,0,0,134,32,0,0,0,0,0,0,166,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,72,132,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,145,0,0,0,0,201,122,70,240,0,0,230,7,0,0,0,0,0,0,0,0,0,0,37,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,8,201,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,48,105,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,142,0,0,0,0,0,0,0,0,137,42,164,31,0,0,39,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,111,0,0,0,0,0,0,0,0,69,102,136,98,4,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,58,0,0,103,30,0,0,198,108,0,0,0,0,0,0,166,220,170,106,0,0,0,0,0,0,138,22,164,75,0,0,197,102,139,114,68,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,112,0,0,0,0,0,0,0,0,200,56,134,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,165,0,0,4,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,67,167,5,0,0,0,0,235,32,134,189,78,18,0,0,0,0,0,0,0,0,0,0,138,58,0,0,168,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,36,231,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,8,135,123,173,16,0,0,0,0,0,0,0,0,0,0,0,0,167,17,0,0,0,0,8,109,70,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,32,100,77,0,0,0,0,0,0,0,0,168,23,197,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,35,101,4,0,0,164,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,67,198,26,104,83,0,0,76,9,0,0,0,0,167,15,0,0,0,0,0,0,0,0,0,0,37,95,106,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,167,206,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,56,0,0,197,80,232,12,199,10,42,80,135,253,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,108,242,10,166,34,136,47,102,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,117,36,98,0,0,0,0,0,0,0,0,200,69,7,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,178,0,0,0,0,171,91,71,126,0,0,0,0,41,46,7,207,0,0,0,0,0,0,198,129,104,122,70,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,125,0,0,0,0,51,15,0,0,0,0,0,0,105,27,133,2,0,0,0,0,0,0,0,0,0,0,0,0,203,106,7,180,0,0,0,0,0,0,69,61,0,0,198,133,0,0,0,0,75,65,0,0,0,0,0,0,0,0,228,54,168,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,95,0,0,0,0,0,0,0,0,0,0,134,83,0,0,0,0,104,68,36,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,77,0,0,39,78,0,0,0,0,0,0,100,25,175,3,0,0,0,0,69,42,0,0,0,0,0,0,0,0,74,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,38,70,96,0,0,0,0,0,0,0,0,0,0,71,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,86,103,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,123,0,0,0,0,0,0,6,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,95,0,0,196,109,0,0,0,0,0,0,36,122,0,0,132,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,57,0,0,0,0,0,0,0,0,235,77,69,45,0,0,0,0,8,37,229,57,46,17,0,0,0,0,196,56,0,0,0,0,0,0,231,190,81,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,74,5,6,0,0,0,0,0,0,0,0,0,0,37,91,0,0,0,0,0,0,69,55,0,0,0,0,0,0,0,0,16,5,38,56,0,0,164,106,0,0,0,0,0,0,0,0,0,0,0,0,108,28,0,0,0,0,0,0,0,0,0,0,0,0,102,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,20,229,6,0,0,69,56,0,0,198,146,202,7,0,0,236,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,108,0,0,0,0,0,0,0,0,8,10,164,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,44,167,47,0,0,0,0,104,93,0,0,0,0,0,0,72,119,0,0,0,0,38,134,0,0,135,69,0,0,0,0,0,0,133,86,0,0,230,23,0,0,132,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,103,68,88,0,0,0,0,74,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,154,0,0,0,0,0,0,0,0,0,0,70,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,18,0,0,0,0,0,0,201,112,132,25,0,0,0,0,40,104,0,0,233,35,199,45,0,0,0,0,0,0,0,0,0,0,0,0,8,124,134,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,98,0,0,0,0,233,70,199,78,0,0,0,0,0,0,102,67,0,0,0,0,110,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,123,0,0,0,0,100,29,42,95,68,24,0,0,198,135,0,0,0,0,0,0,0,0,0,0,0,0,8,127,0,0,0,0,135,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,70,233,33,229,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,87,196,58,172,5,103,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,89,0,0,229,40,0,0,0,0,0,0,0,0,0,0,0,0,137,75,6,69,107,0,228,27,0,0,0,0,0,0,0,0,8,57,5,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,252,200,0,164,56,0,0,0,0,0,0,0,0,232,121,0,0,42,120,0,0,0,0,0,0,0,0,0,0,137,114,102,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,43,165,12,105,99,196,38,0,0,0,0,0,0,101,73,232,122,198,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,80,0,0,0,0,0,0,102,106,0,0,0,0,0,0,0,0,0,0,68,62,136,17,39,27,0,0,0,0,0,0,6,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,80,4,57,0,0,6,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,218,0,0,0,0,0,0,0,0,0,0,101,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,11,0,0,0,0,166,195,0,0,102,11,12,99,100,117,200,20,4,2,0,0,0,0,0,0,0,0,240,11,0,0,0,0,0,0,0,0,231,68,106,68,228,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,83,0,0,0,0,0,0,0,0,0,0,4,111,10,46,164,18,0,0,0,0,40,13,68,19,0,0,231,122,0,0,0,0,73,57,228,3,0,0,102,80,0,0,0,0,0,0,4,39,0,0,133,92,0,0,0,0,0,0,71,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,104,138,8,0,0,0,0,0,0,0,0,0,0,107,108,36,10,0,0,0,0,0,0,0,0,72,81,36,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,143,0,0,228,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,83,228,8,0,0,0,0,0,0,0,0,107,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,12,231,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,245,0,0,0,0,0,0,36,99,0,0,0,0,235,108,36,5,0,0,0,0,43,41,199,11,0,0,0,0,0,0,0,0,41,26,0,0,0,0,38,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,12,0,0,0,0,0,0,228,57,0,0,0,0,0,0,0,0,110,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,123,0,0,0,0,0,0,0,0,0,0,196,22,0,0,0,0,0,0,0,0,0,0,0,0,169,25,68,5,0,0,38,100,0,0,0,0,0,0,0,0,0,0,100,79,0,0,0,0,171,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,34,0,0,70,160,0,0,0,0,0,0,37,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,44,233,109,102,58,0,0,167,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,115,0,0,0,0,0,0,0,0,136,105,102,224,0,0,0,0,0,0,0,0,105,38,4,118,107,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,13,0,0,165,61,0,0,196,21,40,52,0,0,0,0,0,0,0,0,0,0,233,72,167,91,0,0,0,0,0,0,0,0,0,0,0,0,10,2,4,4,0,0,0,0,0,0,0,0,168,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,37,197,15,0,0,0,0,43,45,231,193,0,0,0,0,0,0,0,0,0,0,0,0,232,108,68,118,0,0,0,0,0,0,0,0,0,0,228,21,0,0,164,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,99,0,0,38,93,0,0,165,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,54,132,31,73,103,0,0,0,0,0,0,0,0,0,0,0,0,228,98,0,0,0,0,0,0,0,0,170,63,229,28,169,34,39,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,5,231,198,0,0,0,0,0,0,0,0,0,0,103,210,0,0,0,0,0,0,0,0,40,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,69,228,49,0,0,196,49,0,0,0,0,0,0,199,128,0,0,0,0,0,0,0,0,0,0,0,0,13,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,121,0,0,68,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,51,71,74,0,0,167,136,0,0,228,84,40,114,0,0,0,0,0,0,0,0,134,186,136,67,199,171,73,89,199,185,0,0,0,0,0,0,0,0,40,103,230,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,119,0,0,0,0,8,92,229,17,0,0,132,87,0,0,134,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,194,0,0,0,0,0,0,133,107,169,75,198,52,0,0,0,0,235,100,0,0,0,0,0,0,0,0,0,0,105,16,101,64,0,0,196,80,0,0,0,0,0,0,0,0,169,14,132,49,72,20,38,15,0,0,0,0,0,0,0,0,0,0,0,0,170,44,0,0,0,0,0,0,0,0,0,0,0,0,165,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,89,138,43,6,192,0,0,102,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,54,0,0,0,0,0,0,0,0,0,0,0,0,202,45,103,71,41,64,0,0,0,0,0,0,0,0,0,0,0,0,132,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,109,0,0,0,0,0,0,0,0,103,21,0,0,38,78,200,68,103,13,139,73,228,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,96,235,12,0,0,0,0,0,0,0,0,0,0,0,0,228,99,0,0,0,0,0,0,196,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,34,0,0,36,55,0,0,0,0,11,60,36,1,0,0,0,0,0,0,199,147,0,0,70,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,85,0,0,0,0,134,125,15,3,0,0,0,0,6,121,0,0,0,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,96,0,0,0,0,0,0,73,72,71,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,14,69,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,69,0,0,0,0,0,0,0,0,0,0,0,0,8,2,166,164,0,0,0,0,50,12,0,0,0,0,0,0,234,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,111,0,0,0,0,0,0,102,196,0,0,0,0,73,53,70,23,0,0,166,137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,117,36,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,68,164,11,0,0,0,0,0,0,0,0,169,93,0,0,73,20,0,0,0,0,164,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,78,36,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,79,0,0,0,0,0,0,0,0,135,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,104,200,49,0,0,168,80,0,0,0,0,0,0,233,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,2,0,0,4,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,249,0,0,0,0,0,0,0,0,40,96,0,0,0,0,0,0,75,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,178,0,0,0,0,0,0,0,0,139,7,0,0,0,0,0,0,41,80,71,234,0,0,134,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,219,0,0,0,0,0,0,0,0,0,0,39,117,0,0,135,206,0,0,198,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,72,0,0,0,0,0,0,0,0,0,0,198,185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,168,0,0,0,0,114,11,0,0,136,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,16,0,0,164,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,122,0,0,0,0,0,0,0,0,0,0,176,2,0,0,0,0,0,0,0,0,0,0,112,6,0,0,0,0,0,0,0,0,71,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,35,38,35,0,0,166,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,222,0,0,0,0,0,0,0,0,0,0,6,191,0,0,100,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,9,68,17,0,0,0,0,0,0,0,0,204,79,165,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,47,36,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,107,0,0,0,0,74,118,6,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,101,0,0,0,0,0,0,42,29,0,0,0,0,134,123,0,0,70,55,0,0,0,0,0,0,7,112,0,0,0,0,0,0,0,0,0,0,0,0,104,60,0,0,0,0,0,0,0,0,166,213,0,0,0,0,0,0,0,0,0,0,0,0,243,14,0,0,0,0,0,0,171,8,0,0,169,38,0,0,0,0,0,0,0,0,0,0,73,18,7,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,86,0,0,0,0,0,0,40,6,68,2,140,127,0,0,0,0,164,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,116,102,228,0,0,69,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,26,229,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,33,0,0,0,0,0,0,229,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,62,0,0,0,0,0,0,0,0,39,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,31,36,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,95,0,0,0,0,73,19,0,0,0,0,0,0,232,31,0,0,108,52,100,40,0,0,0,0,0,0,0,0,0,0,4,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,68,71,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,100,166,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,119,0,0,0,0,69,74,0,0,0,0,0,0,0,0,0,0,0,0,205,0,230,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,102,38,205,0,0,134,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,37,0,0,0,0,0,0,0,0,0,0,134,18,0,0,0,0,137,84,0,0,0,0,0,0,0,0,0,0,0,0,70,209,0,0,0,0,0,0,0,0,0,0,0,0,75,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,17,166,48,0,0,0,0,0,0,0,0,104,11,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,218,0,0,0,0,0,0,0,0,0,0,7,3,0,0,6,169,202,19,71,191,0,0,0,0,73,76,228,62,170,18,38,175,0,0,0,0,0,0,0,0,0,0,71,243,232,82,0,0,0,0,0,0,0,0,230,200,0,0,0,0,0,0,0,0,0,0,0,0,74,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,52,0,0,0,0,0,0,4,49,41,79,37,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,2,70,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,85,135,17,0,0,0,0,0,0,0,0,43,31,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,152,0,0,101,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,63,135,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,76,231,117,0,0,167,229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,80,0,0,0,0,0,0,0,0,9,35,0,0,0,0,0,0,214,2,0,0,0,0,0,0,0,0,0,0,73,23,68,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,92,0,0,0,0,41,41,231,18,168,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,115,0,0,0,0,168,64,39,104,0,0,68,63,0,0,0,0,136,54,103,31,8,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,86,196,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,24,230,221,72,64,167,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,92,0,0,0,0,0,0,0,0,0,0,0,0,139,36,0,0,0,0,0,0,105,28,103,160,204,96,36,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,6,37,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,114,198,238,0,0,0,0,0,0,71,228,75,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,145,200,10,199,3,0,0,0,0,0,0,38,90,234,104,0,0,0,0,0,0,41,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,21,134,53,0,0,0,0,0,0,0,0,0,0,6,206,170,79,167,150,0,0,0,0,0,0,135,199,0,0,0,0,136,0,68,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,34,167,19,232,48,134,75,0,0,0,0,43,89,39,118,170,109,164,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,107,228,70,136,78,199,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,95,0,0,0,0,10,98,0,0,0,0,0,0,0,0,69,37,0,0,0,0,233,95,39,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,99,0,0,0,0,171,37,0,0,0,0,71,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,154,0,0,0,0,0,0,0,0,0,0,0,0,140,80,39,46,243,1,0,0,8,20,230,8,0,0,0,0,0,0,0,0,0,0,230,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,91,230,156,136,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,104,0,0,0,0,0,0,0,0,0,0,199,202,0,0,0,0,236,91,0,0,0,0,0,0,0,0,38,200,137,100,198,173,78,49,0,0,0,0,0,0,0,0,0,0,0,0,6,12,0,0,100,81,0,0,0,0,104,4,7,86,0,0,0,0,0,0,102,83,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,88,0,0,134,190,0,0,199,134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,53,0,0,135,149,0,0,0,0,202,6,0,0,233,1,5,58,0,0,70,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,113,0,0,0,0,0,0,0,0,0,0,0,0,76,24,230,220,0,0,0,0,0,0,0,0,0,0,5,105,0,0,134,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,179,0,0,0,0,0,0,0,0,73,80,102,84,0,0,0,0,0,0,0,0,0,0,0,0,40,34,132,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,103,228,11,0,0,0,0,141,2,103,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,106,0,0,0,0,196,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,108,10,81,5,108,0,0,5,116,75,11,0,0,136,41,0,0,0,0,0,0,0,0,230,131,0,0,0,0,0,0,0,0,0,0,0,0,75,123,0,0,0,0,0,0,0,0,0,0,136,5,135,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,42,197,64,233,103,134,138,0,0,0,0,0,0,132,104,0,0,135,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,105,164,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,30,0,0,0,0,0,0,72,76,196,116,0,0,0,0,8,12,0,0,0,0,0,0,8,30,199,81,169,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,48,0,0,102,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,9,0,0,205,45,230,101,0,0,0,0,233,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,84,73,106,198,82,0,0,228,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,90,132,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,18,0,0,104,53,0,0,0,0,198,47,0,0,0,0,0,0,36,41,0,0,0,0,233,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,113,0,0,0,0,200,45,102,105,0,0,102,180,0,0,135,171,10,124,0,0,136,4,100,15,0,0,36,81,0,0,0,0,0,0,0,0,0,0,229,95,0,0,70,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,9,106,60,0,0,0,0,39,168,0,0,0,0,0,0,165,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,248,0,0,0,0,136,27,165,14,0,0,0,0,0,0,197,85],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+10248);allocate([170,95,135,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,181,0,0,0,0,232,45,7,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,35,6,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,44,0,0,0,0,0,0,0,0,0,0,4,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,116,0,0,70,131,0,0,100,18,75,24,0,0,0,0,102,42,0,0,0,0,0,0,0,0,0,0,197,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,42,199,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,144,0,0,0,0,0,0,230,105,0,0,0,0,0,0,0,0,0,0,0,0,105,85,0,0,105,108,6,118,0,0,0,0,0,0,0,0,0,0,39,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,49,70,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,77,228,66,0,0,39,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,97,0,0,0,0,0,0,0,0,0,0,196,5,0,0,101,101,0,0,0,0,233,50,71,182,0,0,71,117,136,88,70,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,55,0,0,0,0,0,0,0,0,0,0,0,0,39,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,57,0,0,0,0,0,0,0,0,168,65,0,0,0,0,37,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,62,167,90,0,0,0,0,0,0,0,0,172,2,0,0,0,0,0,0,0,0,167,96,0,0,0,0,0,0,132,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,117,228,72,107,82,199,182,0,0,133,27,0,0,0,0,0,0,0,0,107,100,0,0,0,0,4,68,80,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,22,5,22,0,0,7,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,85,3,0,0,0,0,0,0,0,0,0,0,0,0,7,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,98,0,0,0,0,0,0,0,0,0,0,230,106,0,0,0,0,0,0,0,0,168,76,228,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,94,198,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,8,69,20,0,0,196,81,9,6,132,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,84,71,247,0,0,0,0,203,12,135,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,45,0,0,164,57,0,0,0,0,0,0,4,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,93,38,113,0,0,0,0,0,0,101,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,39,101,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,106,0,0,0,0,201,104,230,78,0,0,0,0,0,0,0,0,0,0,5,118,0,0,0,0,0,0,0,0,0,0,4,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,69,230,30,0,0,0,0,136,124,0,0,0,0,167,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,65,71,93,0,0,0,0,43,43,0,0,0,0,0,0,40,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,81,133,53,0,0,0,0,0,0,71,145,205,28,231,40,74,68,4,99,0,0,0,0,0,0,102,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,84,170,23,0,0,0,0,0,0,0,0,0,0,0,0,101,12,0,0,0,0,0,0,166,131,0,0,0,0,0,0,0,0,0,0,0,0,104,69,164,49,0,0,0,0,0,0,0,0,0,0,166,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,49,164,60,0,0,198,45,0,0,0,0,106,98,0,0,0,0,0,0,73,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,19,0,0,166,117,0,0,0,0,0,0,0,0,0,0,7,167,0,0,0,0,136,14,0,0,0,0,0,0,0,0,0,0,0,0,102,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,21,5,20,0,0,230,226,0,0,0,0,0,0,0,0,0,0,68,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,86,0,0,0,0,0,0,0,0,137,102,0,0,75,62,132,13,0,0,0,0,0,0,230,139,0,0,0,0,0,0,133,30,44,76,167,125,0,0,132,51,0,0,0,0,0,0,0,0,0,0,228,111,0,0,0,0,0,0,71,237,0,0,0,0,0,0,0,0,0,0,196,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,67,8,78,198,36,170,37,0,0,0,0,0,0,73,37,0,0,0,0,164,94,0,0,0,0,0,0,0,0,0,0,230,157,0,0,132,102,0,0,69,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,123,0,0,0,0,0,0,0,0,139,15,103,234,0,0,0,0,0,0,133,40,0,0,0,0,0,0,134,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,113,0,0,68,119,0,0,0,0,0,0,0,0,40,41,0,0,0,0,0,0,0,0,165,64,0,0,0,0,0,0,0,0,0,0,4,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,75,197,18,0,0,0,0,0,0,0,0,0,0,133,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,13,0,0,0,0,0,0,0,0,135,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,222,0,0,0,0,240,6,164,61,0,0,0,0,43,10,0,0,40,40,134,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,45,6,71,0,0,68,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,78,0,0,0,0,0,0,0,0,0,0,0,0,136,34,6,2,0,0,0,0,168,7,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,24,228,36,0,0,0,0,0,0,0,0,0,0,0,0,105,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,26,165,38,168,9,165,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,98,165,21,0,0,229,54,139,20,7,81,0,0,0,0,236,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,46,4,1,0,0,103,137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,71,0,0,0,0,0,0,198,64,0,0,0,0,0,0,198,87,0,0,0,0,0,0,0,0,0,0,0,0,232,10,0,0,0,0,0,0,202,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,82,164,8,0,0,0,0,0,0,71,225,0,0,0,0,0,0,0,0,0,0,0,0,107,62,0,0,0,0,0,0,234,10,135,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,105,110,35,0,0,0,0,0,0,0,0,134,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,13,101,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,75,110,40,164,14,0,0,0,0,0,0,0,0,235,58,68,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,59,68,64,0,0,198,221,0,0,0,0,9,11,0,0,201,54,133,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,35,70,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,79,68,32,0,0,0,0,200,97,37,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,126,4,83,0,0,198,117,0,0,166,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,44,0,0,0,0,5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,26,36,36,0,0,230,246,168,13,70,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,88,0,0,0,0,5,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,154,0,0,0,0,205,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,116,6,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,28,39,97,0,0,70,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,81,196,51,0,0,39,2,0,0,0,0,0,0,199,168,0,0,103,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,110,4,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,53,36,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,114,0,0,0,0,0,0,0,0,202,62,6,35,11,56,165,5,0,0,0,0,0,0,0,0,40,97,0,0,0,0,0,0,0,0,68,51,0,0,199,138,0,0,0,0,0,0,0,0,0,0,0,0,203,51,165,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,98,0,0,0,0,0,0,132,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,198,169,76,38,47,11,12,0,0,0,0,0,0,0,0,100,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,85,0,0,103,60,138,114,0,0,0,0,0,0,0,0,0,0,0,0,38,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,10,0,0,0,0,231,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,62,0,0,0,0,0,0,0,0,0,0,0,0,168,115,36,14,10,13,132,40,0,0,135,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,116,104,42,165,33,169,60,38,214,170,118,228,52,0,0,135,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,252,204,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,174,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,127,0,0,0,0,0,0,0,0,238,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,65,0,0,0,0,0,0,0,0,0,0,0,0,37,78,0,0,0,0,40,53,167,4,0,0,0,0,0,0,231,242,0,0,0,0,0,0,0,0,0,0,164,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,21,0,0,0,0,72,126,0,0,0,0,70,249,0,0,0,0,0,0,103,11,0,0,0,0,0,0,0,0,138,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,30,230,1,0,0,0,0,0,0,102,153,0,0,198,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,81,73,70,36,18,0,0,0,0,0,0,164,62,104,127,0,0,0,0,0,0,0,0,166,63,107,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,137,0,0,0,0,0,0,0,0,0,0,0,0,138,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,61,68,14,0,0,0,0,235,34,164,9,0,0,166,214,0,0,0,0,0,0,0,0,72,10,135,96,0,0,135,90,0,0,0,0,0,0,0,0,0,0,166,141,0,0,0,0,0,0,0,0,0,0,0,0,42,124,38,105,0,0,164,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,41,167,46,182,4,0,0,0,0,0,0,0,0,132,70,0,0,0,0,0,0,0,0,0,0,38,64,0,0,0,0,0,0,36,103,0,0,0,0,105,112,0,0,0,0,70,97,0,0,0,0,204,47,39,177,0,0,135,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,14,38,68,0,0,165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,87,0,0,0,0,104,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,94,229,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,46,0,0,167,154,0,0,0,0,0,0,0,0,0,0,0,0,77,37,228,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,13,0,0,0,0,0,0,0,0,0,0,0,0,199,101,236,123,0,0,169,94,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,67,0,0,0,0,0,0,0,0,8,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,126,0,0,0,0,0,0,36,26,0,0,0,0,0,0,0,0,40,69,230,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,69,232,65,0,0,0,0,0,0,0,0,0,0,234,63,0,0,0,0,101,84,0,0,0,0,139,19,0,0,0,0,0,0,0,0,0,0,0,0,165,88,0,0,70,87,0,0,0,0,0,0,38,218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,25,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,159,0,0,0,0,0,0,0,0,0,0,102,132,0,0,0,0,0,0,0,0,0,0,0,0,200,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,118,0,0,0,0,0,0,0,0,0,0,0,0,232,21,0,0,0,0,0,0,0,0,0,0,0,0,196,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,69,0,0,0,0,0,0,0,0,5,98,136,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,49,198,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,96,135,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,105,201,1,0,0,140,89,228,120,72,74,0,0,41,21,135,178,0,0,37,20,0,0,196,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,8,0,0,0,0,0,0,0,0,0,0,202,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,130,0,0,6,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,102,230,79,0,0,199,226,170,124,0,0,0,0,0,0,0,0,132,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,29,103,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,6,0,0,0,0,0,0,4,32,0,0,0,0,233,43,0,0,108,119,166,235,0,0,68,89,0,0,0,0,0,0,198,158,0,0,4,93,0,0,38,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,50,39,121,0,0,0,0,0,0,0,0,0,0,0,0,72,6,0,0,0,0,0,0,0,0,132,71,0,0,0,0,0,0,0,0,234,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,31,102,5,0,0,37,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,95,0,0,101,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,84,0,0,0,0,44,51,70,32,84,10,37,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,4,37,49,0,0,133,98,0,0,0,0,0,0,38,160,173,63,230,161,0,0,0,0,0,0,0,0,107,65,164,7,0,0,0,0,0,0,166,73,0,0,0,0,205,6,103,132,0,0,0,0,0,0,0,0,0,0,0,0,9,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,114,0,0,199,199,0,0,0,0,0,0,0,0,0,0,228,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,6,228,31,0,0,0,0,0,0,0,0,0,0,6,41,0,0,0,0,0,0,0,0,169,21,0,0,0,0,0,0,0,0,0,0,51,8,102,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,55,0,0,75,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,105,70,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,111,0,0,0,0,132,35,0,0,0,0,0,0,0,0,40,66,0,0,0,0,0,0,233,100,0,0,47,17,68,27,0,0,134,180,0,0,0,0,0,0,0,0,0,0,196,33,172,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,74,167,189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,60,103,47,0,0,0,0,0,0,0,0,0,0,101,125,200,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,92,8,38,196,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,99,167,115,136,60,228,58,0,0,0,0,0,0,0,0,8,86,0,0,0,0,0,0,0,0,36,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,146,236,93,0,0,0,0,0,0,138,56,39,116,0,0,165,27,0,0,166,179,0,0,0,0,0,0,0,0,104,119,132,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,24,0,0,132,16,0,0,0,0,0,0,0,0,0,0,228,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,95,104,16,70,5,0,0,0,0,0,0,71,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,46,134,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,71,172,3,0,0,0,0,0,0,0,0,0,0,0,0,102,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,191,0,0,0,0,0,0,0,0,0,0,0,0,108,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,208,0,0,0,0,0,0,0,0,0,0,0,0,140,16,230,63,0,0,5,71,72,32,132,127,0,0,0,0,232,2,164,70,0,0,6,43,0,0,0,0,0,0,0,0,0,0,68,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,30,0,0,0,0,233,51,102,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,50,0,0,0,0,70,94,237,3,132,89,0,0,197,122,104,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,111,0,0,0,0,0,0,9,105,229,105,0,0,0,0,233,102,0,0,0,0,0,0,0,0,0,0,0,0,38,98,0,0,0,0,8,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,66,0,0,0,0,39,85,0,0,0,0,76,39,0,0,8,48,132,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,36,199,13,0,0,70,227,232,125,0,0,42,40,0,0,73,8,7,45,0,0,0,0,0,0,37,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,112,40,9,197,31,0,0,0,0,0,0,0,0,104,85,231,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,211,10,0,0,0,0,164,90,0,0,0,0,0,0,0,0,0,0,134,24,0,0,0,0,0,0,0,0,0,0,229,103,0,0,0,0,0,0,0,0,104,90,0,0,0,0,0,0,0,0,0,0,72,124,4,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,95,5,106,0,0,0,0,0,0,0,0,170,25,132,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,118,0,0,0,0,0,0,228,110,78,56,0,0,0,0,135,77,138,48,166,20,0,0,0,0,0,0,0,0,0,0,228,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,97,165,66,0,0,0,0,0,0,0,0,41,83,36,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,5,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,75,0,0,0,0,0,0,0,0,0,0,0,0,8,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,0,0,0,0,0,0,0,0,0,0,169,77,4,75,0,0,229,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,70,0,0,230,69,0,0,38,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,84,169,19,0,0,0,0,0,0,0,0,71,89,0,0,0,0,0,0,0,0,0,0,6,57,0,0,165,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,2,0,0,0,0,0,0,0,0,198,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,8,231,57,0,0,0,0,106,6,38,24,107,51,230,58,0,0,0,0,0,0,0,0,40,79,0,0,0,0,0,0,0,0,0,0,0,0,135,143,44,16,70,69,200,67,103,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,54,0,0,0,0,0,0,0,0,0,0,0,0,100,109,0,0,0,0,0,0,0,0,0,0,164,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,70,0,0,0,0,0,0,74,18,132,55,0,0,0,0,201,27,135,157,0,0,0,0,0,0,0,0,0,0,0,0,41,95,0,0,0,0,102,87,0,0,0,0,0,0,0,0,0,0,134,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,103,76,30,0,0,0,0,38,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,25,135,4,12,28,0,0,0,0,0,0,0,0,0,0,0,0,198,178,0,0,198,225,0,0,100,65,0,0,0,0,201,119,38,236,0,0,0,0,0,0,102,103,0,0,0,0,0,0,0,0,0,0,102,255,8,13,70,30,0,0,0,0,0,0,0,0,0,0,0,0,136,35,135,18,78,1,0,0,0,0,0,0,0,0,0,0,0,0,38,156,0,0,0,0,0,0,228,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,211,11,0,0,0,0,0,0,200,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,63,71,163,0,0,0,0,138,95,133,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,212,0,0,0,0,0,0,0,0,233,19,132,120,232,72,0,0,0,0,0,0,0,0,0,0,0,0,100,64,0,0,0,0,8,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,17,0,0,0,0,0,0,0,0,0,0,198,222,0,0,0,0,137,5,231,160,0,0,0,0,0,0,0,0,0,0,133,91,0,0,0,0,0,0,0,0,40,39,231,84,0,0,0,0,42,45,0,0,0,0,0,0,0,0,102,74,0,0,0,0,0,0,0,0,0,0,0,0,41,94,102,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,17,0,0,0,0,0,0,0,0,197,51,0,0,71,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,218,0,0,0,0,0,0,102,203,0,0,4,61,0,0,0,0,0,0,0,0,0,0,100,10,0,0,0,0,0,0,0,0,140,84,0,0,0,0,231,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,34,0,0,0,0,0,0,0,0,0,0,0,0,44,12,0,0,208,1,166,135,0,0,0,0,0,0,0,0,0,0,0,0,171,97,135,48,0,0,36,106,104,7,167,28,0,0,0,0,0,0,0,0,0,0,102,139,0,0,0,0,0,0,0,0,208,11,0,0,0,0,0,0,0,0,134,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,82,42,92,103,129,0,0,0,0,0,0,0,0,0,0,0,0,41,27,71,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,126,0,0,0,0,0,0,0,0,0,0,0,0,73,24,164,91,0,0,0,0,42,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,117,166,247,53,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,122,0,0,0,0,0,0,0,0,0,0,101,76,0,0,0,0,0,0,0,0,0,0,69,22,0,0,0,0,0,0,68,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,48,0,0,0,0,0,0,198,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,61,0,0,0,0,178,4,0,0,0,0,0,0,0,0,134,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,12,39,192,0,0,0,0,11,21,37,59,0,0,0,0,0,0,37,13,0,0,0,0,0,0,0,0,201,86,197,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,1,6,157,0,0,0,0,0,0,71,203,0,0,100,97,0,0,0,0,0,0,0,0,40,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,38,0,0,0,0,0,0,0,0,0,0,167,92,0,0,228,83,0,0,0,0,0,0,0,0,40,81,199,18,0,0,0,0,105,12,38,65,0,0,0,0,110,0,101,42,0,0,0,0,0,0,230,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,29,102,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,203,0,0,196,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,103,0,0,0,0,0,0,167,180,0,0,0,0,0,0,197,60,0,0,0,0,0,0,0,0,40,2,103,204,0,0,0,0,0,0,0,0,202,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,170,0,0,0,0,0,0,0,0,0,0,229,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,11,0,0,0,0,0,0,0,0,0,0,0,0,230,55,0,0,0,0,105,59,39,72,0,0,0,0,0,0,0,0,0,0,0,0,110,38,0,0,9,68,36,76,0,0,0,0,0,0,68,116,0,0,0,0,0,0,0,0,174,2,101,117,0,0,0,0,0,0,0,0,0,0,69,120,72,21,101,81,0,0,0,0,0,0,0,0,140,61,196,50,0,0,0,0,0,0,0,0,0,0,167,74,0,0,0,0,0,0,0,0,0,0,164,122,0,0,0,0,0,0,36,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,110,38,2,0,0,0,0,49,2,0,0,106,113,0,0,0,0,0,0,200,13,0,0,0,0,0,0,179,6,69,57,8,0,231,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,115,134,230,0,0,6,154,0,0,0,0,0,0,0,0,202,8,228,64,0,0,36,124,0,0,0,0,0,0,0,0,0,0,0,0,8,74,230,3,0,0,101,113,0,0,0,0,0,0,0,0,0,0,166,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,6,0,0,8,51,4,26,12,7,0,0,0,0,166,211,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,55,0,0,41,56,6,116,0,0,0,0,0,0,0,0,0,0,36,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,190,0,0,100,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,21,45,23,0,0,9,58,103,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,139,40,20,132,56,0,0,0,0,72,90,0,0,0,0,0,0,0,0,0,0,182,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,7,38,36,110,5,0,0,0,0,0,0,0,0,0,0,0,0,199,211,0,0,0,0,0,0,0,0,136,52,0,0,0,0,0,0,0,0,39,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,38,0,0,0,0,230,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,98,0,0,0,0,40,93,69,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,36,139,8,228,29,181,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,86,73,7,135,68,0,0,0,0,0,0,0,0,0,0,0,0,236,85,0,0,0,0,0,0,0,0,167,218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,164,82,0,0,0,0,0,0,0,0,0,0,0,0,169,55,0,0,0,0,0,0,84,9,0,0,0,0,0,0,0,0,167,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,95,0,0,0,0,171,23,7,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,193,9,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,48,228,93,0,0,36,51,0,0,0,0,0,0,0,0,0,0,0,0,42,32,71,200,49,13,38,59,0,0,0,0,0,0,0,0,0,0,0,0,143,19,166,243,0,0,103,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,174,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,61,0,0,37,77,0,0,0,0,75,6,0,0,203,86,199,189,41,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,209,2,0,0,0,0,0,0,0,0,6,127,0,0,0,0,0,0,36,39,0,0,0,0,0,0,0,0,0,0,0,0,8,23,231,116,73,14,6,90,0,0,0,0,76,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,50,0,0,0,0,0,0,0,0,0,0,232,11,197,110,0,0,36,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,90,0,0,165,127,0,0,0,0,0,0,0,0,0,0,198,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,99,0,0,100,73,0,0,0,0,232,86,198,74,0,0,38,241,41,72,165,119,0,0,36,16,105,94,199,58,0,0,0,0,72,56,133,18,0,0,0,0,0,0,198,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,31,0,0,107,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,5,0,0,0,0,228,109,0,0,198,100,0,0,135,233],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+20508);allocate([166,229,0,0,0,0,0,0,70,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,120,0,0,0,0,0,0,0,0,72,63,0,0,0,0,0,0,79,1,0,0,0,0,0,0,202,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,116,6,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,106,0,0,0,0,0,0,0,0,139,79,0,0,0,0,0,0,10,4,199,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,117,0,0,0,0,0,0,0,0,101,54,0,0,0,0,0,0,0,0,0,0,0,0,232,8,165,10,0,0,0,0,0,0,0,0,0,0,0,0,12,86,135,92,201,11,101,86,0,0,0,0,234,84,229,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,67,0,0,136,85,39,249,0,0,0,0,0,0,102,82,0,0,230,72,0,0,100,100,0,0,5,88,0,0,0,0,0,0,0,0,0,0,100,22,168,22,103,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,30,170,50,101,25,0,0,0,0,107,12,70,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,61,0,0,197,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,0,0,0,0,0,0,0,0,0,36,83,169,43,4,31,0,0,0,0,0,0,0,0,139,76,199,158,0,0,0,0,0,0,0,0,0,0,101,46,0,0,0,0,0,0,71,103,0,0,0,0,0,0,0,0,183,2,230,191,75,107,196,46,0,0,0,0,0,0,0,0,0,0,0,0,233,38,0,0,0,0,0,0,234,123,6,246,0,0,0,0,0,0,0,0,201,61,230,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,96,0,0,0,0,0,0,0,0,0,0,70,80,0,0,0,0,9,91,102,15,0,0,0,0,0,0,103,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,9,0,0,0,0,0,0,0,0,0,0,0,0,38,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,13,100,88,203,60,102,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,94,100,23,0,0,0,0,0,0,198,172,0,0,0,0,0,0,229,21,0,0,166,186,0,0,230,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,27,0,0,0,0,0,0,0,0,104,64,197,72,0,0,101,106,0,0,0,0,0,0,0,0,0,0,198,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,125,202,122,0,0,72,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,107,68,12,0,0,0,0,0,0,0,0,0,0,0,0,74,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0,0,0,0,105,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,7,37,26,0,0,36,69,0,0,0,0,142,2,165,74,0,0,199,201,0,0,0,0,0,0,0,0,0,0,196,18,48,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,24,0,0,0,0,71,98,207,16,0,0,0,0,0,0,73,17,198,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,5,135,25,0,0,196,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,18,100,0,0,0,0,0,0,0,0,0,200,117,0,0,0,0,100,127,0,0,0,0,0,0,0,0,0,0,0,0,105,8,165,35,0,0,0,0,23,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,43,164,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,211,0,0,0,0,0,0,0,0,41,69,165,62,0,0,0,0,0,0,0,0,136,123,0,0,0,0,0,0,238,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,63,103,140,0,0,0,0,0,0,0,0,0,0,135,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,251,0,0,0,0,0,0,230,199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,36,3,171,77,7,156,41,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,55,196,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,105,0,0,0,0,0,0,0,0,0,0,172,86,0,0,74,81,69,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,110,0,0,104,59,0,0,0,0,5,127,104,22,71,75,234,13,38,41,0,0,0,0,0,0,7,233,0,0,0,0,0,0,0,0,41,119,6,236,0,0,0,0,137,97,0,0,0,0,0,0,76,10,0,0,0,0,0,0,0,0,165,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,119,10,14,0,0,0,0,0,0,9,88,100,66,0,0,0,0,0,0,0,0,0,0,0,0,41,42,38,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,114,38,233,0,0,0,0,40,32,5,2,0,0,196,60,0,0,0,0,0,0,4,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,29,0,0,0,0,229,101,0,0,0,0,232,92,103,248,168,25,166,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,27,134,56,170,73,0,0,9,22,164,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,138,235,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,107,0,0,0,0,134,37,0,0,166,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,0,231,16,105,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,78,0,0,0,0,0,0,0,0,0,0,0,0,106,104,0,0,0,0,0,0,200,75,199,50,0,0,102,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,19,132,46,0,0,197,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,186,0,0,0,0,0,0,38,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,91,167,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,238,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,33,229,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,102,0,0,0,0,0,0,102,89,0,0,0,0,0,0,134,108,0,0,230,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,131,0,0,0,0,0,0,197,118,0,0,38,135,0,0,103,199,0,0,0,0,0,0,0,0,116,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,5,137,85,0,0,0,0,0,0,0,0,0,0,0,0,198,200,0,0,38,97,0,0,135,127,0,0,0,0,0,0,199,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,43,0,0,0,0,0,0,0,0,0,0,0,0,109,32,135,226,0,0,0,0,0,0,229,120,0,0,0,0,8,101,36,59,202,35,0,0,0,0,0,0,0,0,0,0,0,0,196,99,168,78,196,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,64,37,42,77,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,18,0,0,0,0,199,205,0,0,0,0,0,0,0,0,0,0,36,58,0,0,0,0,0,0,164,65,0,0,0,0,0,0,0,0,0,0,0,0,106,37,167,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,133,0,0,0,0,0,0,0,0,0,0,132,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,29,70,10,0,0,39,154,200,111,68,120,0,0,0,0,0,0,0,0,169,91,229,61,0,0,0,0,0,0,0,0,0,0,134,150,0,0,0,0,0,0,229,69,105,62,0,0,8,28,166,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,12,199,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,91,0,0,0,0,168,70,228,90,0,0,134,243,0,0,0,0,0,0,229,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,149,0,0,0,0,0,0,0,0,0,0,0,0,204,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,40,68,50,139,72,0,0,0,0,101,7,0,0,0,0,82,4,0,0,8,112,36,120,0,0,166,160,0,0,0,0,212,5,0,0,237,59,0,0,0,0,0,0,0,0,164,10,0,0,228,82,0,0,0,0,0,0,0,0,0,0,228,97,40,8,68,85,0,0,0,0,0,0,0,0,0,0,102,1,0,0,0,0,0,0,0,0,0,0,68,65,0,0,0,0,0,0,132,6,0,0,0,0,0,0,0,0,0,0,228,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,42,0,0,0,0,0,0,0,0,0,0,169,49,36,35,0,0,0,0,105,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,14,0,0,110,6,0,0,0,0,68,107,0,0,102,134,232,66,5,56,0,0,0,0,0,0,0,0,0,0,71,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,33,42,84,228,39,168,56,6,42,0,0,230,68,0,0,0,0,73,27,199,175,170,8,5,32,0,0,0,0,8,119,134,247,0,0,36,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,10,0,0,0,0,0,0,14,44,71,79,0,0,0,0,0,0,0,0,0,0,68,77,0,0,0,0,0,0,0,0,0,0,0,0,49,9,100,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,21,228,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,134,0,0,0,0,0,0,0,0,0,0,0,0,72,60,38,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,48,5,42,0,0,0,0,0,0,102,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,115,0,0,39,9,0,0,0,0,0,0,0,0,0,0,103,246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,182,0,0,133,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,5,36,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,19,0,0,0,0,0,0,0,0,0,0,6,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,3,0,0,0,0,39,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,59,0,0,0,0,0,0,0,0,0,0,0,0,108,11,167,182,104,26,68,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,133,0,0,0,0,137,15,164,1,0,0,0,0,0,0,199,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,91,138,101,0,0,0,0,68,21,0,0,0,0,0,0,5,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,65,0,0,0,0,18,18,71,91,0,0,0,0,168,122,0,0,0,0,229,13,0,0,0,0,138,16,0,0,0,0,0,0,0,0,0,0,0,0,70,111,0,0,0,0,0,0,0,0,0,0,133,55,0,0,103,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,15,0,0,0,0,0,0,0,0,38,255,136,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,117,0,0,102,124,0,0,0,0,234,31,0,0,0,0,69,17,234,107,164,120,0,0,0,0,236,78,0,0,0,0,0,0,0,0,70,174,8,40,132,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,112,0,0,132,86,0,0,0,0,0,0,0,0,0,0,71,115,0,0,101,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,119,0,0,0,0,0,0,0,0,0,0,0,0,165,114,0,0,135,137,0,0,0,0,0,0,166,146,0,0,70,241,136,33,101,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,48,69,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,78,0,0,0,0,0,0,229,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,140,0,0,0,0,0,0,68,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,82,165,4,0,0,0,0,0,0,134,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,41,167,56,0,0,0,0,0,0,0,0,233,65,0,0,0,0,0,0,0,0,70,12,0,0,0,0,11,72,0,0,0,0,0,0,0,0,0,0,141,10,0,0,104,24,166,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,36,0,0,0,0,74,95,198,8,0,0,0,0,0,0,103,164,0,0,102,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,26,103,16,0,0,0,0,0,0,0,0,171,99,0,0,207,4,0,0,110,22,7,61,0,0,4,117,0,0,165,56,0,0,0,0,0,0,0,0,0,0,103,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,81,0,0,39,63,0,0,0,0,0,0,230,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,54,0,0,0,0,68,39,0,0,0,0,0,0,0,0,8,29,7,171,201,66,0,0,0,0,0,0,0,0,0,0,105,3,0,0,0,0,0,0,142,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,33,7,92,0,0,38,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,105,0,0,231,15,0,0,0,0,0,0,6,148,0,0,198,161,0,0,0,0,0,0,0,0,136,45,0,0,0,0,0,0,0,0,0,0,171,15,230,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,106,196,78,0,0,0,0,0,0,0,0,0,0,4,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,180,136,15,199,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,15,100,12,0,0,0,0,169,64,100,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,10,0,0,0,0,0,0,0,0,0,0,0,0,230,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,183,0,0,69,119,0,0,0,0,72,52,6,38,73,51,0,0,0,0,0,0,0,0,198,91,0,0,0,0,0,0,0,0,0,0,198,227,0,0,0,0,0,0,199,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,1,0,0,0,0,0,0,0,0,0,0,0,0,43,20,37,14,172,8,0,0,0,0,0,0,0,0,0,0,0,0,68,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,67,0,0,101,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,75,0,0,0,0,0,0,0,0,0,0,0,0,197,81,0,0,0,0,138,23,38,34,0,0,0,0,0,0,228,67,0,0,71,51,75,12,0,0,0,0,164,117,0,0,0,0,75,23,68,31,0,0,38,223,0,0,0,0,0,0,0,0,0,0,102,167,200,57,39,120,0,0,132,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,66,0,0,0,0,0,0,0,0,0,0,0,0,72,59,135,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,58,133,118,0,0,0,0,0,0,0,0,44,82,38,94,0,0,0,0,0,0,0,0,171,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,66,43,123,165,104,0,0,167,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,36,68,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,80,0,0,0,0,0,0,38,154,73,30,0,0,105,110,0,0,74,34,6,251,0,0,228,87,172,35,0,0,0,0,100,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,102,37,109,74,62,39,77,0,0,228,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,35,0,0,41,50,0,0,201,16,166,97,11,53,37,4,0,0,199,250,0,0,0,0,72,34,0,0,0,0,71,235,0,0,68,99,0,0,0,0,0,0,7,231,0,0,0,0,0,0,0,0,0,0,0,0,8,56,230,5,0,0,0,0,0,0,230,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,77,0,0,0,0,0,0,0,0,11,58,0,0,0,0,0,0,0,0,6,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,55,0,0,74,116,0,0,0,0,0,0,0,0,0,0,72,55,134,8,0,0,0,0,0,0,0,0,0,0,6,141,139,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,61,0,0,0,0,0,0,0,0,0,0,0,0,230,88,0,0,0,0,48,1,0,0,10,105,100,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,20,135,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,84,201,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,141,0,0,0,0,0,0,0,0,0,0,38,92,0,0,135,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,42,196,71,0,0,0,0,0,0,0,0,0,0,6,137,106,61,167,50,0,0,0,0,0,0,0,0,0,0,39,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,209,0,0,230,150,0,0,0,0,0,0,0,0,0,0,0,0,9,118,69,44,0,0,0,0,0,0,0,0,200,74,0,0,41,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,221,234,93,0,0,173,4,0,0,0,0,134,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,32,233,23,196,72,0,0,0,0,0,0,0,0,0,0,0,0,202,98,0,0,0,0,0,0,0,0,0,0,168,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,16,70,38,107,126,0,0,0,0,0,0,0,0,0,0,105,37,0,0,0,0,0,0,0,0,0,0,0,0,164,104,0,0,0,0,0,0,0,0,0,0,0,0,136,32,37,41,0,0,0,0,0,0,0,0,0,0,6,165,0,0,0,0,0,0,0,0,0,0,0,0,210,19,36,82,0,0,231,148,0,0,0,0,0,0,0,0,0,0,0,0,248,0,0,0,200,121,102,242,0,0,39,208,0,0,0,0,0,0,0,0,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,36,69,8,0,0,0,0,0,0,0,0,202,61,231,21,0,0,102,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,71,164,2,74,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,15,0,0,0,0,230,155,0,0,0,0,200,6,134,210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,105,228,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,51,0,0,4,10,239,3,0,0,0,0,0,0,0,0,167,83,0,0,39,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,162,10,88,101,37,0,0,0,0,0,0,102,34,0,0,0,0,8,27,100,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,164,0,0,0,0,140,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,64,0,0,0,0,0,0,0,0,0,0,0,0,46,6,228,6,210,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,45,0,0,0,0,0,0,0,0,107,47,0,0,73,38,132,9,137,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,157,0,0,0,0,0,0,70,132,0,0,0,0,0,0,0,0,0,0,4,82,0,0,0,0,0,0,0,0,0,0,7,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,171,77,1,71,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,104,0,0,133,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,19,102,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,42,0,0,0,0,0,0,0,0,0,0,70,101,0,0,0,0,0,0,0,0,0,0,0,0,235,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,32,0,0,73,68,6,31,0,0,196,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,70,168,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,87,0,0,0,0,0,0,36,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,114,198,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,35,0,0,0,0,8,5,199,54,0,0,0,0,0,0,0,0,0,0,198,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,121,230,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,121,0,0,102,44,0,0,0,0,0,0,36,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,33,229,65,11,13,0,0,0,0,0,0,0,0,166,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,110,0,0,196,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,5,0,0,0,0,230,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,244,74,56,228,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,174,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,142,0,0,166,148,0,0,0,0,0,0,229,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,105,0,0,0,0,10,66,0,0,40,58,69,47,0,0,0,0,0,0,0,0,0,0,0,0,174,40,103,112,9,85,7,235,0,0,70,221,0,0,0,0,0,0,0,0,0,0,4,81,0,0,0,0,0,0,0,0,0,0,0,0,8,103,37,118,0,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,8,44,167,205,0,0,4,19,0,0,0,0,0,0,102,76,0,0,0,0,0,0,0,0,0,0,197,125,0,0,0,0,0,0,0,0,0,0,133,52,0,0,0,0,0,0,7,104,0,0,0,0,0,0,0,0,0,0,229,43,0,0,0,0,0,0,0,0,200,9,5,5,0,0,0,0,136,7,0,0,0,0,0,0,0,0,70,169,41,93,132,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,95,231,243,104,27,135,13,233,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,62,229,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,235,233,88,165,25,0,0,0,0,168,120,38,108,0,0,0,0,0,0,197,66,0,0,0,0,0,0,0,0,105,86,0,0,0,0,0,0,169,29,102,55,0,0,102,194,0,0,0,0,0,0,0,0,0,0,70,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,72,0,0,0,0,0,0,0,0,42,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,102,0,0,101,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,115,0,0,0,0,0,0,37,83,0,0,0,0,0,0,0,0,0,0,167,237,0,0,0,0,0,0,0,0,0,0,36,33,108,33,165,11,0,0,0,0,0,0,103,181,0,0,0,0,0,0,0,0,0,0,103,93,137,103,134,98,107,38,7,23,0,0,199,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,36,37,29,0,0,0,0,0,0,69,122,105,105,36,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,106,196,121,0,0,0,0,0,0,0,0,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,63,0,0,0,0,0,0,0,0,0,0,102,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,25,0,0,0,0,0,0,39,130,0,0,0,0,0,0,6,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,86,75,29,198,96,0,0,4,42,0,0,231,174,212,2,0,0,168,100,69,100,41,97,229,20,169,98,0,0,0,0,38,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,1,201,72,101,1,0,0,0,0,136,25,4,33,0,0,0,0,10,7,0,0,0,0,166,239,0,0,197,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,89,0,0,0,0,233,114,0,0,0,0,0,0,72,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,108,0,0,0,0,136,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,23,0,0,0,0,0,0,0,0,0,0,70,133,0,0,0,0,0,0,0,0,110,8,0,0,210,21,132,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,95,0,0,0,0,0,0,0,0,105,9,38,17,0,0,132,94,0,0,0,0,0,0,0,0,0,0,0,0,8,126,68,105,107,80,0,0,0,0,0,0,107,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,16,164,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,92,0,0,170,48,231,39,0,0,0,0,74,98,0,0,0,0,0,0,0,0,0,0,0,0,134,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,128,0,0,0,0,0,0,102,135,0,0,0,0,0,0,0,0,0,0,70,153,0,0,0,0,0,0,0,0,136,44,68,7,169,22,164,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,59,0,0,0,0,0,0,100,53,0,0,166,51,0,0,68,91,0,0,0,0,0,0,0,0,0,0,165,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,99,0,0,0,0,0,0,39,224,0,0,0,0,0,0,68,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,11,71,36,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,84,40,113,134,232,0,0,0,0,0,0,37,92,0,0,0,0,0,0,70,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,18,140,15,135,110,0,0,0,0,0,0,0,0,0,0,100,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,84,0,0,199,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,85,0,0,229,114,0,0,0,0,180,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,12,68,10,0,0,0,0,0,0,0,0,0,0,196,119,0,0,0,0,0,0,229,112,0,0,0,0,0,0,0,0,108,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,45,0,0,0,0,0,0,0,0,70,86,0,0,36,88,105,81,0,0,0,0,231,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,157,0,0,0,0,44,62,102,154,0,0,167,53,0,0,0,0,0,0,0,0,10,113,0,0,137,96,166,15,0,0,0,0,0,0,36,105,0,0,0,0,0,0,0,0,0,0,134,107,72,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,96,0,0,73,96,6,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,89,0,0,137,80,167,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,80,7,38,0,0,228,78,0,0,0,0,0,0,0,0,8,110,39,189,0,0,0,0,0,0,0,0,0,0,167,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,54,0,0,0,0,0,0,0,0,0,0,198,68,0,0,0,0,138,59,71,116,10,103,37,69,0,0,0,0,136,56,0,0,232,18,0,0,0,0,0,0,0,0,0,0,0,0,132,96,0,0,133,36,234,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,63,0,0,0,0,38,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,97,0,0,0,0,0,0,0,0,0,0,0,0,106,75,103,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,29,4,114,0,0,0,0,0,0,0,0,0,0,38,122,0,0,0,0,136,89,71,12,0,0,0,0,0,0,0,0,0,0,165,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,133,83,0,0,4,45,0,0,0,0,0,0,0,0,0,0,0,0,12,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,1,199,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,166,158,0,0,0,0,233,57,0,0,0,0,0,0,0,0,0,0,0,0,199,181,0,0,230,160,11,75,0,0,168,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,13,135,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,132,0,0,0,0,0,0,0,0,72,0,100,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,57,0,0,0,0,0,0,0,0,0,0,132,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,73,40,78,0,0,0,0,0,0,0,0,134,9,136,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,95,0,0,196,77,0,0,0,0,0,0,165,31,0,0,71,68,0,0,0,0,41,9,0,0,10,32,7,78,0,0,0,0,108,4,133,26,0,0,0,0,73,93,0,0,0,0,0,0,202,18,0,0,0,0,70,183,0,0,0,0,0,0,102,162],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+30754);allocate([198,189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,153,0,0,0,0,0,0,5,102,0,0,0,0,0,0,0,0,0,0,0,0,236,19,0,0,0,0,0,0,0,0,0,0,200,91,165,108,8,7,196,67,0,0,0,0,0,0,0,0,0,0,0,0,73,25,4,29,0,0,0,0,0,0,0,0,136,26,0,0,0,0,0,0,0,0,0,0,232,13,134,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,214,0,0,0,0,14,27,0,0,0,0,0,0,0,0,164,16,0,0,0,0,0,0,0,0,0,0,70,81,0,0,0,0,0,0,0,0,49,7,102,12,0,0,0,0,0,0,0,0,41,99,198,30,0,0,0,0,0,0,0,0,232,127,0,0,0,0,199,37,0,0,231,233,0,0,4,91,137,31,0,0,0,0,166,57,0,0,0,0,0,0,102,40,0,0,0,0,0,0,0,0,0,0,0,0,232,96,167,57,0,0,0,0,0,0,0,0,0,0,0,0,139,21,0,0,0,0,4,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,9,231,90,0,0,228,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,54,164,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,99,0,0,0,0,0,0,0,0,232,19,0,0,203,55,199,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,49,0,0,0,0,0,0,0,0,43,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,21,0,0,0,0,70,53,10,76,0,0,0,0,0,0,0,0,0,0,41,122,0,0,74,31,0,0,0,0,0,0,0,0,0,0,139,12,0,0,0,0,0,0,0,0,198,247,0,0,0,0,0,0,0,0,0,0,133,59,0,0,0,0,0,0,0,0,0,0,0,0,73,82,133,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,55,0,0,0,0,0,0,0,0,196,65,0,0,0,0,233,124,132,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,45,228,34,0,0,0,0,0,0,231,217,0,0,68,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,109,0,0,230,103,0,0,0,0,9,104,70,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,244,0,0,0,0,0,0,0,0,138,64,7,109,0,0,0,0,41,39,4,28,0,0,0,0,11,3,0,0,104,1,69,68,0,0,0,0,0,0,39,242,72,30,37,30,214,5,0,0,0,0,0,0,201,103,38,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,103,234,40,196,125,0,0,0,0,0,0,0,0,0,0,135,197,137,64,196,45,0,0,0,0,0,0,0,0,0,0,6,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,241,0,0,68,103,0,0,0,0,0,0,0,0,232,77,102,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,36,0,0,134,114,0,0,0,0,0,0,0,0,0,0,7,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,183,0,0,70,196,0,0,68,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,241,0,0,199,71,0,0,68,82,169,97,0,0,0,0,0,0,0,0,0,0,200,46,0,0,0,0,0,0,0,0,231,91,0,0,0,0,0,0,0,0,0,0,0,0,107,40,4,43,0,0,71,73,0,0,0,0,0,0,0,0,105,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,77,40,107,0,0,0,0,0,0,0,0,0,0,136,86,0,0,0,0,0,0,0,0,0,0,0,0,230,102,0,0,0,0,0,0,36,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,85,0,0,0,0,0,0,0,0,104,76,197,26,136,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,238,2,0,0,0,0,230,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,180,0,0,0,0,113,2,70,89,0,0,0,0,0,0,0,0,74,12,36,92,0,0,0,0,8,65,198,219,0,0,0,0,74,30,229,5,0,0,0,0,106,67,101,17,0,0,0,0,0,0,0,0,141,48,0,0,0,0,0,0,0,0,166,31,0,0,0,0,0,0,0,0,0,0,0,0,138,31,0,0,44,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,54,100,13,0,0,228,108,0,0,0,0,0,0,164,28,0,0,0,0,0,0,0,0,0,0,228,112,0,0,0,0,236,8,0,0,0,0,165,68,201,0,228,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,122,40,108,37,88,0,0,0,0,0,0,39,20,0,0,0,0,0,0,0,0,232,17,7,67,0,0,0,0,0,0,134,173,42,38,133,90,0,0,0,0,0,0,101,2,0,0,0,0,0,0,101,49,0,0,0,0,0,0,0,0,0,0,196,105,74,9,0,0,0,0,0,0,136,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,86,40,117,39,62,0,0,0,0,0,0,0,0,0,0,198,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,197,0,0,0,0,0,0,0,0,0,0,0,0,72,2,133,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,74,0,0,0,0,0,0,4,126,0,0,0,0,0,0,100,101,139,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,40,231,241,0,0,0,0,0,0,199,251,169,12,231,250,0,0,0,0,75,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,3,167,134,0,0,0,0,0,0,166,152,0,0,0,0,203,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,83,0,0,106,62,38,208,0,0,0,0,40,12,196,2,0,0,0,0,0,0,0,0,0,0,37,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,4,198,16,104,19,199,60,0,0,230,173,0,0,0,0,0,0,0,0,0,0,229,73,0,0,0,0,0,0,0,0,0,0,0,0,200,38,133,47,0,0,0,0,0,0,0,0,41,51,132,45,0,0,0,0,0,0,70,60,0,0,0,0,232,32,164,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,11,0,0,228,51,0,0,133,43,0,0,0,0,0,0,132,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,20,102,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,51,0,0,0,0,0,0,0,0,0,0,0,0,41,32,38,165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,142,0,0,0,0,0,0,36,31,0,0,0,0,0,0,5,72,0,0,0,0,0,0,0,0,238,28,0,0,0,0,0,0,9,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,54,166,123,43,118,7,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,10,0,0,0,0,0,0,0,0,0,0,108,97,71,67,0,0,0,0,0,0,165,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,61,0,0,0,0,0,0,0,0,0,0,8,39,199,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,66,134,58,0,0,0,0,0,0,0,0,0,0,134,185,0,0,0,0,0,0,0,0,0,0,0,0,233,101,38,76,0,0,0,0,0,0,0,0,0,0,134,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,112,0,0,0,0,0,0,0,0,231,166,0,0,134,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,137,0,0,7,188,236,81,38,120,0,0,0,0,0,0,0,0,0,0,37,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,154,0,0,0,0,168,53,4,60,0,0,0,0,0,0,0,0,106,92,199,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,88,0,0,0,0,0,0,0,0,0,0,6,230,44,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,252,0,0,0,0,0,0,0,0,0,0,6,186,0,0,0,0,0,0,198,198,0,0,0,0,0,0,0,0,0,0,102,157,144,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,5,0,0,145,4,0,0,206,2,71,180,72,47,0,0,0,0,0,0,0,0,0,0,0,0,102,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,4,0,0,0,0,198,131,168,90,102,45,0,0,134,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,116,230,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,100,0,0,0,0,0,0,0,0,165,101,0,0,0,0,0,0,0,0,43,2,5,89,0,0,36,77,233,6,6,40,232,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,55,0,0,11,23,231,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,42,0,0,0,0,0,0,76,63,0,0,0,0,0,0,0,0,0,0,106,105,165,9,0,0,68,57,0,0,0,0,0,0,0,0,0,0,135,177,202,47,166,13,203,17,70,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,11,0,0,0,0,0,0,139,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,154,0,0,0,0,0,0,0,0,0,0,0,0,107,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,131,0,0,39,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,248,0,0,0,0,72,15,0,0,0,0,68,29,0,0,0,0,0,0,6,122,0,0,0,0,0,0,0,0,0,0,0,0,168,68,167,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,65,197,53,0,0,0,0,174,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,63,0,0,0,0,0,0,0,0,105,101,198,78,0,0,0,0,0,0,228,42,0,0,0,0,0,0,0,0,0,0,4,56,234,73,231,56,0,0,167,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,71,0,0,0,0,0,0,0,0,0,0,230,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,81,0,0,0,0,0,0,38,220,0,0,198,149,0,0,0,0,0,0,0,0,42,37,231,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,84,0,0,0,0,112,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,4,0,0,173,5,0,0,0,0,0,0,0,0,0,0,42,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,15,0,0,0,0,0,0,198,202,0,0,0,0,0,0,0,0,0,0,36,90,40,18,0,0,0,0,0,0,104,18,7,99,0,0,0,0,0,0,100,89,0,0,0,0,0,0,0,0,0,0,231,249,0,0,0,0,72,9,5,21,0,0,0,0,48,8,0,0,0,0,0,0,45,13,134,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,120,0,0,0,0,0,0,0,0,20,0,0,0,139,53,164,125,0,0,0,0,40,50,7,12,0,0,0,0,0,0,0,0,0,0,102,199,145,14,0,0,168,127,0,0,0,0,0,0,0,0,0,0,200,18,39,245,0,0,0,0,8,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,37,0,0,0,0,230,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,74,0,0,101,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,152,0,0,0,0,0,0,132,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,16,0,0,0,0,0,0,0,0,104,23,0,0,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,53,0,0,168,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,16,6,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,117,0,0,0,0,73,109,0,0,0,0,0,0,0,0,0,0,200,96,0,0,0,0,0,0,0,0,0,0,146,11,0,0,0,0,0,0,0,0,0,0,0,0,196,103,169,87,0,0,0,0,0,0,0,0,0,0,72,53,228,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,75,102,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,55,104,20,230,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,100,0,0,0,0,0,0,0,0,0,0,0,0,46,29,0,0,0,0,0,0,0,0,71,249,0,0,102,217,0,0,0,0,40,49,0,0,238,44,37,37,0,0,0,0,0,0,167,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,45,0,0,0,0,0,0,238,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,83,0,0,0,0,103,209,0,0,230,81,0,0,0,0,0,0,7,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,35,204,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,31,0,0,0,0,169,13,198,31,0,0,197,32,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,83,136,121,164,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,111,0,0,0,0,0,0,199,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,45,71,25,0,0,0,0,0,0,0,0,168,48,6,70,0,0,0,0,0,0,39,105,0,0,0,0,200,70,0,0,0,0,0,0,72,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,114,0,0,0,0,0,0,39,170,0,0,0,0,0,0,0,0,0,0,0,0,136,61,133,29,0,0,198,231,0,0,0,0,200,39,197,23,0,0,7,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,43,0,0,0,0,0,0,0,0,232,118,134,246,0,0,0,0,0,0,0,0,0,0,0,0,9,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,2,0,0,40,73,167,10,0,0,228,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,18,0,0,115,10,0,0,0,0,164,126,0,0,0,0,0,0,71,240,0,0,0,0,42,57,132,15,75,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,149,80,10,0,0,10,44,197,56,50,7,0,0,0,0,167,166,137,49,102,13,0,0,69,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,25,0,0,0,0,0,0,0,0,0,0,69,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,49,100,4,0,0,0,0,0,0,0,0,0,0,36,115,0,0,0,0,0,0,7,212,0,0,230,189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,122,0,0,0,0,0,0,0,0,6,134,0,0,0,0,0,0,4,89,0,0,166,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,147,0,0,0,0,0,0,7,201,23,2,0,0,0,0,0,0,0,0,165,60,0,0,0,0,0,0,0,0,0,0,0,0,40,19,164,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,6,0,0,180,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,102,0,0,0,0,0,0,0,0,0,0,171,114,0,0,0,0,0,0,0,0,7,98,0,0,0,0,0,0,0,0,239,16,0,0,0,0,0,0,0,0,0,0,202,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,104,230,214,0,0,0,0,0,0,0,0,0,0,135,106,0,0,0,0,0,0,0,0,0,0,4,119,0,0,0,0,0,0,0,0,10,71,0,0,0,0,0,0,0,0,0,0,9,56,0,0,0,0,0,0,104,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,228,42,82,0,0,43,91,70,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,50,0,0,0,0,11,19,0,0,0,0,0,0,0,0,7,114,0,0,0,0,0,0,0,0,0,0,0,0,104,6,7,40,0,0,164,55,0,0,0,0,0,0,0,0,106,69,0,0,0,0,0,0,0,0,0,0,75,48,0,0,0,0,229,29,0,0,0,0,72,16,103,10,0,0,228,17,0,0,101,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,119,0,0,0,0,0,0,0,0,0,0,68,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,0,165,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,117,0,0,133,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,110,107,73,101,27,202,49,36,24,0,0,167,145,0,0,0,0,8,104,38,30,233,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,31,68,70,0,0,68,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,61,6,27,0,0,0,0,0,0,0,0,107,27,167,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,16,199,216,106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,87,133,75,0,0,0,0,8,107,0,0,105,24,196,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,208,0,0,0,0,0,0,230,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,153,0,0,0,0,0,0,0,0,0,0,228,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,32,71,15,0,0,0,0,0,0,166,104,0,0,0,0,0,0,0,0,0,0,0,0,168,126,0,0,0,0,38,72,0,0,0,0,0,0,134,57,104,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,3,69,10,0,0,0,0,0,0,166,75,0,0,0,0,0,0,198,155,0,0,0,0,0,0,0,0,137,8,197,34,168,20,100,20,168,97,0,0,0,0,0,0,0,0,0,0,0,0,38,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,139,0,0,0,0,8,90,39,244,106,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,53,198,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,73,135,164,0,0,0,0,0,0,0,0,0,0,5,52,0,0,0,0,0,0,134,162,0,0,231,105,0,0,0,0,202,82,197,44,0,0,0,0,0,0,0,0,232,104,230,227,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,81,70,190,0,0,0,0,0,0,0,0,0,0,0,0,107,20,0,0,0,0,0,0,0,0,0,0,77,39,68,122,0,0,0,0,0,0,36,75,0,0,0,0,0,0,0,0,0,0,69,118,72,54,0,0,0,0,0,0,232,78,103,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,41,103,183,235,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,8,0,0,0,0,0,0,0,0,167,175,0,0,0,0,0,0,0,0,0,0,0,0,137,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,41,0,0,0,0,0,0,0,0,0,0,101,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,63,0,0,197,40,0,0,0,0,105,4,100,86,202,81,0,0,0,0,0,0,168,4,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,14,6,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,72,0,0,0,0,0,0,0,0,168,49,198,15,42,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,25,197,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,66,7,154,0,0,0,0,0,0,0,0,0,0,230,117,0,0,197,83,235,28,4,110,0,0,38,202,0,0,0,0,0,0,167,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,52,0,0,0,0,200,1,69,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,58,0,0,0,0,0,0,0,0,0,0,73,104,6,86,169,51,164,44,0,0,0,0,0,0,196,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,5,37,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,24,0,0,0,0,171,70,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,86,0,0,0,0,0,0,196,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,114,140,14,0,0,0,0,0,0,0,0,6,170,0,0,0,0,0,0,68,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,84,134,38,0,0,164,88,73,124,134,234,0,0,132,28,0,0,0,0,0,0,7,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,196,0,0,231,254,8,17,134,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,112,0,0,0,0,73,117,198,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,183,0,0,229,124,0,0,100,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,93,0,0,0,0,0,0,0,0,0,0,5,57,0,0,0,0,0,0,38,182,136,22,167,86,0,0,0,0,0,0,0,0,0,0,0,0,18,6,100,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,42,0,0,0,0,0,0,0,0,102,136,0,0,0,0,0,0,0,0,236,86,0,0,0,0,7,183,0,0,0,0,0,0,0,0,0,0,231,121,0,0,0,0,237,41,0,0,0,0,102,247,0,0,0,0,0,0,0,0,168,33,199,195,201,78,68,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,226,202,23,5,0,0,0,0,0,200,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,1,6,29,0,0,199,119,0,0,0,0,104,72,196,47,0,0,132,26,0,0,0,0,0,0,0,0,104,121,36,85,0,0,0,0,11,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,81,0,0,0,0,0,0,0,0,113,8,0,0,0,0,0,0,0,0,0,0,0,0,230,93,0,0,0,0,0,0,0,0,232,52,230,28,0,0,0,0,10,127,133,37,0,0,0,0,0,0,0,0,136,12,166,29,0,0,0,0,0,0,70,171,0,0,0,0,0,0,7,151,0,0,0,0,0,0,0,0,0,0,102,152,45,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,24,0,0,0,0,108,53,0,0,0,0,0,0,0,0,166,118,40,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,86,0,0,0,0,0,0,0,0,0,0,70,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,73,6,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,18,0,0,0,0,0,0,0,0,132,73,152,0,0,0,0,0,0,0,0,0,0,0,204,51,228,28,0,0,0,0,170,94,230,32,0,0,132,76,0,0,0,0,0,0,4,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,28,0,0,0,0,0,0,0,0,78,7,164,50,0,0,197,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,124,107,16,228,65,9,2,0,0,200,73,135,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,17,199,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,143,0,0,0,0,0,0,6,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,25,229,50,232,37,71,152,0,0,0,0,0,0,0,0,168,0,165,40,0,0,0,0,0,0,0,0,138,1,7,100,0,0,231,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,63,166,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,115,0,0,4,47,0,0,0,0,0,0,0,0,0,0,70,27,40,80,0,0,8,96,199,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,138,84,0,0,0,0,0,0,0,0,0,0,0,0,134,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,81,166,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,28,230,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,1,0,0,0,0,134,226,0,0,0,0,21,1,0,0,0,0,0,0,233,17,167,140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,165,0,0,0,0,0,0,0,0,233,71,198,199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,111,0,0,0,0,0,0,229,119,0,0,0,0,0,0,0,0,0,0,231,219,168,21,0,0,0,0,0,0,0,0,70,33,174,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,178,0,0,0,0,136,37,38,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,73,0,0,0,0,0,0,0,0,136,6,101,53,0,0,0,0,43,27,231,29,0,0,38,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,91,6,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,52,0,0,0,0,0,0,165,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,79,0,0,0,0,168,10,7,4,0,0,0,0,0,0,0,0,168,113,197,86,235,0,167,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,20,0,0,0,0,0,0,0,0,8,35,197,7,0,0,0,0,42,4,0,0,0,0,228,44,9,41,135,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,74,0,0,0,0,0,0,101,26,0,0,0,0,13,42,38,18,0,0,70,141,0,0,39,109,0,0,0,0,8,105,228,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,19,0,0,0,0,0,0,232,25,228,74,0,0,0,0,0,0,0,0,0,0,135,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,74,0,0,0,0,0,0,0,0,0,0,6,174,0,0,0,0,0,0,0,0,211,15,0,0,0,0,0,0,0,0,102,147,0,0,0,0,0,0,0,0,0,0,68,20,0,0,0,0,0,0,0,0,0,0,166,95,0,0,101,23,0,0,199,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,79,0,0,0,0,72,111,228,26,0,0,0,0,0,0,166,145,0,0,0,0,45,12,135,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,37,0,0,0,0,0,0,0,0,0,0,0,0,206,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,82,70,135,0,0,0,0,0,0,0,0,0,0,71,250,0,0,0,0,0,0,0,0,0,0,0,0,43,104,132,3,0,0,0,0,0,0,0,0,0,0,198,206,0,0,0,0,106,66,0,0,0,0,0,0,0,0,0,0,0,0,70,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,106,171,71,38,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,65,0,0,0,0,0,0,0,0,102,177,0,0,0,0,0,0,0,0,0,0,0,0,136,2,39,6,0,0,0,0,0,0,69,107,0,0,0,0,0,0,5,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,62,167,65,0,0,0,0,0,0,0,0,201,7,134,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,61,39,24,0,0,0,0,0,0,0,0,74,13,0,0,0,0,102,107,0,0,0,0,237,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,101,166,115,0,0,0,0,232,27,166,76,40,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,83,0,0,0,0,9,5,7,27,0,0,0,0,0,0,0,0,0,0,0,0,107,32,0,0,0,0,0,0,201,38,71,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,7,4,37,0,0,0,0,140,23,100,17,0,0,164,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,196,0,0,0,0,0,0,0,0,245,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,93,0,0,5,29,0,0,0,0,233,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,65,196,1,0,0,0,0,0,0,0,0,0,0,166,92,0,0,0,0,0,0,6,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,13,0,0,0,0,36,53,0,0,0,0,0,0,0,0,0,0,167,98,0,0,0,0,0,0,38,199,0,0,6,221,0,0,0,0,43,29,0,0,0,0,0,0,0,0,229,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,119,40,28,165,30,0,0,0,0,0,0,0,0,0,0,0,0,46,30,0,0,0,0,0,0,0,0,230,242,0,0,0,0,0,0,134,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,88,0,0,0,0,0,0,0,0,0,0,0,0,72,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,195,0,0,0,0,0,0,100,55,0,0,0,0,0,0,0,0,0,0,0,0,14,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,91,0,0,0,0,0,0,132,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,94,9,106,68,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,103,198,177,174,23,133,20,0,0,0,0,9,79,135,101,0,0,0,0,139,69,0,0,0,0,0,0,0,0,0,0,105,76,132,21,75,66,133,105,13,29,6,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,67,0,0,0,0,0,0,0,0,0,0,100,107,0,0,0,0,73,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,185,9,71,197,28,0,0,0,0,0,0,198,32,238,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,94,169,68,4,0,0,0,0,0,0,0,0,0,0,0,5,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,104,0,0,0,0,0,0,0,0,0,0,100,96],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+41002);allocate([37,115,0,0,0,0,0,0,69,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,38,134,55,0,0,0,0,0,0,0,0,0,0,0,0,232,93,134,22,0,0,0,0,11,103,228,22,0,0,0,0,107,113,100,2,0,0,231,151,0,0,0,0,0,0,0,0,0,0,0,0,104,48,230,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,205,168,82,134,11,0,0,100,57,0,0,0,0,76,41,166,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,68,70,2,0,0,0,0,0,0,198,217,0,0,0,0,0,0,165,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,22,0,0,0,0,42,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,121,0,0,0,0,0,0,0,0,0,0,7,41,0,0,0,0,137,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,223,0,0,0,0,72,120,6,166,0,0,0,0,0,0,135,38,139,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,73,0,0,0,0,0,0,0,0,0,0,0,0,197,76,232,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,99,231,89,0,0,0,0,200,40,69,26,0,0,0,0,0,0,164,87,201,94,5,59,0,0,0,0,0,0,103,243,202,34,230,134,0,0,0,0,0,0,0,0,0,0,0,0,168,50,68,48,0,0,0,0,72,79,197,5,40,120,0,0,72,101,132,65,0,0,0,0,202,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,66,0,0,165,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,162,0,0,197,97,0,0,0,0,0,0,68,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,86,231,227,0,0,0,0,0,0,231,94,0,0,0,0,0,0,0,0,0,0,135,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,49,196,9,0,0,0,0,0,0,135,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,65,0,0,0,0,0,0,0,0,0,0,0,0,9,53,230,26,0,0,0,0,0,0,0,0,232,83,5,41,0,0,36,66,0,0,0,0,0,0,0,0,0,0,134,89,0,0,166,188,73,44,102,8,0,0,0,0,0,0,0,0,105,7,166,17,0,0,0,0,0,0,0,0,0,0,0,0,232,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,119,0,0,0,0,0,0,0,0,203,5,199,53,73,52,69,75,168,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,169,176,6,0,0,0,0,0,0,0,0,198,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,57,0,0,0,0,230,217,0,0,0,0,8,47,196,123,0,0,0,0,0,0,0,0,0,0,102,200,0,0,0,0,76,31,0,0,0,0,0,0,0,0,0,0,200,80,69,27,0,0,7,189,11,0,0,0,0,0,101,71,0,0,228,56,0,0,0,0,0,0,134,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,74,38,20,0,0,164,43,0,0,134,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,93,6,54,0,0,0,0,0,0,0,0,0,0,0,0,170,40,229,27,0,0,0,0,0,0,0,0,0,0,196,70,0,0,0,0,0,0,100,7,43,60,134,54,0,0,4,6,40,57,69,76,137,94,164,96,0,0,0,0,0,0,101,94,0,0,39,152,0,0,0,0,0,0,0,0,0,0,164,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,68,132,44,110,13,101,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,125,0,0,0,0,0,0,0,0,207,1,0,0,0,0,134,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,20,0,0,0,0,0,0,0,0,0,0,0,0,41,101,166,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,62,0,0,0,0,0,0,76,38,37,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,54,42,90,69,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,25,0,0,228,119,0,0,0,0,0,0,6,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,179,0,0,38,60,0,0,0,0,0,0,0,0,0,0,0,0,138,9,132,10,0,0,0,0,0,0,0,0,0,0,229,126,0,0,0,0,0,0,100,39,0,0,0,0,0,0,0,0,0,0,0,0,233,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,89,0,0,0,0,0,0,70,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,27,0,0,200,116,68,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,159,74,67,71,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,5,0,0,0,0,0,0,0,0,0,0,231,53,42,12,230,52,8,83,167,29,0,0,0,0,0,0,7,33,0,0,0,0,168,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,56,0,0,0,0,0,0,72,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,78,0,0,200,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,44,0,0,0,0,0,0,199,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,8,103,29,168,114,196,117,0,0,0,0,0,0,167,119,0,0,197,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,242,2,0,0,0,0,5,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,68,233,29,4,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,135,134,0,0,0,0,44,69,0,0,0,0,0,0,235,59,71,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,62,0,0,0,0,41,58,167,32,0,0,0,0,0,0,0,0,168,1,0,0,0,0,0,0,0,0,0,0,0,0,230,98,72,31,71,80,0,0,0,0,0,0,167,178,170,110,164,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,122,132,125,0,0,0,0,0,0,0,0,42,68,0,0,0,0,0,0,0,0,0,0,0,0,102,118,0,0,134,148,0,0,0,0,0,0,0,0,0,0,4,113,0,0,0,0,0,0,0,0,0,0,134,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,86,43,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,86,0,0,0,0,42,89,71,48,0,0,0,0,0,0,0,0,104,5,230,0,0,0,0,0,0,0,0,0,0,0,0,0,13,53,167,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,113,0,0,0,0,0,0,0,0,0,0,9,69,70,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,10,6,226,44,6,0,0,0,0,0,0,0,0,6,229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,52,0,0,0,0,73,55,230,51,0,0,0,0,43,36,0,0,0,0,0,0,0,0,0,0,234,51,196,13,0,0,0,0,0,0,0,0,0,0,167,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,64,103,192,0,0,0,0,0,0,0,0,0,0,134,167,0,0,100,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,39,0,0,0,0,0,0,0,0,20,14,135,147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,60,133,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,4,196,104,0,0,0,0,0,0,101,47,72,27,5,1,138,82,36,127,0,0,0,0,0,0,0,0,0,0,0,0,237,13,102,48,233,80,6,28,0,0,0,0,201,63,199,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,57,0,0,0,0,0,0,0,0,0,0,0,0,70,119,0,0,0,0,0,0,71,49,0,0,230,170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,4,135,15,232,101,165,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,90,132,78,0,0,0,0,0,0,0,0,136,100,71,33,0,0,0,0,0,0,0,0,0,0,7,26,0,0,230,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,88,0,0,198,186,169,102,70,106,0,0,0,0,236,16,100,58,0,0,0,0,72,22,134,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,60,0,0,0,0,0,0,70,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,98,40,4,199,85,41,107,0,0,104,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,55,0,0,0,0,0,0,0,0,0,0,0,0,202,88,4,16,0,0,0,0,0,0,0,0,0,0,0,0,104,73,0,0,0,0,0,0,138,86,102,53,0,0,100,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,85,0,0,0,0,40,43,0,0,0,0,0,0,0,0,0,0,0,0,165,45,0,0,102,210,0,0,0,0,10,59,0,0,46,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151,3,0,0,0,0,0,0,172,124,0,0,72,72,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,28,0,0,0,0,0,0,0,0,200,12,0,0,0,0,0,0,0,0,70,108,200,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,6,0,0,104,14,0,0,0,0,0,0,0,0,38,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,216,82,3,132,60,0,0,0,0,0,0,39,23,74,77,38,52,0,0,102,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,59,202,32,0,0,0,0,0,0,0,0,0,0,0,0,198,103,0,0,0,0,0,0,0,0,105,21,197,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,27,0,0,8,80,228,2,0,0,0,0,13,45,71,198,0,0,0,0,0,0,0,0,0,0,135,81,0,0,0,0,0,0,0,0,0,0,199,95,0,0,0,0,0,0,0,0,72,37,39,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,81,197,27,73,113,0,0,0,0,166,126,232,123,134,244,0,0,0,0,0,0,0,0,234,62,0,0,0,0,0,0,169,114,69,19,0,0,0,0,0,0,133,89,0,0,135,105,0,0,0,0,0,0,0,0,168,77,100,11,0,0,0,0,0,0,0,0,137,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,238,12,0,0,204,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,72,0,0,0,0,0,0,101,96,0,0,0,0,0,0,101,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,79,0,0,0,0,0,0,200,64,101,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,106,0,0,0,0,0,0,0,0,4,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,49,101,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,11,37,124,0,0,0,0,0,0,0,0,0,0,0,0,8,25,100,16,88,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,45,39,179,0,0,0,0,0,0,0,0,136,72,229,12,0,0,0,0,200,99,228,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,4,165,57,0,0,166,106,0,0,0,0,234,33,229,16,0,0,0,0,0,0,0,0,78,42,0,0,0,0,132,37,201,58,101,52,0,0,0,0,0,0,0,0,0,0,0,0,137,104,0,0,0,0,0,0,0,0,0,0,0,0,38,242,0,0,0,0,0,0,0,0,0,0,36,49,0,0,0,0,168,44,0,0,0,0,0,0,0,0,0,0,235,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,48,0,0,0,0,0,0,0,0,0,0,0,0,104,9,196,0,169,72,231,168,0,0,228,37,0,0,0,0,138,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,133,0,0,0,0,171,89,68,13,0,0,0,0,0,0,0,0,0,0,69,111,238,53,70,78,0,0,0,0,0,0,0,0,74,88,0,0,0,0,0,0,109,6,68,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,103,0,0,0,0,42,2,0,0,0,0,0,0,0,0,39,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,3,231,108,76,62,0,0,72,57,69,123,0,0,0,0,0,0,0,0,0,0,0,0,106,54,0,0,0,0,0,0,0,0,0,0,202,120,0,0,41,16,135,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,124,200,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,102,0,0,231,240,0,0,0,0,0,0,0,0,73,12,68,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,1,0,0,11,20,199,130,0,0,135,61,0,0,0,0,0,0,0,0,0,0,0,0,40,16,166,5,0,0,0,0,0,0,0,0,0,0,0,0,40,44,199,69,0,0,0,0,0,0,0,0,0,0,37,98,0,0,0,0,0,0,38,143,40,10,0,0,0,0,0,0,75,95,37,44,0,0,0,0,0,0,0,0,0,0,6,253,0,0,0,0,0,0,100,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,4,38,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,251,0,0,0,0,168,34,132,0,0,0,0,0,171,57,135,95,0,0,0,0,0,0,38,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,180,0,0,0,0,0,0,6,146,0,0,0,0,0,0,38,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,31,0,0,0,0,9,27,0,0,0,0,0,0,233,22,0,0,0,0,0,0,139,119,0,0,0,0,0,0,106,90,4,67,0,0,0,0,0,0,0,0,0,0,167,35,0,0,0,0,0,0,7,70,0,0,0,0,0,0,0,0,0,0,68,86,0,0,0,0,0,0,0,0,0,0,199,155,0,0,0,0,178,19,0,0,234,74,0,0,0,0,0,0,0,0,0,0,108,61,199,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,56,0,0,0,0,0,0,0,0,196,23,0,0,0,0,0,0,0,0,0,0,37,125,0,0,0,0,0,0,0,0,0,0,197,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,164,0,0,0,0,169,104,134,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,108,0,0,0,0,0,0,0,0,74,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,153,0,0,4,38,0,0,71,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,3,0,0,8,4,166,6,74,99,100,105,11,88,0,0,173,35,69,14,168,60,102,77,41,18,0,0,104,2,103,254,0,0,0,0,0,0,167,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,124,100,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,193,0,0,70,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,127,0,0,0,0,0,0,196,101,203,15,0,0,0,0,6,158,0,0,0,0,200,101,101,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,111,5,7,0,0,0,0,148,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,0,0,0,0,0,0,0,0,69,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,139,0,0,0,0,11,41,0,0,0,0,0,0,169,16,0,0,141,24,7,21,0,0,0,0,0,0,0,0,0,0,6,144,0,0,167,155,0,0,0,0,72,67,197,13,234,108,6,227,0,0,0,0,168,51,166,16,0,0,0,0,0,0,70,122,0,0,0,0,40,84,166,11,105,46,0,0,0,0,0,0,0,0,0,0,0,0,197,65,41,3,0,0,76,94,228,41,0,0,0,0,0,0,0,0,203,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,4,37,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,22,72,46,0,0,0,0,134,206,200,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,22,36,12,0,0,38,67,0,0,0,0,0,0,0,0,0,0,230,92,136,97,230,46,104,125,6,112,0,0,0,0,0,0,231,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,93,0,0,0,0,0,0,0,0,0,0,210,15,0,0,43,5,132,98,0,0,0,0,0,0,165,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,52,204,103,198,141,0,0,0,0,0,0,0,0,204,67,71,196,168,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,46,102,171,0,0,0,0,0,0,0,0,170,15,164,40,0,0,0,0,0,0,0,0,0,0,0,0,106,40,0,0,0,0,102,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,89,0,0,0,0,0,0,0,0,0,0,0,0,105,118,6,237,169,78,133,15,0,0,0,0,0,0,0,0,0,0,0,0,8,52,102,9,105,10,165,17,0,0,0,0,0,0,167,66,0,0,0,0,213,0,0,0,0,0,0,0,0,0,0,0,0,0,69,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,42,0,0,0,0,0,0,0,0,235,111,6,0,0,0,0,0,138,35,164,27,0,0,165,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,106,0,0,0,0,106,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,23,235,123,133,110,0,0,0,0,0,0,0,0,144,7,231,119,0,0,0,0,0,0,0,0,0,0,166,206,0,0,0,0,72,115,166,248,0,0,196,79,0,0,0,0,138,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,95,0,0,0,0,0,0,0,0,0,0,0,0,166,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,30,36,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,174,0,0,5,70,0,0,0,0,105,0,70,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,73,0,0,0,0,231,158,0,0,0,0,0,0,196,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,243,104,38,167,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,7,164,23,0,0,0,0,106,46,0,0,0,0,0,0,0,0,4,69,0,0,102,110,0,0,102,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,109,0,0,0,0,0,0,135,223,49,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,82,0,0,0,0,39,243,0,0,0,0,0,0,0,0,0,0,70,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,141,0,0,0,0,0,0,4,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,51,0,0,4,122,0,0,0,0,0,0,0,0,0,0,230,87,0,0,0,0,0,0,0,0,0,0,0,0,72,23,69,40,0,0,0,0,0,0,101,28,0,0,0,0,0,0,0,0,9,70,0,0,200,60,103,174,0,0,0,0,0,0,0,0,0,0,71,58,0,0,0,0,0,0,0,0,106,80,230,20,0,0,0,0,0,0,134,178,0,0,133,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,139,72,70,0,0,0,0,0,0,0,0,0,0,137,39,0,0,0,0,0,0,0,0,0,0,0,0,102,221,0,0,0,0,0,0,0,0,0,0,199,148,137,16,0,0,79,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,39,0,0,0,0,0,0,229,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,36,0,0,0,0,0,0,0,0,40,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,153,0,0,167,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,183,0,0,0,0,0,0,0,0,0,0,38,86,10,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,0,0,0,46,41,0,0,0,0,0,0,0,0,71,28,0,0,0,0,0,0,0,0,0,0,231,231,0,0,0,0,169,57,0,0,0,0,0,0,0,0,71,168,0,0,0,0,0,0,0,0,0,0,166,10,0,0,0,0,110,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,146,0,0,0,0,0,0,132,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,55,229,34,0,0,0,0,0,0,0,0,0,0,164,36,0,0,0,0,0,0,0,0,9,66,37,2,0,0,0,0,0,0,0,0,182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,75,0,0,0,0,0,0,0,0,0,0,0,0,101,97,0,0,132,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,165,43,92,4,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,51,136,69,100,28,0,0,0,0,72,8,199,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,109,0,0,0,0,0,0,0,0,0,0,102,104,0,0,0,0,0,0,0,0,40,23,198,4,74,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,8,228,19,200,34,229,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,93,228,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,123,0,0,0,0,197,123,0,0,0,0,73,11,69,24,0,0,0,0,0,0,0,0,0,0,37,53,0,0,0,0,0,0,0,0,0,0,196,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,80,100,103,11,94,0,0,0,0,0,0,201,82,0,0,232,26,5,9,0,0,0,0,0,0,0,0,0,0,0,0,234,11,230,29,0,0,0,0,0,0,230,53,0,0,0,0,0,0,0,0,15,0,69,109,0,0,0,0,137,67,38,8,0,0,0,0,0,0,198,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,101,0,0,4,87,0,0,70,134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,90,0,0,0,0,72,100,0,0,0,0,0,0,19,7,38,167,0,0,68,121,0,0,0,0,136,117,0,0,0,0,0,0,0,0,0,0,9,31,0,0,0,0,230,243,0,0,0,0,45,5,0,0,108,1,198,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,31,231,76,0,0,0,0,0,0,135,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,46,0,0,0,0,0,0,0,0,104,96,198,207,42,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,160,0,0,230,94,0,0,4,15,41,48,0,0,0,0,0,0,170,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,102,0,0,0,0,0,0,0,0,0,0,0,0,234,24,0,0,87,1,230,18,0,0,0,0,0,0,38,95,168,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,209,5,199,135,0,0,0,0,0,0,0,0,107,1,134,127,14,59,100,5,0,0,0,0,9,115,166,90,0,0,0,0,0,0,5,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,114,38,239,0,0,197,119,0,0,167,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,105,139,34,0,0,168,39,36,8,0,0,0,0,0,0,164,32,0,0,71,189,0,0,0,0,0,0,0,0,0,0,0,0,105,64,100,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,35,164,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,16,0,0,0,0,235,57,69,5,0,0,0,0,0,0,0,0,0,0,196,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,116,166,249,0,0,0,0,0,0,68,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,173,0,0,0,0,0,0,132,80,0,0,0,0,106,108,196,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,67,0,0,103,15,0,0,0,0,0,0,70,247,0,0,0,0,0,0,0,0,168,98,230,77,0,0,132,113,0,0,134,152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,37,103,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,47,196,29,0,0,0,0,0,0,0,0,0,0,0,0,233,53,36,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,171,105,68,6,10,140,24,0,0,0,0,100,115,0,0,0,0,0,0,198,80,0,0,0,0,0,0,0,0,0,0,102,201,0,0,0,0,0,0,0,0,203,115,0,0,0,0,0,0,72,82,100,74,0,0,0,0,0,0,0,0,0,0,196,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,61,0,0,0,0,0,0,102,61,0,0,6,198,0,0,0,0,104,63,71,31,0,0,0,0,0,0,196,19,40,26,132,17,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,51,134,28,138,107,164,46,0,0,102,97,0,0,0,0,0,0,164,69,0,0,0,0,200,17,132,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,186,111,10,133,72,138,39,38,132,0,0,0,0,104,50,36,21,107,37,71,193,0,0,36,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,51,0,0,0,0,0,0,0,0,234,90,231,54,0,0,0,0,0,0,0,0,0,0,5,26,0,0,0,0,0,0,0,0,0,0,0,0,203,52,0,0,73,77,0,0,0,0,0,0,46,63,6,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,119,0,0,0,0,0,0,0,0,75,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,36,0,0,0,0,9,46,132,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,14,0,0,0,0,0,0,0,0,0,0,134,128,0,0,0,0,74,17,0,0,0,0,0,0,0,0,165,90,0,0,0,0,0,0,0,0,0,0,0,0,136,109,100,122,0,0,0,0,0,0,0,0,104,46,196,4,0,0,0,0,0,0,7,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,123,12,37,165,13,0,0,0,0,0,0,0,0,0,0,134,82,0,0,0,0,0,0,0,0,40,118,5,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,136,41,10,0,0,0,0,0,0,0,0,230,48,0,0,0,0,0,0,0,0,40,31,71,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,65,5,79,0,0,0,0,0,0,0,0,0,0,0,0,104,29,6,18,0,0,0,0,0,0,0,0,0,0,134,117,0,0,0,0,0,0,68,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,38,133,24,0,0,0,0,0,0,0,0,0,0,7,239,0,0,71,161,0,0,196,85,0,0,0,0,72,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,51,0,0,0,0,0,0,0,0,196,3,0,0,0,0,0,0,0,0,109,1,231,120,204,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,109,196,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,197,0,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,221,42,49,229,32,0,0,0,0,0,0,0,0,0,0,0,0,73,102,7,57,0,0,0,0,104,31,70,22,41,49,37,12,0,0,0,0,0,0,0,0,0,0,70,84,235,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,242,19,230,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,80,199,116,0,0,228,23,0,0,0,0,0,0,0,0,73,43,165,20,0,0,165,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,16,0,0,0,0,0,0,0,0,0,0,0,0,39,162,0,0,0,0,0,0,0,0,0,0,0,0,142,20,0,0,0,0,0,0,172,61,37,7,40,30,101,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,28,134,40,213,3,0,0,0,0,199,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,91,39,88,40,27,36,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,79,165,48,0,0,38,176,0,0,0,0,0,0,0,0,0,0,166,111,0,0,0,0,0,0,0,0,168,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,90,0,0,0,0,0,0,232,119,0,0,0,0,0,0,0,0,38,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,35],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+51242);allocate([165,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,2,70,0,0,0,0,0,74,51,71,44,0,0,0,0,0,0,0,0,44,53,0,0,104,51,134,7,205,1,103,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,184,139,74,0,0,0,0,197,25,0,0,71,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,77,166,64,0,0,0,0,0,0,0,0,0,0,4,74,234,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,30,7,8,0,0,0,0,0,0,0,0,206,34,0,0,136,75,0,0,0,0,198,187,42,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,38,103,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,125,0,0,0,0,198,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,73,0,0,0,0,0,0,0,0,5,35,0,0,0,0,0,0,70,173,0,0,0,0,0,0,37,35,0,0,7,133,0,0,0,0,0,0,0,0,0,0,166,114,0,0,0,0,9,24,103,69,0,0,0,0,41,118,70,235,0,0,0,0,0,0,166,120,0,0,0,0,40,61,39,4,0,0,0,0,0,0,36,117,0,0,0,0,0,0,0,0,0,0,164,109,0,0,166,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,45,0,0,0,0,0,0,0,0,0,0,0,0,203,96,229,0,0,0,196,91,0,0,0,0,168,29,5,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,102,134,92,0,0,0,0,40,116,167,185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,106,0,0,0,0,0,0,0,0,41,2,0,0,0,0,0,0,0,0,0,0,0,0,38,125,0,0,0,0,0,0,0,0,111,4,228,103,0,0,0,0,12,48,164,34,0,0,0,0,0,0,230,168,0,0,103,3,0,0,0,0,8,123,0,0,9,33,5,69,0,0,36,50,0,0,0,0,0,0,198,88,0,0,102,151,0,0,0,0,232,64,164,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,5,103,72,0,0,164,89,0,0,0,0,104,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,61,0,0,0,0,0,0,6,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,59,0,0,0,0,0,0,108,82,6,108,0,0,0,0,0,0,0,0,0,0,0,0,73,3,103,102,0,0,103,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,16,0,0,0,0,0,0,0,0,0,0,168,28,0,0,0,0,0,0,0,0,68,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,96,139,6,229,9,0,0,0,0,0,0,70,208,0,0,38,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,98,0,0,100,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,111,200,21,4,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,109,0,0,198,114,40,71,135,33,0,0,0,0,0,0,6,153,0,0,38,170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,46,0,0,0,0,0,0,0,0,0,0,101,91,0,0,0,0,0,0,0,0,203,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,25,68,78,137,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,104,0,0,55,2,199,190,0,0,0,0,0,0,0,0,0,0,167,59,0,0,0,0,74,124,198,171,146,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,44,231,35,0,0,166,173,0,0,0,0,0,0,0,0,0,0,0,0,232,56,5,48,0,0,0,0,0,0,5,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,79,0,0,0,0,0,0,100,106,104,30,231,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,35,36,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,102,70,175,0,0,0,0,0,0,0,0,0,0,0,0,205,21,5,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,81,164,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,16,231,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,190,0,0,0,0,0,0,36,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,105,0,0,11,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,12,37,123,0,0,228,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,239,0,0,0,0,0,0,0,0,0,0,102,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,30,0,0,0,0,0,0,0,0,104,3,4,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,126,0,0,0,0,0,0,0,0,0,0,6,136,0,0,0,0,0,0,0,0,0,0,38,198,0,0,0,0,0,0,0,0,106,28,0,0,0,0,0,0,200,59,6,45,0,0,0,0,0,0,231,11,0,0,0,0,0,0,0,0,0,0,0,0,104,87,0,0,0,0,0,0,78,3,0,0,0,0,0,0,0,0,166,72,0,0,0,0,0,0,100,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,92,100,8,0,0,0,0,0,0,0,0,0,0,0,0,8,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,5,0,0,10,12,0,0,0,0,0,0,168,108,4,64,0,0,0,0,0,0,0,0,0,0,0,0,104,25,0,0,0,0,36,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,32,100,44,0,0,0,0,0,0,0,0,0,0,0,0,202,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,103,0,0,0,0,0,0,0,0,172,72,5,8,0,0,68,55,0,0,0,0,0,0,0,0,0,0,37,122,0,0,0,0,0,0,0,0,0,0,230,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,47,100,34,0,0,0,0,0,0,0,0,0,0,230,118,0,0,6,190,0,0,38,219,136,43,38,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,33,104,36,5,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,244,1,0,0,0,0,0,0,0,0,166,167,0,0,38,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,110,70,226,168,66,0,0,0,0,166,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,104,100,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,2,0,0,136,19,0,0,0,0,0,0,0,0,37,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,43,133,28,0,0,0,0,0,0,103,141,0,0,134,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,106,6,224,0,0,0,0,169,48,101,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,65,0,0,0,0,0,0,174,56,0,0,0,0,0,0,0,0,71,83,0,0,0,0,0,0,196,52,201,114,101,44,0,0,0,0,0,0,0,0,171,20,0,0,137,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,114,0,0,0,0,0,0,69,29,0,0,231,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,38,0,0,0,0,0,0,105,115,230,239,0,0,0,0,0,0,0,0,0,0,0,0,109,20,0,0,0,0,0,0,0,0,7,164,201,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,88,0,0,0,0,0,0,167,186,106,1,166,52,172,91,0,0,0,0,0,0,169,42,0,0,0,0,0,0,78,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,17,198,12,0,0,0,0,215,3,0,0,0,0,231,102,0,0,166,130,0,0,0,0,0,0,71,241,0,0,6,189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,10,0,0,102,155,169,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,135,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,15,4,11,41,78,68,117,0,0,0,0,234,43,0,0,0,0,0,0,168,14,134,208,0,0,103,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,0,0,0,0,0,70,35,0,0,0,0,0,0,0,0,0,0,0,0,9,1,132,5,0,0,0,0,137,22,68,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,68,39,95,0,0,0,0,105,104,6,94,0,0,0,0,0,0,0,0,72,116,6,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,81,0,0,0,0,0,0,0,0,0,0,8,43,0,0,0,0,102,185,105,109,38,23,0,0,0,0,104,56,167,11,40,94,228,40,0,0,0,0,0,0,0,0,0,0,133,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,12,0,0,0,0,0,0,100,62,0,0,0,0,0,0,0,0,0,0,0,0,234,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,12,0,0,7,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,114,0,0,0,0,0,0,0,0,231,49,0,0,0,0,0,0,0,0,9,28,102,70,0,0,0,0,0,0,0,0,0,0,6,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,107,0,0,0,0,0,0,0,0,70,118,172,41,69,93,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,189,0,0,0,0,0,0,0,0,42,25,0,0,202,63,166,172,0,0,0,0,8,66,0,0,0,0,0,0,0,0,132,2,0,0,0,0,0,0,102,156,0,0,0,0,0,0,102,145,0,0,0,0,0,0,102,38,0,0,0,0,0,0,0,0,0,0,103,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,3,0,0,0,0,0,0,36,110,0,0,0,0,0,0,0,0,0,0,164,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,67,0,0,134,43,0,0,133,108,0,0,0,0,0,0,0,0,40,54,0,0,0,0,0,0,106,96,231,186,0,0,0,0,0,0,0,0,234,26,0,0,0,0,0,0,0,0,0,0,141,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,14,199,7,0,0,4,107,204,33,0,0,136,71,0,0,0,0,0,0,0,0,102,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,80,0,0,0,0,0,0,0,0,82,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,58,0,0,0,0,164,13,0,0,0,0,0,0,70,218,0,0,0,0,0,0,102,64,0,0,0,0,0,0,199,70,0,0,0,0,0,0,0,0,0,0,0,0,106,8,4,5,0,0,0,0,168,37,36,100,0,0,0,0,107,115,0,0,0,0,0,0,0,0,0,0,0,0,39,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,30,0,0,0,0,0,0,0,0,164,80,0,0,0,0,12,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,170,0,0,0,0,0,0,0,0,0,0,6,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,40,133,3,9,45,196,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,95,0,0,0,0,41,104,198,107,0,0,5,107,0,0,0,0,0,0,0,0,0,0,0,0,10,92,133,11,0,0,0,0,136,115,230,240,0,0,230,184,8,45,197,73,0,0,0,0,0,0,38,190,0,0,0,0,0,0,166,88,0,0,0,0,173,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,60,0,0,0,0,0,0,0,0,166,151,0,0,0,0,0,0,0,0,232,62,196,127,0,0,7,214,0,0,70,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,91,0,0,0,0,0,0,0,0,0,0,0,0,138,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,120,166,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,137,0,0,0,0,0,0,71,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,244,0,0,0,0,72,4,166,68,10,119,0,0,0,0,133,81,113,9,228,81,0,0,0,0,200,83,68,18,0,0,0,0,0,0,0,0,201,64,230,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,18,0,0,0,0,102,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,118,0,0,0,0,0,0,0,0,39,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,13,167,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,29,165,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,72,0,0,0,0,0,0,40,100,0,0,0,0,0,0,0,0,0,0,0,0,196,8,0,0,0,0,42,46,0,0,144,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,29,39,90,202,53,39,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,227,16,2,198,134,170,127,0,0,0,0,197,50,0,0,0,0,0,0,0,0,0,0,166,8,0,0,0,0,0,0,0,0,0,0,199,228,0,0,0,0,0,0,4,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,125,200,88,36,37,0,0,231,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,63,0,0,0,0,6,131,0,0,0,0,0,0,70,77,0,0,0,0,0,0,4,65,0,0,0,0,0,0,0,0,200,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,90,0,0,0,0,40,115,0,0,0,0,0,0,104,55,165,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,107,0,0,0,0,0,0,103,17,77,35,165,122,0,0,5,36,0,0,0,0,0,0,71,236,232,75,4,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,77,102,175,0,0,166,150,0,0,0,0,107,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,30,0,0,0,0,0,0,0,0,0,0,36,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,77,0,0,0,0,0,0,230,175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,78,7,20,0,0,100,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,75,0,0,203,21,134,36,0,0,0,0,169,65,37,22,0,0,0,0,0,0,166,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,80,0,0,0,0,0,0,36,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,90,0,0,0,0,0,0,166,224,0,0,0,0,0,0,135,210,0,0,0,0,169,58,0,0,104,66,199,153,170,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,33,0,0,0,0,0,0,0,0,0,0,168,52,70,13,170,13,37,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,74,0,0,0,0,0,0,0,0,0,0,202,46,7,229,0,0,0,0,0,0,0,0,0,0,0,0,73,13,0,0,169,50,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,110,0,0,198,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,71,69,58,233,49,36,23,0,0,0,0,0,0,0,0,0,0,0,0,168,18,135,50,0,0,0,0,0,0,0,0,0,0,0,0,8,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,107,6,231,0,0,0,0,73,101,166,78,0,0,0,0,0,0,0,0,184,1,36,47,0,0,71,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,187,0,0,0,0,0,0,132,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,61,74,29,100,21,0,0,0,0,0,0,0,0,234,78,68,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,116,0,0,75,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,53,0,0,0,0,72,89,0,0,0,0,0,0,0,0,167,85,0,0,0,0,0,0,0,0,0,0,0,0,137,52,0,0,0,0,0,0,0,0,0,0,0,0,164,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,94,71,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,14,164,6,0,0,0,0,0,0,0,0,0,0,0,0,232,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,84,0,0,0,0,0,0,6,178,0,0,0,0,0,0,0,0,0,0,230,80,0,0,0,0,0,0,198,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,58,38,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,42,0,0,0,0,0,0,4,116,0,0,0,0,0,0,0,0,0,0,199,229,176,12,4,62,203,81,196,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,30,103,114,200,94,68,25,0,0,0,0,44,64,199,143,0,0,0,0,0,0,0,0,0,0,0,0,234,98,0,0,171,102,0,0,0,0,0,0,0,0,0,0,0,0,132,99,169,113,166,55,10,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,72,0,0,0,0,0,0,102,173,0,0,0,0,0,0,196,54,0,0,0,0,0,0,0,0,0,0,0,0,200,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,110,0,0,0,0,0,0,0,0,0,0,70,188,0,0,0,0,235,122,0,0,9,96,0,0,0,0,0,0,0,0,4,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,28,200,3,69,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,179,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,43,0,0,0,0,0,0,36,48,0,0,197,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,43,0,0,0,0,0,0,0,0,169,15,103,157,136,80,5,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,58,0,0,0,0,0,0,0,0,0,0,196,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,93,0,0,0,0,0,0,0,0,72,68,166,47,0,0,0,0,0,0,0,0,0,0,0,0,172,34,0,0,0,0,38,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,56,8,67,100,69,0,0,0,0,106,123,103,138,0,0,0,0,73,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,32,0,0,7,221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,10,0,0,100,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,11,199,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,3,0,0,196,68,0,0,0,0,0,0,0,0,0,0,166,112,0,0,0,0,0,0,0,0,0,0,0,0,200,102,0,0,0,0,196,112,0,0,0,0,0,0,230,100,0,0,0,0,0,0,0,0,0,0,199,32,0,0,133,77,40,75,68,4,0,0,0,0,73,21,0,0,0,0,0,0,0,0,36,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,41,0,0,0,0,137,120,166,238,200,22,166,32,0,0,0,0,0,0,38,215,0,0,0,0,0,0,0,0,0,0,164,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,201,0,0,231,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,101,0,0,0,0,41,116,70,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,97,0,0,0,0,0,0,36,17,0,0,70,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,198,0,0,0,0,0,0,0,0,0,0,0,0,139,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,23,37,11,0,0,102,123,204,28,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,7,166,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,38,0,0,0,0,72,11,71,21,0,0,38,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,11,0,0,44,2,196,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,33,0,0,132,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,61,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,21,135,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,98,0,0,0,0,0,0,0,0,0,0,135,72,104,78,7,11,233,55,5,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,105,230,91,0,0,0,0,0,0,0,0,0,0,229,3,72,41,0,0,138,57,68,66,41,71,6,53,0,0,0,0,0,0,199,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,74,0,0,0,0,0,0,165,1,72,40,38,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,127,75,20,231,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,14,0,0,0,0,0,0,0,0,0,0,0,0,198,175,0,0,231,138,0,0,0,0,0,0,0,0,40,0,0,0,40,15,5,61,0,0,102,33,0,0,0,0,0,0,230,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,144,0,0,230,196,0,0,198,179,233,3,0,0,0,0,37,47,177,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,252,0,0,0,0,0,0,0,0,0,0,135,229,0,0,0,0,0,0,0,0,112,4,101,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,69,0,0,0,0,0,0,5,67,233,9,229,25,0,0,103,171,0,0,0,0,0,0,4,53,40,98,7,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,27,199,93,0,0,0,0,0,0,0,0,204,29,0,0,0,0,0,0,0,0,0,0,236,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,75,170,90,100,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,59,0,0,0,0,0,0,0,0,0,0,6,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,85,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,178,0,0,0,0,137,36,5,14,0,0,0,0,138,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,245,0,0,0,0,0,0,134,155,138,25,0,0,0,0,0,0,0,0,0,0,0,0,102,108,0,0,0,0,0,0,0,0,0,0,0,0,232,1,132,88,232,57,100,70,0,0,196,62,0,0,0,0,0,0,0,0,0,0,0,0,42,20,102,43,0,0,0,0,0,0,0,0,200,58,36,4,0,0,199,30,104,71,70,1,0,0,69,78,200,76,0,0,170,29,0,0,0,0,0,0,0,0,0,0,13,3,69,2,0,0,70,63,0,0,0,0,0,0,0,0,0,0,0,0,214,3,164,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,17,0,0,0,0,0,0,0,0,6,132,0,0,0,0,0,0,6,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,164,169,10,197,10,8,33,133,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,13,0,0,0,0,0,0,0,0,0,0,106,15,228,115,0,0,0,0,137,19,167,143,0,0,0,0,0,0,0,0,0,0,69,97,0,0,197,62,136,24,0,0,0,0,0,0,0,0,6,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,55,7,175,0,0,0,0,0,0,100,125,0,0,0,0,0,0,0,0,0,0,38,137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,68,135,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,203,6,0,0,0,0,0,0,0,0,135,21,0,0,0,0,0,0,166,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,71,0,0,0,0,0,0,132,91,42,77,0,0,0,0,198,121,42,47,167,123,168,91,0,0,0,0,0,0,0,0,0,0,0,0,132,53,0,0,0,0,44,83,231,251,0,0,0,0,0,0,0,0,0,0,0,0,202,100,229,35,0,0,0,0,0,0,0,0,0,0,102,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,22,103,195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,60,0,0,0,0,0,0,0,0,0,0,230,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,109,38,229,0,0,38,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,11,0,0,104,89,68,124,0,0,0,0,0,0,0,0,0,0,228,7,0,0,228,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,93,0,0,0,0,0,0,0,0,108,68,197,45,0,0,0,0,0,0,103,218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,182,0,0,134,96,170,111,0,0,0,0,0,0,20,6,0,0,0,0,5,103,0,0,0,0,74,86,231,192,200,28,7,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,4,0,0,137,41,4,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,114,0,0,0,0,10,52,135,70,0,0,196,114,0,0,134,220,0,0,0,0,120,0,0,0,0,0,132,11,0,0,0,0,0,0,0,0,168,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,106,229,92,0,0,36,6,0,0,230,109,0,0,0,0,232,5,0,0,0,0,0,0,0,0,0,0,0,0,36,108,0,0,70,150,0,0,0,0,0,0,0,0,0,0,0,0,168,24,5,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,181,0,0,0,0,0,0,0,0,105,111,231,238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,50,0,0,4,70,0,0,0,0,77,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,4,100,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,71,0,0,0,0,0,0,0,0,144,11,71,102,0,0,0,0,40,51,198,27,0,0,0,0,0,0,0,0,233,120,6,235,0,0,0,0,0,0,38,79,0,0,134,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,110,0,0,0,0,0,0,70,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,110,0,0,0,0,68,53,232,49,70,7,0,0,0,0,0,0,0,0,0,0,0,0,73,67,199,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,17,197,70,0,0,6,6,146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,0,70,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,46,0,0,102,126,0,0,0,0,9,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,42,198,174,74,83,0,0,200,30,69,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,54,0,0,0,0,0,0,9,40,0,0,0,0,0,0,0,0,102,125,0,0,71,108,0,0,4,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,125,0,0,0,0,0,0,0,0,0,0,8,93,164,12,0,0,0,0,0,0,0,0,0,0,197,90,0,0,0,0,10,22,0,0,10,79,38,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,104,0,0,0,0,0,0,0,0,0,0,0,0,43,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,30,102,241,200,24,0,0,0,0,103,221,0,0,0,0,0,0,0,0,0,0,198,105,8,21,68,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,109,0,0,0,0,169,59,165,96,168,72,228,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,218,0,0,0,0,0,0,0,0,205,19,38,109,0,0,132,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,83,100,110,0,0,198,9,140,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,182,0,0,70,120,0,0,0,0,0,0,0,0,0,0,133,57],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+61482);allocate([75,4,228,24,0,0,0,0,0,0,134,48,78,59,0,0,235,33,0,0,169,41,228,63,0,0,0,0,0,0,0,0,0,0,0,0,54,6,0,0,140,123,0,0,104,88,69,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,94,0,0,0,0,0,0,0,0,0,0,230,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,64,166,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,50,0,0,0,0,0,0,0,0,132,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133,8,11,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,61,36,42,0,0,0,0,104,32,135,29,0,0,0,0,9,77,228,1,0,0,0,0,0,0,0,0,0,0,0,0,140,94,6,188,0,0,166,94,0,0,70,158,0,0,0,0,136,13,197,74,0,0,0,0,0,0,0,0,103,101,116,83,105,122,101,80,116,114,0,99,111,110,118,101,114,116,0,102,114,101,101,80,116,114,115,0,105,105,0,105,105,105,105,105,0,118,105,105,105,0,70,111,110,116,32,110,111,114,109,97,108,105,122,97,116,105,111,110,32,102,97,105,108,101,100,46,10,0,70,97,105,108,101,100,32,116,111,32,102,105,120,32,99,104,101,99,107,115,117,109,115,10,0,80,97,114,115,105,110,103,32,111,102,32,116,104,101,32,105,110,112,117,116,32,102,111,110,116,32,102,97,105,108,101,100,46,10,0,70,111,110,116,32,116,114,97,110,115,102,111,114,109,97,116,105,111,110,32,102,97,105,108,101,100,46,10,0,67,111,109,112,114,101,115,115,105,111,110,32,111,102,32,99,111,109,98,105,110,101,100,32,116,97,98,108,101,32,102,97,105,108,101,100,46,10,0,67,111,109,112,114,101,115,115,105,111,110,32,111,102,32,101,120,116,101,110,100,101,100,32,109,101,116,97,100,97,116,97,32,102,97,105,108,101,100,46,10,0,109,97,112,58,58,97,116,58,32,32,107,101,121,32,110,111,116,32,102,111,117,110,100,0,82,101,115,117,108,116,32,97,108,108,111,99,97,116,105,111,110,32,119,97,115,32,116,111,111,32,115,109,97,108,108,32,40,37,122,100,32,118,115,32,37,122,100,32,98,121,116,101,115,41,46,10,0,77,105,115,115,105,110,103,32,116,97,98,108,101,32,105,110,100,101,120,32,102,111,114,32,111,102,102,115,101,116,32,48,120,37,48,56,120,10,0,77,105,115,109,97,116,99,104,32,98,101,116,119,101,101,110,32,99,111,109,112,117,116,101,100,32,97,110,100,32,97,99,116,117,97,108,32,108,101,110,103,116,104,32,40,37,122,100,32,118,115,32,37,122,100,41,10,0,116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99,111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111,118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105,110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111,114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97,103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99,104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101,117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115,101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100,101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101,115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99,97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102,105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103,111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109,105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105,108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103,101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110,108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104,102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108,111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104,111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101,115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48,37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97,115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112,101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110,107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119,110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97,117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111,114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116,116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111,117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62,112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109,117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97,110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101,115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101,120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115,116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115,102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112,116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70,111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117,110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101,119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59,46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97,99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109,101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115,121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115,116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108,101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116,115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114,105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108,108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114,108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105,102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114,100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119,104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102,99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115,102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103,101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114,108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115,35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108,97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111,108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101,109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111,111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115,116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104,97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117,103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101,108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112,101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116,103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114,116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101,109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109,97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105,122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105,99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107,98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101,116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108,115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108,108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107,60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97,114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110,102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115,47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109,115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115,111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62,56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90,110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110,100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110,107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48,112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97,115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117,101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110,100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90,72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111,120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114,101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101,119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48,119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99,117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99,111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99,97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117,110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10,10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101,116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110,60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124,45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115,97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47,47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106,115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113,117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48,49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50,57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57,50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49,57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57,56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54,57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54,49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161,115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118,105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116,111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116,111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110,116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111,100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116,101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108,98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111,114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116,97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111,114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116,101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119,101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112,117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111,108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99,101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107,103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121,111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103,114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111,114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116,101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101,108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107,115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110,100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109,115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101,100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100,111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107,108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107,115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103,109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115,116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119,114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115,116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104,105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112,111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111,114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117,114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101,115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114,97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108,101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106,117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98,114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105,108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105,99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105,116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114,116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100,114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109,112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105,103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114,97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111,110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102,114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110,101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111,118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112,105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105,116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104,113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110,116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101,114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48,83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109,105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108,97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97,105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111,110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116,105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115,115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109,105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105,108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115,105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101,97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105,109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115,101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97,109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111,110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114,105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111,109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57,48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108,115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114,100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117,116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97,108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101,102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114,121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111,117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117,110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111,118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101,120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112,34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108,111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110,107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110,100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114,111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116,102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115,101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118,101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105,102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117,115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116,60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101,119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108,103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116,117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110,100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99,101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105,110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111,100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114,111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101,101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108,35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48,112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112,108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103,104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115,114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78,97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111,109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111,114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114,115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10,111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115,105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101,118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112,103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109,101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10,35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104,101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110,116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119,111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38,108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108,60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32,34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109,97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103,34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68,97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47,104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116,121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106,115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10,102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105,110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105,115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115,112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101,104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109,101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115,195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97,110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105,116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121,111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116,101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101,118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105,101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114,195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111,115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111,116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108,105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98,114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98,101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101,114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116,111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98,117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105,99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97,97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99,114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114,101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100,97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111,106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105,103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97,115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111,195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114,102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99,97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117,116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105,112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100,114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111,115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115,117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104,105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116,97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97,108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111,108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101,97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101,97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105,114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101,111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111,99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101,116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105,101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115,101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111,116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101,118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108,117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108,116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111,114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109,111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108,97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108,108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116,104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109,101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97,121,101,114,101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117,98,108,101,112,111],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+71744);allocate([105,110,116,115,115,101,114,105,101,115,112,101,114,115,111,110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102,111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111,112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102,102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109,105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100,104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99,104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112,108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103,115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113,117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108,101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70,114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112,101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111,103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105,99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116,116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100,101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108,118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99,114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104,105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116,101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114,118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111,118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108,121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114,111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114,101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109,111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110,116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108,101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97,110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115,101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110,115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111,115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102,114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101,114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107,105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108,118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101,114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105,110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103,101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101,110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103,110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120,116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119,115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101,109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105,103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67,104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97,121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41,123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100,101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98,114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105,110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103,66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116,108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105,101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109,101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101,105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115,101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101,110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101,110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108,101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114,101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100,111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62,60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97,114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97,100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66,114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111,110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10,95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97,112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110,107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97,110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101,110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112,114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110,34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104,116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115,105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103,34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100,101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87,105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103,101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97,114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97,121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101,114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108,111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103,114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120,117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98,116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46,70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101,32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109,97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47,102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102,114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99,101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97,103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114,116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101,115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84,104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119,115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114,121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114,111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101,112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118,105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65,112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101,109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99,97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115,104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117,109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115,114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97,115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105,108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114,101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101,34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101,101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47,110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115,61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109,112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99,111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116,32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46,106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101,114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100,101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46,120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118,105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110,103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62,10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103,121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217,136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228,191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128,228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157,155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228,184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129,228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179,187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232,175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168,230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156,175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230,144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168,231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162,145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230,148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130,229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184,131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229,155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139,230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188,143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230,155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165,233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187,150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228,188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136,230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174,161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230,180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154,229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189,149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231,164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128,232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153,133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230,156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141,231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160,183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229,155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179,228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184,154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229,144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148,231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155,174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230,131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129,231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186,144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230,181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129,230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131,189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229,159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155,232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186,183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228,187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159,228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164,186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229,136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165,229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143,139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230,142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168,229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186,140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232,191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185,232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184,186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229,168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128,229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191,142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228,187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162,230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186,186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231,166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141,229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175,162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229,190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191,231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186,144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229,133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177,232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165,179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229,187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190,229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168,128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230,157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152,230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144,165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232,175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172,229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135,143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230,138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168,232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175,183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229,143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141,231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152,142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231,168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170,230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184,148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231,138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133,233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128,145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233,130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175,229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153,162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228,186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163,229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179,187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228,184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134,232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144,131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232,137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159,231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158,139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230,157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159,229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186,186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233,155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160,230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184,154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230,156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147,232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187,183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229,174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151,229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147,129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232,174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186,230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135,186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231,131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145,229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184,154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229,142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158,229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144,142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232,174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136,228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141,176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229,173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169,231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185,136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233,155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128,232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191,161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228,186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136,231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161,140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232,179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156,228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143,151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229,138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141,229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156,141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228,184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137,230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131,189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233,156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139,233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175,137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230,156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186,228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137,169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229,133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144,231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128,154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230,173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141,228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168,138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232,128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180,229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132,182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233,130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163,231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155,174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232,167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165,229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189,179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231,142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143,230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135,179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229,164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136,230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131,133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229,141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167,231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184,156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231,187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191,230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138,155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228,186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160,230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152,147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229,189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167,229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131,133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228,185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190,230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133,165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232,135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136,229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150,135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231,155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162,233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149,191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231,187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161,228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191,161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228,187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139,230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132,182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232,191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133,232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187,152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230,137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168,229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140,150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232,175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135,229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186,166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231,153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141,232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189,147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229,189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156,230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129,140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233,161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174,229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158,129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230,156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133,230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171,150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231,171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173,229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180,165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230,156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184,232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189,147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232,130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152,229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133,183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229,138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149,232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174,161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232,167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152,232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173,151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229,143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144,228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159,159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231,187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141,231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132,159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230,143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139,229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184,170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229,136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168,230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133,182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230,136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144,233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181,155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231,156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129,230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131,160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229,133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185,231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186,167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229,133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171,229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144,136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231,190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136,228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139,144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229,134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185,232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175,185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229,189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163,232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144,145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229,189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143,231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184,154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229,149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147,233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186,142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229,173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191,230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156,176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229,136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140,229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134,141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232,139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169,229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143,175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230,131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167,232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156,139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233,187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159,229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134,138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228,188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128,230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133,187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231,144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118,105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111,116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115,116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116,114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110,112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117,100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101,103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116,111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110,117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117,105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111,118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101,114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101,110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105,101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111,109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101,109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111,109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112,111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118,105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111,113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114,105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114,116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111,112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108,118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106,101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97,115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101,98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101,110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114,115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101,115,116,105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116,111,108,195,179,112,101,122],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+81984);allocate([97,103,101,110,100,97,118,195,173,100,101,111,101,118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105,101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195,161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195,179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109,195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208,190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208,178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208,176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208,186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208,146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208,190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209,130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208,188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208,176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208,190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208,161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208,176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208,186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209,141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209,128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209,143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208,146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208,190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209,128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209,141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208,190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208,190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224,164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149,224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165,135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224,164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185,224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164,185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106,97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133,224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164,190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224,164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165,224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165,128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224,164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137,224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165,139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224,164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172,224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164,178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224,164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216,176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217,137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217,131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216,177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217,133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217,132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216,173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216,175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216,167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216,185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217,134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217,132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217,138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216,176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217,131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216,181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217,138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216,167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216,167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217,138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216,174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216,167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216,181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217,134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216,173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216,168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216,179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216,178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217,135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217,132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217,138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217,131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216,168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217,138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217,133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217,130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101,114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100,101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116,115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115,102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121,97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115,114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115,115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111,119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108,101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115,105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116,105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105,108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100,100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99,111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99,117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114,115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97,109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116,101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116,110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108,116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111,106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112,105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103,108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108,101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118,101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112,97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113,117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110,119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97,108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101,114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108,105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99,116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110,116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97,115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105,115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101,114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112,108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115,111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99,101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97,110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100,112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108,99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100,100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97,110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103,101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103,80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115,99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101,99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72,105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117,112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114,101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102,105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98,101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103,100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115,101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99,108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107,105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115,45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97,100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100,71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62,105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101,100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101,98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114,109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103,111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103,101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110,103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97,108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115,101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110,100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101,116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101,97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108,117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97,116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101,97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105,110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102,111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97,100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116,114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116,115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101,108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110,116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116,32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101,100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118,101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99,104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118,101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101,100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105,110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104,97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32,117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101,118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115,121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109,117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125,41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111,110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108,97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98,105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105,101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110,100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104,97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46,104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74,117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84,104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101,58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99,95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100,99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115,112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101,114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105,112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101,115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114,116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98,101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109,112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119,101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102,101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101,118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117,116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101,118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87,104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101,114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116,115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105,111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101,116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110,101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103,105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98,108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101,114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13,10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32,111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110,103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58,108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47,104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110,97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103,104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32,101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117,115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111,117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111,114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101,104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115,109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112,108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100,100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98,105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110,100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112,112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112,105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101,110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101,32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105,110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108,97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97,116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103,101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105,116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101,115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100,105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32,119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99,105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114,107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109,98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114,32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97,99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115,105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105,99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105,100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99,116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111,117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117,114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111,114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108,105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116,101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101,101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45,62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110,103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110,116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116,100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110,103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62,97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69,108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72,117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80,114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38,113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101,114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114,97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105,100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116,104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101,103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101,118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115,104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117,115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110,32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115,108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115,101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101,112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110,109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116,109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38,99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112,116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106,117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105,116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34,32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100,105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112,104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115,105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101,118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110,100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119,97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117,115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104,116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108,108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97,114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99,104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114,101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101,116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105,110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76,105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121,108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121,114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121,108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119,78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115,116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103,116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101,119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114,119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102,10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107,101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40,116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99,104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119,105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70,101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104,115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105,115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121,111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103,101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102,108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115,101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115,116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104,102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99,108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102,105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114,101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101,114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101,100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102,101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116,104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110,103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102,32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116,66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115,116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101,100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76,105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119,101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99,111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102,97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114,101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112,117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114,111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115,97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105,102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112,117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110,116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100,105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117,115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108,121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97,110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100,115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121,62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108,101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32,104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108,111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110,97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111,108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104,97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100,105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105,101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111,108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105,115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32,32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44,98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111,114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114,101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115,101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111,100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110,100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101,108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108,101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107,101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112,108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105,99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110,103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110,116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99,97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100,111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32,115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108,104,101,108,109,115,117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46,115,112,108],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+92224);allocate([105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98,111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115,101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45,104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97,195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108,101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109,97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101,100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108,101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108,116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58,105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116,72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97,112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108,32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114,97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97,105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110,116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97,99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41,46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105,116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101,114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101,114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117,110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104,116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114,121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101,44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102,32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115,116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119,105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121,32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117,115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114,116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114,105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119,105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120,59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32,111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117,108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112,116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115,111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97,108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110,103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101,110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111,110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101,114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116,101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101,101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108,121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114,115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101,100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101,119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99,104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116,97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111,110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105,110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105,115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102,97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105,109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108,97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111,116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105,110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101,108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98,101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112,97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97,110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111,97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110,100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111,119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97,108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101,109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107,114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62,115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114,105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115,78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110,60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108,97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104,46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117,115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97,114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105,101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102,111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102,105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110,116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114,105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99,117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118,97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97,116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103,32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101,115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61,61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111,110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101,108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101,32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114,117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101,110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101,101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97,116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100,101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109,103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117,110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101,114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101,115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32,97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121,65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59,112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110,117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109,111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97,110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110,116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111,118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117,109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111,110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111,111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116,104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100,111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116,105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108,101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116,101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114,118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32,97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115,116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118,101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111,119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104,119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100,111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112,59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118,101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32,111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97,109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101,114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108,46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111,102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100,101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101,97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32,103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101,118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111,114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101,32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105,110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100,32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110,101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105,116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115,60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32,97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104,111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108,105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107,34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32,111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116,101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97,121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97,108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101,99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107,101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118,105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101,32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104,105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111,33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108,121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97,116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114,101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111,114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101,32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110,32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117,112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101,114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107,115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67,97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97,110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101,114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98,121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101,100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103,101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102,73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38,103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111,115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32,61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111,117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62,97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114,103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115,107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112,97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97,98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101,109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114,97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114,111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101,114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108,103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100,101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97,103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104,111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111,195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118,111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100,111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114,101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105,115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97,99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109,105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99,105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115,105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102,101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110,103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101,98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117,101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186,108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97,109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112,111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111,110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99,97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111,114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101,115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103,101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108,105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101,115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110,100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99,111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111,114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111,118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105,110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101,108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99,107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115,97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101,115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109,101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118,105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114,97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117,115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101,100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116,117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76,97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98,101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108,121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116,97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103,108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112,100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102,117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114,111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101,100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114,101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108,108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114,101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111,98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114,32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117,116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111,115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115,101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111,34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117,108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115,47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99,104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116,99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101,99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105,99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105,99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97,103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113,117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115,83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115,105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115,108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97,114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105,118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104,105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115,108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97,110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98,117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112,117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116,105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111,109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107,115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109,111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111,114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99,97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115,68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105,97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111,117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82,101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114,111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116,114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99,115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115,117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111,114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99,111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101,60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108,117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62,34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121,115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104,101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110,103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101,114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117,112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101,99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101,60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107,105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108,112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10,99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32,47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116,101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98,97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99,116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111,114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108,101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111,110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110,111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108,97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114,99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115,116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116,97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108,121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114,105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111,107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100,101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116,105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67,97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112,116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101,114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111,114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97,108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101,110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108,105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103,101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105,100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97,108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108,105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105,110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115,101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111,115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59,97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101,110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112,108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111,114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114,105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110,101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115,119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113,117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103,68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99,104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97,112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110,107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105,99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116,97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105,110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100,61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121,109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32,103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115,112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110,109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104,101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97,108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110,118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105,99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121,32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107,108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116,61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99,107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47,97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116,104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116,101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100,101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116,115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105,111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105,116,121,32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103,104,116,58,32,60,98],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+102464);allocate([32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115,60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101,110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114,111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45,115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101,109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98,111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109,109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114,110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116,104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116,104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101,99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67,111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100,62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32,79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117,114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101,114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97,99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105,98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59,41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111,109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110,103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116,111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32,119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114,105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115,112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108,97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105,110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115,112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112,114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101,32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101,34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174,128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105,105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114,107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110,110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101,114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111,115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99,111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114,116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112,195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111,114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109,101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179,110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195,169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100,114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97,103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98,108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105,108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111,109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101,116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106,101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110,101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110,195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97,109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114,97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115,116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114,99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117,114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98,111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99,116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103,111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115,112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114,195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111,114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100,111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99,105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195,173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97,100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101,115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111,114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114,105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97,114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100,101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111,115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105,103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117,110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195,177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110,116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111,115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101,114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208,180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208,177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208,190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208,188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208,190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208,179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208,190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208,190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208,180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208,189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208,190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208,178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209,136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208,180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209,128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209,133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209,130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208,188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208,190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209,141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208,188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208,178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208,180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208,189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208,188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208,190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208,176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208,178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208,189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208,180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208,189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209,128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217,132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216,174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217,138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216,167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216,173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217,138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217,135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216,163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216,173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216,167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216,167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216,167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216,177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216,180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217,138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216,180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217,133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217,133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217,133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216,181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216,177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217,133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217,136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216,168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216,167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216,163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217,138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217,133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216,177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217,134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217,136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216,167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217,132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23,23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105,101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116,99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103,104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116,105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110,103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65,117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97,116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105,110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111,110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114,101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111,116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109,101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101,109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119,104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112,108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114,105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110,102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114,109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109,105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118,101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117,110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111,110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102,111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114,114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109,116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108,101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101,100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114,101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61,34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121,119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101,99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114,105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115,115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112,114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101,115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114,102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105,107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110,99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47,97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32,116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78,111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116,104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97,108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116,108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100,101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105,102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97,110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121,71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114,112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105,99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103,62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108,111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108,100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110,103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99,101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121,112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116,105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101,110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101,116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105,115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32,116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111,112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59,114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101,32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115,117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117,110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110,108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101,100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97,108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101,101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111,117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99,104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111,121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110,114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110,116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32,116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104,109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117,110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115,105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105,116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105,111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99,111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111,109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101,108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111,117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32,75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102,102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115,111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116,59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111,118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102,105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103,34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115,115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114,115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109,101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109,98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114,101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117,115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101,100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109,111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97,116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101,114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109,112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101,99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114,115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100,100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115,116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103,101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115,116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101,109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111,32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117,115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99,116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97,114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118,97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116,102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116,111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103,116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104,116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110,101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101,102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101,32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117,114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32,119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97,115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111,114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104,101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118,101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109,101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62,115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116,101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115,121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108,112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105,111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111,102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115,101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69,120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101,115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99,97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112,114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111,117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101,115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101,112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112,101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110,102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111,111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105,114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32,105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112,105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117,105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116,114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110,116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110,116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105,118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112,114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100,101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105,108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32,116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115,116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111,114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110,105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105,110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112,97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101,62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117,115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105,110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110,97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116,105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115,115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101,115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114,101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108,101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115,97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109,111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112,110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103,97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101,100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116,116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110,116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114,101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115,104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114,101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116,101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10,112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117,110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101,115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111,110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110,102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114,110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97,110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115,119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111,107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97,97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100,119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105,101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110,111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116,114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110,105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105,110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116,115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117,108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97,110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100,116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109,101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104,101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103,101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114,115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105,116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115,32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100,97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109,105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114,116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101,109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101,114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110,99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97,32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105,110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101,110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114,100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97,116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115,116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47,100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111,110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109,112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101,115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110,61,60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101,115,32,116,104,101,104,105],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+112704);allocate([115,116,111,114,105,97,110,118,97,108,117,101,61,34,34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102,111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111,110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101,114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97,115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105,103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101,115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115,105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116,97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114,110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105,103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105,99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105,116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114,105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116,59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116,104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116,59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101,110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45,104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45,98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115,101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116,118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161,116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224,184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151,231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184,186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232,174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161,229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186,167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230,142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155,228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175,129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229,186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164,232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146,173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229,173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134,229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111,115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97,114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105,99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99,97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117,110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111,114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114,111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99,105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114,101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101,110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114,109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101,116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101,115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114,111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179,110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111,109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99,97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112,101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105,99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112,97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101,116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224,164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190,224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164,164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224,165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135,224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164,178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224,164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172,224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164,190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224,164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190,224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164,133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224,164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190,224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165,135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224,164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150,224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164,173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224,164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130,224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164,174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224,164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190,224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164,176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224,164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185,224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165,128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224,164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135,224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164,178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224,165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190,224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164,156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224,164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160,224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165,130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224,164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190,224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164,182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224,164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129,224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105,101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13,10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60,112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99,107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103,101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108,103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97,99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97,118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98,111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116,105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32,97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110,111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110,116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110,97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101,114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108,111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116,116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116,105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111,110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99,111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100,101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32,105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97,108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101,110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105,111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105,110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116,44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100,111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115,115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114,101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115,104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110,99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99,101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100,118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46,115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110,111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110,100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109,112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117,112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105,99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101,114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105,111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101,110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105,101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34,108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101,112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117,110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101,115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112,111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112,112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97,116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103,32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97,108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101,100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116,60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101,103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114,101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110,103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109,101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110,103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60,47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111,117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103,114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100,117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101,100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100,32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111,105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101,120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111,114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104,101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101,116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112,58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105,111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105,111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117,108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117,109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59,110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105,110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109,111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102,105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114,100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117,108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116,105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115,115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97,116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101,110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34,112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114,117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105,102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97,116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117,114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59,10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114,111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101,32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105,111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102,111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59,32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100,32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102,111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101,110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100,32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47,115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111,110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117,115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99,111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105,111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108,108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100,118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97,110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116,114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97,108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116,97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115,34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119,111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105,99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32,74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105,116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105,110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115,105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111,102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114,105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114,111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121,115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101,117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79,114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60,47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105,116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101,110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116,59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116,105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111,110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40,97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104,105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101,112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105,100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114,105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110,116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110,100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105,116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105,100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97,116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105,111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111,119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115,101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114,101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116,105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115,99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80,114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105,101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108,97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97,115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97,108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100,117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97,116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115,115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32,119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101,110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34,62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111,114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103,115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98,101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109,101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62,13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98,105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101,103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32,105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80,111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110,100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115,100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112,108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116,105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101,114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101,115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110,105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102,114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103,105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103,101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115,101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105,110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32,115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115,105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101,116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105,110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116,105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111,116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84,104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101,112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108,108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32,102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101,99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112,105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99,101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115,101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108,101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117,110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114,101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97,107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112,108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104,112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101,98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32,100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100,105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108,105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100,32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116,104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110,39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101,102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114,114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101,110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116,97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45,119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111,102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117,110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97,100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103,114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116,101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110,32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116,117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102,44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115,105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97,116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97,108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97,110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116,59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100,104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105,100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101,32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108,101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117,105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104,101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102,97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98,106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111,112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114,101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97,114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97,108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100,34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110,101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105,116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32,109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111,119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97,100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109,101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104,114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116,111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103,101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108,111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110,103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116,105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104,101,114,116,114,101,109,101,110,100,111,117,115,102,114,101,101,100,111,109,32,111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+122944);allocate([49,101,109,59,66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110,32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110,103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32,111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116,97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110,116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120,61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103,101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110,116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110,103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108,111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110,115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111,100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112,117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101,115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101,115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105,115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99,116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99,105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110,105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114,97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195,173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108,101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97,118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114,101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111,108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99,117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101,114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195,179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116,117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116,101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110,116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181,209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188,209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177,209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189,209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180,208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179,208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181,208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130,208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180,209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129,208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181,208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189,208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181,208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179,208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184,209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190,208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181,209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190,208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181,208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130,209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139,209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190,208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181,208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139,208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187,208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190,208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130,208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184,208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184,209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183,209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131,208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179,208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181,208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184,208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190,208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180,208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131,208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187,208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143,209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130,209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139,209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139,208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130,208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130,208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130,208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184,209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189,208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181,209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190,208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134,208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190,208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175,217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132,216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135,216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136,217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175,216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129,216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167,216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167,216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138,217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167,216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131,217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167,216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138,216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138,216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177,216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167,217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138,216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133,217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134,217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138,217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138,216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138,217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133,216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138,217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138,217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168,216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129,216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132,217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134,216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173,217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167,216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132,217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168,216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166,217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175,216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179,217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170,216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177,217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138,217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61,34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105,111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115,105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110,109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100,105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118,101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112,108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58,99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34,101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116,105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116,105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101,99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104,116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99,114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108,108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108,111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117,110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99,111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101,100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116,105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118,101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115,101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115,112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105,99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116,101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111,114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114,105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45,115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112,112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103,104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116,104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97,110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102,41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105,111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116,105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109,101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105,118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108,117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111,109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77,105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99,111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101,105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101,114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111,117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115,105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110,116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101,114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99,116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101,114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97,32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114,101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105,111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99,61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105,111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115,115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101,115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117,110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97,114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108,116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108,121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48,37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101,32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105,101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100,61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97,116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104,101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98,101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111,110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110,110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97,115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112,120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100,100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61,34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32,98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105,116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99,117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110,116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118,101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109,111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101,100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115,32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105,116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111,108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110,115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103,116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111,102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116,104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116,105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114,105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116,101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62,60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104,32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109,102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104,114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105,110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121,105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110,104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97,115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32,111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116,105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117,108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59,84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101,110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109,112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114,101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101,115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112,104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121,32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97,114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105,99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116,97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109,112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115,104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116,102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32,116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119,105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114,116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113,117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112,114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47,105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61,34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62,60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101,32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117,116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112,104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103,115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117,114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109,112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109,112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105,114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47,68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101,110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119,104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32,105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103,101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115,101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111,114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105,99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109,112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102,111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102,72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101,114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97,114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32,116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116,105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110,108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84,83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99,104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103,104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104,101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116,101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101,97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110,99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110,100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100,32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97,116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32,112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114,101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97,114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116,112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60,47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116,116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114,101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117,110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101,114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116,101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108,97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117,115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32,105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115,105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116,105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109,105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97,99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105,116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116,111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105,112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105,110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32,110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97,109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115,116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102,111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101,109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47,105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110,116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115,111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32,111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97,116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114,101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108,118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32,115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101,109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116,111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115,99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111,110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115,105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116,105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108,97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116,104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109,108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115,115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121,32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117,101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116,111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115,111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101,110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116,104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48,37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109,101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103,110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117,110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32,99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116,117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66,101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100,34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111,97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62,105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110,116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121,44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49,105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101,99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121,32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99,101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101,32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98,101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32,116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101,108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116,104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101,97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97,102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101,116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104,101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61,34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105,111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115,32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32,116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45,115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97,115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115,32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110,101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115,116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111,102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32,111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115,32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97,116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110,103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101,115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99,111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111,105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111,114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100,101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110,115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118,101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100,32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105,109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101,118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114,105,111,100,32,111,102,97,114,101,32,97,98,108,101,32,116,111,104,111,119,101,118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99,104],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+133184);allocate([32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111,112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100,105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121,119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111,102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105,110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115,116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105,101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115,116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112,101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111,109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114,101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101,99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108,121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32,105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111,110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108,101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111,32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32,111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105,122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111,32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97,108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101,102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97,110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100,32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100,101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102,111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111,102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32,112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104,101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112,111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110,69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114,44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115,101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32,111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117,111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114,108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108,116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104,105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116,121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108,101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105,115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97,32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99,111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116,104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102,101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100,116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97,110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117,110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115,32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117,115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101,119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34,34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44,97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101,116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104,101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105,108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32,116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108,101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118,101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117,116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114,115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97,116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116,32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111,114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100,32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99,111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99,117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111,110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110,116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101,100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32,104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116,114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102,32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116,105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111,112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114,101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110,100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116,111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98,101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32,111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110,115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59,46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32,109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105,110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97,32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101,32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105,109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98,111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115,109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111,102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32,111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32,111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100,32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110,32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101,102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101,101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114,111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116,104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105,97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119,97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110,112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105,108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111,32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116,105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116,108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111,117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84,104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116,99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79,102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103,110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62,60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121,32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99,111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115,101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195,179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101,195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114,97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109,105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114,101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111,116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105,110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108,101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110,116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116,114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111,114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101,108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111,115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97,109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101,99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103,97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115,104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99,108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105,115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101,110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116,105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119,46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117,116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110,116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110,97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103,105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111,110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97,115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108,105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101,100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47,100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101,102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101,108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32,112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97,108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116,105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111,117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117,108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117,112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108,97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41,59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112,58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104,110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61,102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105,111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117,110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103,114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111,110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122,101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115,116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97,99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116,105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114,105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119,108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112,97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118,62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105,108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119,101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116,97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67,111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115,116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106,117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105,109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105,111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114,115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32,103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34,114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38,103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105,111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118,105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110,99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108,108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101,110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114,105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105,110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116,105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99,117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112,97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125,10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116,121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105,111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103,101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40,115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115,115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100,101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47,105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110,103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101,113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105,100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110,103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118,97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111,99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102,48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105,111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101,100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104,105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110,103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99,97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116,97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110,102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116,97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110,100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110,116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110,103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101,115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116,115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104,114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103,114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32,102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101,115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109,101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110,121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59,97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116,104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101,114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101,105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101,115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112,101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111,115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32,105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111,102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100,105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105,111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32,116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110,97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101,114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97,110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116,97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32,98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97,115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110,103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111,32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117,109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107,110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101,110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110,32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111,112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32,99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101,32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114,109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32,100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32,109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109,98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104,116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105,108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104,117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61,34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116,105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114,111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110,97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32,116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110,115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111,119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32,102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101,115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60,100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32,105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62,10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34,32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100,110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118,101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97,100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32,103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101,110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108,117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115,105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32,98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105,111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108,101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116,101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110,97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114,111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114,101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32,111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108,121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110,99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110,32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108,121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99,116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110,103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105,115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104,101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119,119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111,110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98,101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110,101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101,114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32,108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99,111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100,105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97,98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103,103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115,118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117,112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98,101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101,110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109,101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61,34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116,105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97,62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116,114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112,108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114,115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111,112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110,97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101,110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32,116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114,111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111,102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115,32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104,101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32,101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101,116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114,111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97,114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99,111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110,101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111,109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114,101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104,101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111,117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116,104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109,97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97,115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101,114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13,10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110,105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32,115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115,32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116,101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114,110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116,104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97,110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105,108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111,110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32,111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111,102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101,97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101,102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104,101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101,114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115,32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117,108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101,119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115,61,34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101,99,97,109,101,104,101],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+143424);allocate([32,112,117,98,108,105,115,104,101,100,101,120,112,114,101,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111,109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104,116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115,105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104,111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108,108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97,108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116,105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101,101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104,101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108,108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114,105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114,101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32,116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32,112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84,97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118,105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116,62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101,100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101,102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44,32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111,114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101,114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112,101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101,100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112,101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116,105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110,115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116,104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105,103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116,104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111,114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105,110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102,101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102,97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105,122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115,115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104,101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105,115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117,110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116,32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45,116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111,32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32,111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117,109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179,208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190,217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184,173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228,189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184,228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183,180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228,189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132,105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110,111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110,114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116,105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110,111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109,105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115,112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97,101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97,99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108,105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101,110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110,116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105,116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117,98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208,190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208,190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209,128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208,181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209,135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209,129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209,143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208,179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208,190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209,133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208,189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209,131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208,176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208,181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208,190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208,184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208,176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208,176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209,143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208,190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209,130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208,185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208,190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209,129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208,185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208,191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208,176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208,187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208,176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208,181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209,129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208,181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208,190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209,133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208,190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208,190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208,185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209,129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208,184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208,184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208,190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208,190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209,140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208,187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208,176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208,181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209,135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208,176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208,189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209,129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208,184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209,143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208,176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208,189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208,181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208,189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208,181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208,176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209,143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209,131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164,130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224,164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149,224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164,175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224,164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149,224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164,190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224,164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133,224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165,135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224,164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185,224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165,135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224,164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156,224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164,159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224,164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175,224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165,135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224,164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182,224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165,135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224,164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174,224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164,176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224,164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174,224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164,163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224,164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185,224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164,166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224,164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149,224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164,190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224,164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170,224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165,135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224,164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181,224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164,181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224,164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184,224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164,130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224,164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184,224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164,166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224,164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156,224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164,184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224,164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152,224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165,135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224,164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151,224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165,135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224,164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135,224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164,185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224,164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172,224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164,190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224,164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172,224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165,135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224,164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156,224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164,190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224,164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184,224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164,190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224,164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150,224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164,165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224,164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168,224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164,190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224,165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166,224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165,135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224,164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174,224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164,130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224,164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184,224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164,181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224,164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137,224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164,172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224,164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182,224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165,135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224,164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181,224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164,178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224,164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149,224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164,185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216,183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217,136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216,169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216,167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217,132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216,168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216,167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217,132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216,185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216,177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217,132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216,169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216,177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216,173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217,138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216,177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217,132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216,177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216,179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216,172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217,134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216,183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217,132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217,135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216,167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217,132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216,175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216,167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217,138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216,171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216,175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217,132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216,185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217,133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216,180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216,179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217,134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217,132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216,179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217,132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101,110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110,99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111,110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116,104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97,110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110,105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105,122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104,101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110,105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110,118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99,111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32,111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111,110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117,110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112,108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108,105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121,112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110,97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98,97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105,101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119,101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112,114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32,119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115,105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61,34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111,117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116,105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102,116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101,110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117,108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97,108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98,108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117,110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105,110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97,116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103,103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105,111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105,111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40,102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115,32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100,105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99,101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101,100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116,116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32,116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116,105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60,108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47,47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32,103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101,110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116,121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62,60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101,32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32,116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105,109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111,114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111,110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105,110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111,110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112,114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114,111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101,114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32,98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32,115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115,104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97,110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100,62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32,116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97,108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111,102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99,99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105,118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110,32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105,109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116,105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103,116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101,114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114,105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101,114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45,69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111,112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99,104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32,111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32,111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108,111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97,110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104,97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117,116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101,115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102,111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108,111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99,104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117,101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97,109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101,113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117,115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100,32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32,116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111,100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112,116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101,110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108,105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110,101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111,114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111,102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109,109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117,110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101,116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99,105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111,32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97,109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116,104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108,101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116,116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115,115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41,32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32,100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115,117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121,32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32,100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98,105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110,116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115,111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100,39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108,97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101,102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117,116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116,104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111,120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34,78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105,111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104,101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114,45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32,117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104,101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101,114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121,32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108,108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105,110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101,100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72,111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108,101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110,116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32,97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97,114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32,97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101,110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111,110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101,114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116,111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116,105,116,105,111,110,101,114,115,116,104,97,116,32,104,101,32,119,111,117,108,100,97,110,100,32,99,111,110,116,105,110,117,101,100,111],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+153664);allocate([99,99,117,112,97,116,105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101,110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116,32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101,98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108,101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111,117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101,115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99,108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97,110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97,116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99,111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117,116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100,32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99,117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119,97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101,115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111,102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122,97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101,108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116,32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121,32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97,115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114,101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32,105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111,108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111,110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99,97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99,105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115,104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108,121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110,115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32,97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32,116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32,97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97,114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115,115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116,111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108,108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116,117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100,67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110,100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111,117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117,114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99,116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97,117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32,116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99,101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110,99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32,102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97,108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100,32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115,117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32,111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114,101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104,101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110,116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115,32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105,115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111,116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115,115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97,108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97,99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104,101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97,121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97,105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99,105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115,116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61,34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110,115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112,111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108,32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110,115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110,116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104,116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10,46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115,116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108,111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110,98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105,102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114,110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112,116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98,109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99,111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111,110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99,111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100,100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32,116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114,111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105,111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116,101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104,101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104,114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108,97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33,91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110,32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32,99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100,101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117,110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116,104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101,32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97,99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111,110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105,100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104,101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100,101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104,101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111,108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32,109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110,119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40,119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62,60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116,34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100,32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99,101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99,111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116,105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101,108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99,114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115,115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111,32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34,62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101,100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32,111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99,97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108,97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100,121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121,32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101,115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47,100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116,62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101,115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115,112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121,32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99,116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114,115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98,101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103,104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114,101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97,110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114,32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116,111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101,100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32,101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99,116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105,116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107,101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110,100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108,105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114,108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116,32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118,32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108,101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114,110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104,101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101,114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116,111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101,61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114,101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116,34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105,116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101,101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97,119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110,118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108,116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115,99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97,100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104,101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114,101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111,102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112,120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111,110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104,101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111,110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111,110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116,105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111,117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100,111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100,105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110,32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116,32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117,100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116,114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116,105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105,98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101,115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32,98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60,119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111,105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111,114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117,114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116,111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115,101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104,101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110,32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111,102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111,32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115,101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111,114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99,97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97,115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32,116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100,121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102,101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104,101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110,100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115,116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110,107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108,105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60,115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99,116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10,60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32,116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98,108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61,34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32,116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104,101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105,110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99,101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100,105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47,100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105,110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115,105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32,117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116,105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110,32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116,101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108,102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99,111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109,97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32,116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116,104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111,114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32,116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60,47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101,114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119,104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110,97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105,116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114,101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32,116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101,101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114,110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103,101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102,111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104,105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117,110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32,116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34,113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105,101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100,32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62,60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104,101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112,116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112,115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208,186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208,176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208,185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209,129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208,177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208,181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209,129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209,135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208,184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208,191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208,190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208,190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209,129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209,129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208,181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209,130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208,188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208,186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208,190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209,129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208,176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208,190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209,130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208,190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208,181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216,170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216,167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216,185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216,167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217,132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216,182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216,167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216,179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217,133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217,129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217,138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217,132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216,168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216,167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216,167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216,169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216,174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217,133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217,132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217,132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216,167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216,175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216,177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216,167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110,116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97,115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108,45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115,99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34,102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99,108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34,32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110,103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105,118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116,32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32,32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32,118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97,98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109,32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110,58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100,105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97,116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105,115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101,115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62,60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115,44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111,108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110,32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101,108,108,32,97,115],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+163904);allocate([32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118,62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105,111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121,99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32,116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114,116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32,116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32,104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112,116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112,97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111,102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116,104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111,117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116,104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114,105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97,100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32,111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99,111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104,101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110,61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98,101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97,99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116,104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105,100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104,101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110,100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97,112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97,115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32,111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115,117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117,111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115,116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115,105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104,101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117,114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112,80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105,110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109,97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97,116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98,121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62,13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32,112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105,110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135,32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105,100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116,101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110,100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164,151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224,164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151,224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164,181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178,224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164,130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224,165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174,224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165,128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224,164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174,224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164,151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224,164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183,224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165,135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224,165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176,224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164,171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224,164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166,224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164,176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185,224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224,164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150,224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165,135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141,224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164,136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224,164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188,224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224,165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141,224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165,128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224,164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173,224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165,135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224,164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141,224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164,184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224,164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164,224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164,184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224,164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190,224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165,128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224,164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164,224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164,190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224,165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139,224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164,164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224,165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184,224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165,130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224,164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154,224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164,175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224,164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149,224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165,135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224,164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115,34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121,108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114,105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114,100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120,116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100,101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111,118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105,118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101,114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40,41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114,101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97,115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116,121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101,114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111,109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87,111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32,111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104,101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101,114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97,116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110,97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58,49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32,111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116,121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99,114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13,10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102,32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60,47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115,97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115,105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186,206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186,208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187,209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178,208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186,208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152,208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178,208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184,208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129,209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135,208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178,208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188,209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143,208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184,208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176,208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184,208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167,217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177,216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170,217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170,217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167,217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179,216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166,217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138,216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167,217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170,216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132,216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111,98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100,61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83,116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48,34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117,111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109,97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61,34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32,111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116,117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110,99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34,62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114,101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99,111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109,103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115,99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44,32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108,97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32,112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116,104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46,109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109,101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99,101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102,105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104,32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97,114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65,108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101,110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112,108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114,115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114,111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80,114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32,112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116,104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117,97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100,101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97,108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97,116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101,118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105,111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186,206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110,100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117,116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87,105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116,108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101,120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110,116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97,99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101,100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101,110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116,97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114,103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97,116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32,116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101,32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114,101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104,97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97,110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108,108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98,115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45,99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105,111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105,112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46,106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105,118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121,108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32,99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116,101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45,119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108,105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116,104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116,101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100,101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98,115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101,114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117,108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32,99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34,32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97,110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116,104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114,101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114,111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58,47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97,116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108,101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110,32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115,105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109,112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102,32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114,101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32,102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83,116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112,108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32,105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111,117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119,105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32,99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105,110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32,111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110,100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101,110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103,104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116,101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71,101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47,119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100,105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110,111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99,101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114,97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110,100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101,100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114,111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32,116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72,111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118,62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97,103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103,110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108,101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111,111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104,101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,209,139,208,191,208,190,208,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+174144);allocate([208,190,209,129,208,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120,116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115,116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112,116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58,47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110,101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116,58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105,116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97,114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115,115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10,13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102,45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46,105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112,101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116,105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101,100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32,98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111,102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32,32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47,115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114,121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97,110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105,101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104,101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105,110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32,112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113,117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97,109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105,99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105,101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32,99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105,110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118,101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34,47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101,120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117,97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99,97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117,103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101,100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110,32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102,102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10,60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101,114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105,98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117,110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102,32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112,101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98,101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110,116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44,32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114,32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105,101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105,116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110,32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109,101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100,104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34,32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115,97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99,116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116,37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68,97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47,100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97,114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34,32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119,101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108,61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117,108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121,61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116,101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62,60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115,32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32,116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109,101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101,110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103,104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32,109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116,105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105,111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105,99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115,116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38,97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101,32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101,103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101,101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116,111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110,32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114,115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116,40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112,97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114,105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111,116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97,114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110,103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109,105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116,104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115,112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208,163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209,131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208,160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208,188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208,184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209,131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208,189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208,184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208,152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208,160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208,186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208,184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209,130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208,180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216,167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216,167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216,167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104,116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115,112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108,105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105,112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40,41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112,111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62,60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110,97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165,141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224,164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183,224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164,168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224,164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141,224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165,141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224,164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184,224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164,154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168,224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164,190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224,164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190,224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164,149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224,164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154,224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164,130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224,164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191,224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164,190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224,164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164,188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224,164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191,224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114,105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115,34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60,47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103,61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115,112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74,97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115,112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105,110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115,116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61,34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117,110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100,101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111,110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111,32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208,183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208,183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208,184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208,177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60,33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101,114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112,58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119,119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68,84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49,47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116,105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66,101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97,100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99,117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112,116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103,101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110,105,99,97,108,34,32,104,114,101],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+184384);allocate([102,61,34,104,116,116,112,58,47,47,119,119,119,46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176,224,164,191,224,164,175,224,164,164,224,164,190,98,105,116,115,32,60,32,49,85,76,76,32,60,60,32,110,95,98,105,116,115,0,99,115,114,99,47,101,110,99,47,46,47,119,114,105,116,101,95,98,105,116,115,46,104,0,87,114,105,116,101,66,105,116,115,0,1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15,2,4,3,2,2,4,0,7,3,2,1,15,40,112,111,115,32,38,32,55,41,32,61,61,32,48,0,87,114,105,116,101,66,105,116,115,80,114,101,112,97,114,101,83,116,111,114,97,103,101,0,116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99,111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111,118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105,110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111,114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97,103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99,104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101,117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115,101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100,101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101,115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99,97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102,105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103,111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109,105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105,108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103,101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110,108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104,102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108,111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104,111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101,115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48,37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97,115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112,101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110,107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119,110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97,117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111,114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116,116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111,117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62,112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109,117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97,110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101,115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101,120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115,116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115,102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112,116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70,111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117,110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101,119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59,46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97,99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109,101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115,121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115,116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108,101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116,115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114,105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108,108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114,108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105,102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114,100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119,104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102,99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115,102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103,101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114,108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115,35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108,97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111,108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101,109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111,111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115,116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104,97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117,103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101,108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112,101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116,103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114,116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101,109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109,97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105,122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105,99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107,98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101,116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108,115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108,108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107,60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97,114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110,102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115,47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109,115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115,111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62,56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90,110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110,100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110,107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48,112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97,115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117,101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110,100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90,72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111,120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114,101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101,119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48,119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99,117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99,111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99,97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117,110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10,10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101,116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110,60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124,45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115,97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47,47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106,115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113,117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48,49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50,57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57,50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49,57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57,56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54,57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54,49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161,115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118,105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116,111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116,111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110,116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111,100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116,101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108,98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111,114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116,97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111,114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116,101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119,101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112,117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111,108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99,101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107,103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121,111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103,114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111,114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116,101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101,108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107,115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110,100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109,115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101,100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100,111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107,108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107,115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103,109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115,116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119,114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115,116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104,105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112,111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111,114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117,114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101,115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114,97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108,101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106,117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98,114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105,108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105,99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105,116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114,116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100,114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109,112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105,103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114,97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111,110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102,114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110,101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111,118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112,105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105,116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104,113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110,116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101,114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48,83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109,105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108,97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97,105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111,110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116,105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115,115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109,105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105,108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115,105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101,97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105,109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115,101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97,109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111,110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114,105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111,109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57,48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108,115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114,100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117,116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97,108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101,102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114,121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111,117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117,110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111,118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101,120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112,34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108,111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110,107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110,100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114,111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116,102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115,101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118,101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105,102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117,115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116,60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101,119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108,103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116,117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110,100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99,101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105,110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111,100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114,111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101,101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108,35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48,112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112,108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103,104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115,114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78,97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111,109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111,114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114,115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10,111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115,105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101,118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112,103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109,101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10,35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104,101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110,116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119,111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38,108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108,60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32,34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109,97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103,34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68,97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47,104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116,121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106,115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10,102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105,110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105,115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115,112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101,104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109,101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115,195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97,110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105,116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121,111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116,101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101,118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105,101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114,195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111,115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111,116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108,105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98,114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98,101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101,114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116,111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98,117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105,99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97,97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99,114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114,101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100,97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111,106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105,103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97,115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111,195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114,102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99,97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117,116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105,112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100,114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111,115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115,117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104,105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116,97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97,108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111,108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101,97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101,97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105,114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101,111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111,99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101,116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105,101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115,101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111,116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101,118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108,117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108,116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111,114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109,111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108,97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108,108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116,104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109,101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+194624);allocate([121,101,114,101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117,98,108,101,112,111,105,110,116,115,115,101,114,105,101,115,112,101,114,115,111,110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102,111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111,112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102,102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109,105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100,104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99,104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112,108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103,115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113,117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108,101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70,114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112,101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111,103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105,99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116,116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100,101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108,118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99,114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104,105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116,101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114,118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111,118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108,121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114,111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114,101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109,111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110,116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108,101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97,110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115,101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110,115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111,115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102,114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101,114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107,105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108,118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101,114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105,110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103,101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101,110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103,110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120,116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119,115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101,109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105,103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67,104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97,121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41,123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100,101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98,114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105,110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103,66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116,108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105,101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109,101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101,105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115,101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101,110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101,110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108,101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114,101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100,111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62,60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97,114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97,100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66,114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111,110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10,95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97,112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110,107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97,110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101,110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112,114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110,34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104,116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115,105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103,34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100,101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87,105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103,101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97,114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97,121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101,114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108,111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103,114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120,117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98,116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46,70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101,32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109,97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47,102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102,114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99,101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97,103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114,116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101,115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84,104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119,115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114,121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114,111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101,112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118,105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65,112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101,109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99,97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115,104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117,109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115,114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97,115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105,108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114,101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101,34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101,101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47,110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115,61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109,112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99,111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116,32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46,106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101,114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100,101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46,120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118,105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110,103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62,10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103,121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217,136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228,191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128,228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157,155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228,184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129,228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179,187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232,175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168,230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156,175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230,144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168,231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162,145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230,148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130,229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184,131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229,155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139,230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188,143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230,155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165,233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187,150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228,188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136,230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174,161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230,180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154,229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189,149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231,164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128,232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153,133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230,156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141,231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160,183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229,155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179,228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184,154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229,144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148,231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155,174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230,131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129,231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186,144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230,181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129,230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131,189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229,159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155,232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186,183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228,187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159,228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164,186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229,136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165,229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143,139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230,142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168,229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186,140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232,191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185,232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184,186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229,168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128,229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191,142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228,187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162,230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186,186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231,166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141,229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175,162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229,190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191,231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186,144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229,133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177,232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165,179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229,187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190,229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168,128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230,157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152,230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144,165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232,175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172,229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135,143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230,138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168,232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175,183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229,143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141,231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152,142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231,168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170,230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184,148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231,138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133,233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128,145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233,130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175,229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153,162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228,186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163,229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179,187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228,184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134,232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144,131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232,137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159,231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158,139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230,157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159,229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186,186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233,155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160,230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184,154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230,156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147,232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187,183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229,174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151,229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147,129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232,174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186,230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135,186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231,131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145,229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184,154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229,142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158,229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144,142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232,174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136,228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141,176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229,173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169,231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185,136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233,155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128,232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191,161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228,186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136,231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161,140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232,179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156,228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143,151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229,138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141,229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156,141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228,184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137,230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131,189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233,156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139,233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175,137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230,156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186,228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137,169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229,133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144,231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128,154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230,173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141,228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168,138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232,128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180,229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132,182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233,130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163,231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155,174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232,167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165,229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189,179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231,142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143,230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135,179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229,164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136,230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131,133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229,141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167,231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184,156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231,187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191,230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138,155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228,186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160,230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152,147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229,189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167,229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131,133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228,185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190,230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133,165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232,135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136,229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150,135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231,155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162,233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149,191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231,187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161,228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191,161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228,187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139,230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132,182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232,191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133,232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187,152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230,137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168,229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140,150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232,175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135,229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186,166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231,153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141,232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189,147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229,189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156,230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129,140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233,161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174,229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158,129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230,156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133,230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171,150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231,171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173,229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180,165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230,156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184,232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189,147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232,130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152,229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133,183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229,138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149,232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174,161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232,167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152,232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173,151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229,143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144,228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159,159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231,187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141,231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132,159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230,143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139,229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184,170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229,136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168,230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133,182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230,136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144,233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181,155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231,156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129,230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131,160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229,133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185,231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186,167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229,133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171,229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144,136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231,190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136,228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139,144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229,134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185,232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175,185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229,189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163,232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144,145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229,189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143,231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184,154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229,149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147,233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186,142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229,173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191,230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156,176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229,136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140,229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134,141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232,139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169,229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143,175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230,131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167,232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156,139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233,187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159,229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134,138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228,188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128,230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133,187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231,144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118,105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111,116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115,116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116,114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110,112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117,100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101,103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116,111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110,117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117,105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111,118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101,114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101,110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105,101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111,109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101,109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111,109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112,111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118,105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111,113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114,105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114,116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111,112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108,118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106,101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97,115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101,98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101,110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114,115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+204864);allocate([115,116,105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116,111,108,195,179,112,101,122,97,103,101,110,100,97,118,195,173,100,101,111,101,118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105,101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195,161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195,179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109,195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208,190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208,178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208,176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208,186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208,146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208,190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209,130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208,188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208,176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208,190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208,161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208,176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208,186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209,141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209,128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209,143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208,146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208,190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209,128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209,141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208,190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208,190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224,164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149,224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165,135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224,164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185,224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164,185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106,97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133,224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164,190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224,164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165,224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165,128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224,164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137,224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165,139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224,164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172,224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164,178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224,164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216,176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217,137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217,131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216,177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217,133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217,132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216,173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216,175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216,167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216,185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217,134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217,132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217,138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216,176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217,131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216,181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217,138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216,167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216,167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217,138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216,174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216,167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216,181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217,134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216,173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216,168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216,179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216,178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217,135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217,132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217,138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217,131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216,168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217,138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217,133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217,130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101,114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100,101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116,115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115,102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121,97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115,114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115,115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111,119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108,101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115,105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116,105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105,108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100,100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99,111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99,117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114,115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97,109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116,101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116,110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108,116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111,106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112,105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103,108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108,101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118,101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112,97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113,117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110,119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97,108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101,114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108,105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99,116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110,116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97,115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105,115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101,114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112,108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115,111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99,101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97,110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100,112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108,99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100,100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97,110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103,101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103,80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115,99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101,99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72,105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117,112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114,101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102,105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98,101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103,100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115,101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99,108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107,105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115,45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97,100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100,71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62,105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101,100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101,98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114,109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103,111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103,101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110,103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97,108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115,101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110,100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101,116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101,97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108,117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97,116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101,97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105,110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102,111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97,100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116,114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116,115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101,108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110,116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116,32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101,100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118,101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99,104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118,101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101,100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105,110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104,97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32,117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101,118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115,121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109,117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125,41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111,110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108,97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98,105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105,101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110,100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104,97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46,104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74,117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84,104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101,58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99,95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100,99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115,112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101,114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105,112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101,115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114,116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98,101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109,112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119,101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102,101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101,118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117,116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101,118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87,104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101,114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116,115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105,111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101,116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110,101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103,105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98,108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101,114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13,10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32,111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110,103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58,108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47,104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110,97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103,104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32,101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117,115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111,117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111,114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101,104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115,109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112,108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100,100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98,105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110,100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112,112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112,105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101,110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101,32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105,110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108,97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97,116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103,101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105,116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101,115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100,105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32,119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99,105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114,107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109,98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114,32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97,99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115,105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105,99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105,100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99,116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111,117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117,114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111,114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108,105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116,101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101,101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45,62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110,103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110,116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116,100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110,103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62,97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69,108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72,117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80,114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38,113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101,114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114,97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105,100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116,104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101,103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101,118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115,104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117,115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110,32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115,108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115,101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101,112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110,109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116,109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38,99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112,116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106,117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105,116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34,32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100,105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112,104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115,105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101,118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110,100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119,97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117,115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104,116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108,108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97,114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99,104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114,101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101,116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105,110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76,105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121,108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121,114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121,108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119,78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115,116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103,116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101,119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114,119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102,10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107,101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40,116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99,104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119,105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70,101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104,115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105,115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121,111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103,101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102,108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115,101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115,116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104,102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99,108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102,105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114,101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101,114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101,100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102,101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116,104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110,103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102,32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116,66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115,116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101,100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76,105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119,101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99,111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102,97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114,101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112,117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114,111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115,97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105,102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112,117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110,116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100,105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117,115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108,121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97,110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100,115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121,62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108,101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32,104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108,111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110,97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111,108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104,97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100,105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105,101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111,108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105,115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32,32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44,98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111,114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114,101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115,101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111,100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110,100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101,108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108,101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107,101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112,108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105,99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110,103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110,116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99,97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100,111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32,115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+215104);allocate([104,101,108,109,115,117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46,115,112,108,105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98,111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115,101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45,104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97,195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108,101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109,97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101,100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108,101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108,116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58,105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116,72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97,112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108,32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114,97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97,105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110,116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97,99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41,46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105,116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101,114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101,114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117,110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104,116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114,121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101,44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102,32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115,116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119,105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121,32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117,115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114,116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114,105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119,105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120,59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32,111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117,108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112,116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115,111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97,108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110,103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101,110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111,110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101,114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116,101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101,101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108,121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114,115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101,100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101,119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99,104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116,97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111,110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105,110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105,115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102,97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105,109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108,97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111,116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105,110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101,108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98,101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112,97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97,110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111,97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110,100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111,119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97,108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101,109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107,114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62,115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114,105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115,78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110,60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108,97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104,46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117,115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97,114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105,101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102,111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102,105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110,116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114,105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99,117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118,97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97,116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103,32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101,115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61,61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111,110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101,108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101,32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114,117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101,110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101,101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97,116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100,101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109,103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117,110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101,114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101,115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32,97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121,65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59,112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110,117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109,111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97,110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110,116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111,118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117,109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111,110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111,111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116,104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100,111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116,105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108,101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116,101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114,118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32,97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115,116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118,101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111,119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104,119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100,111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112,59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118,101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32,111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97,109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101,114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108,46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111,102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100,101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101,97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32,103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101,118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111,114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101,32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105,110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100,32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110,101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105,116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115,60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32,97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104,111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108,105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107,34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32,111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116,101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97,121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97,108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101,99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107,101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118,105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101,32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104,105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111,33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108,121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97,116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114,101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111,114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101,32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110,32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117,112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101,114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107,115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67,97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97,110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101,114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98,121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101,100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103,101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102,73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38,103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111,115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32,61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111,117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62,97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114,103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115,107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112,97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97,98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101,109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114,97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114,111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101,114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108,103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100,101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97,103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104,111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111,195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118,111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100,111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114,101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105,115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97,99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109,105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99,105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115,105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102,101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110,103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101,98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117,101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186,108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97,109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112,111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111,110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99,97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111,114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101,115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103,101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108,105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101,115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110,100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99,111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111,114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111,118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105,110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101,108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99,107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115,97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101,115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109,101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118,105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114,97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117,115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101,100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116,117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76,97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98,101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108,121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116,97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103,108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112,100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102,117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114,111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101,100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114,101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108,108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114,101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111,98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114,32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117,116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111,115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115,101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111,34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117,108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115,47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99,104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116,99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101,99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105,99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105,99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97,103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113,117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115,83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115,105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115,108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97,114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105,118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104,105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115,108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97,110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98,117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112,117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116,105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111,109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107,115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109,111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111,114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99,97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115,68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105,97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111,117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82,101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114,111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116,114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99,115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115,117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111,114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99,111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101,60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108,117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62,34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121,115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104,101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110,103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101,114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117,112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101,99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101,60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107,105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108,112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10,99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32,47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116,101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98,97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99,116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111,114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108,101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111,110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110,111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108,97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114,99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115,116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116,97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108,121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114,105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111,107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100,101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116,105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67,97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112,116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101,114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111,114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97,108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101,110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108,105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103,101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105,100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97,108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108,105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105,110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115,101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111,115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59,97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101,110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112,108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111,114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114,105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110,101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115,119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113,117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103,68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99,104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97,112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110,107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105,99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116,97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105,110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100,61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121,109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32,103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115,112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110,109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104,101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97,108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110,118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105,99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121,32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107,108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116,61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99,107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47,97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116,104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116,101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100,101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116,115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105,111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+225344);allocate([116,121,32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103,104,116,58,32,60,98,32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115,60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101,110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114,111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45,115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101,109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98,111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109,109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114,110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116,104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116,104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101,99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67,111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100,62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32,79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117,114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101,114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97,99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105,98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59,41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111,109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110,103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116,111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32,119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114,105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115,112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108,97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105,110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115,112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112,114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101,32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101,34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174,128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105,105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114,107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110,110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101,114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111,115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99,111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114,116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112,195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111,114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109,101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179,110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195,169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100,114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97,103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98,108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105,108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111,109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101,116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106,101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110,101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110,195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97,109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114,97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115,116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114,99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117,114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98,111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99,116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103,111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115,112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114,195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111,114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100,111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99,105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195,173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97,100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101,115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111,114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114,105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97,114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100,101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111,115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105,103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117,110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195,177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110,116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111,115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101,114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208,180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208,177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208,190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208,188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208,190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208,179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208,190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208,190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208,180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208,189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208,190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208,178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209,136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208,180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209,128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209,133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209,130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208,188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208,190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209,141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208,188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208,178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208,180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208,189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208,188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208,190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208,176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208,178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208,189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208,180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208,189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209,128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217,132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216,174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217,138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216,167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216,173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217,138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217,135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216,163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216,173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216,167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216,167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216,167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216,177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216,180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217,138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216,180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217,133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217,133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217,133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216,181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216,177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217,133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217,136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216,168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216,167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216,163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217,138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217,133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216,177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217,134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217,136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216,167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217,132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23,23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105,101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116,99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103,104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116,105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110,103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65,117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97,116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105,110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111,110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114,101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111,116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109,101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101,109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119,104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112,108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114,105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110,102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114,109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109,105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118,101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117,110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111,110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102,111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114,114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109,116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108,101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101,100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114,101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61,34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121,119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101,99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114,105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115,115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112,114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101,115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114,102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105,107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110,99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47,97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32,116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78,111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116,104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97,108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116,108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100,101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105,102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97,110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121,71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114,112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105,99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103,62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108,111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108,100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110,103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99,101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121,112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116,105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101,110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101,116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105,115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32,116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111,112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59,114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101,32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115,117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117,110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110,108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101,100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97,108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101,101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111,117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99,104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111,121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110,114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110,116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32,116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104,109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117,110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115,105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105,116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105,111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99,111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111,109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101,108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111,117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32,75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102,102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115,111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116,59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111,118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102,105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103,34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115,115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114,115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109,101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109,98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114,101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117,115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101,100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109,111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97,116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101,114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109,112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101,99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114,115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100,100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115,116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103,101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115,116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101,109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111,32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117,115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99,116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97,114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118,97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116,102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116,111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103,116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104,116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110,101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101,102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101,32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117,114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32,119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97,115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111,114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104,101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118,101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109,101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62,115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116,101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115,121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108,112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105,111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111,102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115,101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69,120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101,115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99,97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112,114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111,117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101,115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101,112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112,101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110,102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111,111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105,114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32,105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112,105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117,105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116,114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110,116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110,116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105,118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112,114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100,101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105,108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32,116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115,116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111,114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110,105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105,110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112,97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101,62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117,115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105,110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110,97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116,105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115,115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101,115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114,101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108,101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115,97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109,111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112,110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103,97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101,100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116,116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110,116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114,101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115,104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114,101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116,101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10,112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117,110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101,115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111,110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110,102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114,110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97,110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115,119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111,107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97,97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100,119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105,101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110,111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116,114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110,105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105,110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116,115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117,108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97,110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100,116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109,101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104,101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103,101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114,115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105,116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115,32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100,97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109,105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114,116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101,109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101,114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110,99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97,32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105,110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101,110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114,100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97,116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115,116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47,100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111,110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109,112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101,115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110,61],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+235584);allocate([60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101,115,32,116,104,101,104,105,115,116,111,114,105,97,110,118,97,108,117,101,61,34,34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102,111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111,110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101,114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97,115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105,103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101,115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115,105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116,97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114,110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105,103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105,99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105,116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114,105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116,59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116,104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116,59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101,110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45,104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45,98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115,101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116,118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161,116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224,184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151,231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184,186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232,174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161,229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186,167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230,142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155,228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175,129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229,186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164,232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146,173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229,173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134,229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111,115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97,114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105,99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99,97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117,110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111,114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114,111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99,105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114,101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101,110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114,109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101,116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101,115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114,111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179,110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111,109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99,97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112,101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105,99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112,97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101,116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224,164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190,224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164,164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224,165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135,224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164,178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224,164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172,224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164,190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224,164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190,224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164,133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224,164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190,224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165,135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224,164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150,224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164,173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224,164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130,224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164,174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224,164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190,224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164,176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224,164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185,224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165,128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224,164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135,224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164,178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224,165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190,224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164,156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224,164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160,224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165,130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224,164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190,224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164,182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224,164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129,224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105,101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13,10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60,112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99,107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103,101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108,103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97,99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97,118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98,111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116,105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32,97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110,111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110,116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110,97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101,114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108,111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116,116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116,105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111,110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99,111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100,101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32,105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97,108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101,110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105,111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105,110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116,44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100,111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115,115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114,101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115,104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110,99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99,101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100,118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46,115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110,111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110,100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109,112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117,112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105,99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101,114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105,111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101,110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105,101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34,108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101,112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117,110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101,115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112,111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112,112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97,116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103,32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97,108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101,100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116,60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101,103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114,101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110,103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109,101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110,103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60,47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111,117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103,114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100,117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101,100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100,32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111,105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101,120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111,114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104,101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101,116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112,58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105,111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105,111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117,108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117,109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59,110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105,110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109,111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102,105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114,100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117,108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116,105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115,115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97,116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101,110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34,112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114,117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105,102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97,116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117,114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59,10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114,111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101,32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105,111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102,111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59,32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100,32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102,111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101,110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100,32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47,115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111,110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117,115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99,111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105,111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108,108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100,118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97,110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116,114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97,108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116,97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115,34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119,111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105,99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32,74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105,116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105,110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115,105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111,102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114,105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114,111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121,115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101,117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79,114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60,47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105,116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101,110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116,59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116,105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111,110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40,97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104,105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101,112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105,100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114,105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110,116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110,100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105,116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105,100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97,116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105,111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111,119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115,101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114,101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116,105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115,99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80,114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105,101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108,97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97,115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97,108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100,117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97,116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115,115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32,119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101,110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34,62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111,114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103,115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98,101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109,101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62,13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98,105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101,103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32,105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80,111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110,100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115,100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112,108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116,105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101,114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101,115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110,105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102,114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103,105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103,101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115,101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105,110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32,115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115,105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101,116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105,110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116,105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111,116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84,104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101,112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108,108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32,102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101,99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112,105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99,101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115,101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108,101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117,110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114,101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97,107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112,108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104,112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101,98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32,100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100,105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108,105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100,32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116,104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110,39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101,102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114,114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101,110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116,97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45,119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111,102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117,110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97,100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103,114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116,101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110,32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116,117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102,44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115,105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97,116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97,108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97,110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116,59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100,104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105,100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101,32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108,101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117,105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104,101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102,97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98,106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111,112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114,101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97,114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97,108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100,34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110,101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105,116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32,109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111,119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97,100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109,101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104,114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116,111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103,101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108,111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110,103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116,105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104,101,114,116,114,101,109,101,110,100],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+245824);allocate([111,117,115,102,114,101,101,100,111,109,32,111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32,49,101,109,59,66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110,32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110,103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32,111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116,97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110,116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120,61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103,101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110,116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110,103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108,111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110,115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111,100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112,117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101,115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101,115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105,115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99,116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99,105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110,105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114,97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195,173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108,101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97,118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114,101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111,108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99,117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101,114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195,179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116,117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116,101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110,116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181,209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188,209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177,209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189,209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180,208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179,208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181,208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130,208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180,209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129,208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181,208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189,208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181,208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179,208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184,209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190,208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181,209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190,208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181,208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130,209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139,209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190,208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181,208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139,208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187,208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190,208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130,208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184,208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184,209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183,209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131,208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179,208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181,208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184,208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190,208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180,208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131,208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187,208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143,209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130,209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139,209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139,208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130,208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130,208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130,208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184,209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189,208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181,209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190,208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134,208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190,208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175,217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132,216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135,216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136,217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175,216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129,216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167,216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167,216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138,217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167,216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131,217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167,216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138,216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138,216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177,216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167,217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138,216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133,217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134,217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138,217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138,216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138,217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133,216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138,217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138,217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168,216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129,216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132,217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134,216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173,217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167,216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132,217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168,216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166,217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175,216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179,217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170,216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177,217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138,217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61,34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105,111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115,105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110,109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100,105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118,101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112,108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58,99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34,101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116,105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116,105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101,99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104,116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99,114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108,108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108,111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117,110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99,111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101,100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116,105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118,101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115,101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115,112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105,99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116,101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111,114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114,105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45,115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112,112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103,104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116,104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97,110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102,41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105,111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116,105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109,101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105,118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108,117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111,109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77,105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99,111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101,105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101,114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111,117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115,105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110,116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101,114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99,116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101,114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97,32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114,101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105,111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99,61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105,111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115,115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101,115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117,110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97,114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108,116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108,121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48,37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101,32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105,101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100,61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97,116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104,101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98,101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111,110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110,110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97,115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112,120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100,100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61,34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32,98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105,116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99,117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110,116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118,101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109,111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101,100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115,32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105,116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111,108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110,115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103,116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111,102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116,104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116,105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114,105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116,101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62,60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104,32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109,102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104,114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105,110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121,105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110,104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97,115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32,111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116,105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117,108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59,84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101,110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109,112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114,101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101,115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112,104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121,32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97,114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105,99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116,97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109,112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115,104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116,102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32,116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119,105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114,116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113,117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112,114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47,105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61,34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62,60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101,32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117,116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112,104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103,115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117,114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109,112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109,112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105,114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47,68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101,110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119,104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32,105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103,101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115,101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111,114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105,99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109,112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102,111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102,72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101,114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97,114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32,116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116,105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110,108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84,83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99,104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103,104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104,101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116,101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101,97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110,99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110,100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100,32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97,116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32,112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114,101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97,114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116,112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60,47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116,116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114,101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117,110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101,114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116,101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108,97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117,115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32,105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115,105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116,105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109,105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97,99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105,116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116,111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105,112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105,110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32,110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97,109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115,116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102,111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101,109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47,105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110,116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115,111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32,111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97,116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114,101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108,118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32,115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101,109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116,111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115,99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111,110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115,105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116,105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108,97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116,104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109,108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115,115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121,32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117,101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116,111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115,111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101,110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116,104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48,37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109,101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103,110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117,110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32,99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116,117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66,101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100,34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111,97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62,105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110,116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121,44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49,105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101,99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121,32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99,101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101,32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98,101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32,116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101,108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116,104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101,97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97,102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101,116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104,101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61,34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105,111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115,32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32,116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45,115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97,115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115,32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110,101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115,116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111,102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32,111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115,32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97,116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110,103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101,115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99,111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111,105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111,114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100,101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110,115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118,101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100,32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105,109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101,118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114,105,111,100,32,111,102,97,114,101,32,97,98,108,101],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+256064);allocate([32,116,111,104,111,119,101,118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99,104,32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111,112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100,105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121,119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111,102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105,110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115,116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105,101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115,116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112,101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111,109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114,101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101,99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108,121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32,105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111,110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108,101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111,32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32,111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105,122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111,32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97,108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101,102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97,110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100,32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100,101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102,111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111,102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32,112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104,101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112,111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110,69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114,44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115,101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32,111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117,111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114,108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108,116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104,105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116,121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108,101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105,115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97,32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99,111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116,104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102,101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100,116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97,110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117,110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115,32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117,115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101,119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34,34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44,97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101,116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104,101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105,108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32,116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108,101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118,101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117,116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114,115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97,116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116,32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111,114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100,32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99,111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99,117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111,110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110,116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101,100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32,104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116,114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102,32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116,105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111,112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114,101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110,100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116,111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98,101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32,111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110,115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59,46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32,109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105,110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97,32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101,32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105,109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98,111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115,109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111,102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32,111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32,111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100,32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110,32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101,102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101,101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114,111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116,104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105,97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119,97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110,112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105,108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111,32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116,105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116,108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111,117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84,104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116,99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79,102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103,110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62,60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121,32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99,111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115,101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195,179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101,195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114,97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109,105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114,101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111,116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105,110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108,101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110,116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116,114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111,114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101,108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111,115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97,109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101,99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103,97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115,104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99,108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105,115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101,110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116,105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119,46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117,116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110,116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110,97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103,105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111,110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97,115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108,105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101,100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47,100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101,102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101,108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32,112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97,108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116,105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111,117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117,108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117,112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108,97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41,59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112,58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104,110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61,102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105,111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117,110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103,114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111,110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122,101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115,116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97,99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116,105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114,105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119,108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112,97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118,62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105,108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119,101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116,97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67,111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115,116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106,117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105,109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105,111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114,115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32,103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34,114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38,103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105,111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118,105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110,99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108,108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101,110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114,105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105,110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116,105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99,117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112,97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125,10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116,121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105,111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103,101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40,115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115,115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100,101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47,105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110,103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101,113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105,100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110,103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118,97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111,99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102,48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105,111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101,100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104,105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110,103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99,97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116,97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110,102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116,97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110,100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110,116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110,103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101,115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116,115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104,114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103,114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32,102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101,115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109,101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110,121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59,97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116,104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101,114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101,105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101,115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112,101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111,115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32,105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111,102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100,105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105,111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32,116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110,97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101,114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97,110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116,97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32,98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97,115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110,103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111,32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117,109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107,110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101,110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110,32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111,112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32,99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101,32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114,109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32,100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32,109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109,98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104,116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105,108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104,117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61,34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116,105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114,111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110,97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32,116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110,115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111,119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32,102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101,115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60,100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32,105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62,10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34,32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100,110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118,101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97,100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32,103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101,110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108,117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115,105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32,98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105,111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108,101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116,101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110,97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114,111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114,101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32,111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108,121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110,99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110,32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108,121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99,116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110,103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105,115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104,101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119,119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111,110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98,101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110,101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101,114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32,108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99,111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100,105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97,98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103,103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115,118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117,112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98,101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101,110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109,101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61,34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116,105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97,62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116,114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112,108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114,115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111,112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110,97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101,110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32,116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114,111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111,102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115,32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104,101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32,101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101,116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114,111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97,114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99,111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110,101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111,109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114,101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104,101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111,117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116,104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109,97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97,115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101,114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13,10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110,105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32,115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115,32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116,101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114,110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116,104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97,110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105,108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111,110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32,111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111,102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101,97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101,102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104,101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101,114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115,32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117,108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101,119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+266304);allocate([61,34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101,99,97,109,101,104,101,32,112,117,98,108,105,115,104,101,100,101,120,112,114,101,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111,109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104,116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115,105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104,111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108,108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97,108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116,105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101,101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104,101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108,108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114,105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114,101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32,116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32,112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84,97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118,105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116,62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101,100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101,102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44,32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111,114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101,114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112,101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101,100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112,101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116,105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110,115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116,104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105,103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116,104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111,114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105,110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102,101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102,97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105,122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115,115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104,101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105,115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117,110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116,32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45,116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111,32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32,111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117,109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179,208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190,217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184,173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228,189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184,228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183,180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228,189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132,105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110,111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110,114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116,105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110,111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109,105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115,112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97,101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97,99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108,105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101,110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110,116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105,116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117,98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208,190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208,190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209,128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208,181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209,135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209,129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209,143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208,179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208,190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209,133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208,189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209,131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208,176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208,181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208,190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208,184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208,176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208,176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209,143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208,190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209,130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208,185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208,190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209,129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208,185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208,191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208,176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208,187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208,176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208,181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209,129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208,181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208,190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209,133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208,190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208,190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208,185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209,129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208,184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208,184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208,190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208,190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209,140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208,187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208,176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208,181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209,135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208,176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208,189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209,129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208,184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209,143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208,176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208,189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208,181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208,189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208,181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208,176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209,143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209,131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164,130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224,164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149,224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164,175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224,164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149,224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164,190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224,164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133,224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165,135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224,164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185,224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165,135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224,164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156,224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164,159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224,164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175,224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165,135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224,164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182,224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165,135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224,164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174,224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164,176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224,164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174,224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164,163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224,164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185,224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164,166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224,164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149,224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164,190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224,164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170,224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165,135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224,164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181,224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164,181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224,164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184,224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164,130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224,164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184,224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164,166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224,164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156,224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164,184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224,164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152,224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165,135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224,164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151,224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165,135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224,164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135,224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164,185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224,164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172,224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164,190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224,164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172,224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165,135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224,164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156,224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164,190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224,164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184,224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164,190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224,164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150,224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164,165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224,164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168,224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164,190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224,165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166,224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165,135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224,164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174,224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164,130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224,164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184,224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164,181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224,164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137,224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164,172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224,164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182,224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165,135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224,164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181,224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164,178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224,164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149,224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164,185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216,183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217,136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216,169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216,167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217,132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216,168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216,167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217,132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216,185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216,177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217,132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216,169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216,177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216,173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217,138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216,177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217,132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216,177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216,179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216,172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217,134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216,183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217,132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217,135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216,167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217,132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216,175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216,167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217,138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216,171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216,175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217,132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216,185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217,133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216,180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216,179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217,134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217,132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216,179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217,132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101,110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110,99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111,110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116,104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97,110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110,105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105,122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104,101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110,105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110,118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99,111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32,111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111,110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117,110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112,108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108,105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121,112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110,97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98,97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105,101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119,101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112,114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32,119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115,105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61,34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111,117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116,105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102,116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101,110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117,108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97,108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98,108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117,110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105,110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97,116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103,103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105,111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105,111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40,102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115,32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100,105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99,101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101,100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116,116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32,116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116,105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60,108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47,47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32,103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101,110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116,121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62,60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101,32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32,116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105,109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111,114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111,110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105,110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111,110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112,114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114,111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101,114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32,98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32,115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115,104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97,110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100,62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32,116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97,108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111,102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99,99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105,118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110,32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105,109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116,105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103,116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101,114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114,105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101,114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45,69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111,112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99,104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32,111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32,111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108,111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97,110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104,97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117,116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101,115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102,111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108,111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99,104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117,101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97,109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101,113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117,115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100,32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32,116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111,100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112,116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101,110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108,105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110,101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111,114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111,102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109,109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117,110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101,116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99,105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111,32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97,109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116,104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108,101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116,116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115,115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41,32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32,100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115,117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121,32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32,100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98,105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110,116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115,111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100,39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108,97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101,102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117,116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116,104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111,120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34,78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105,111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104,101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114,45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32,117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104,101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101,114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121,32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108,108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105,110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101,100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72,111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108,101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110,116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32,97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97,114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32,97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101,110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111,110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101,114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116,111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116,105,116,105,111,110,101],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+276544);allocate([114,115,116,104,97,116,32,104,101,32,119,111,117,108,100,97,110,100,32,99,111,110,116,105,110,117,101,100,111,99,99,117,112,97,116,105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101,110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116,32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101,98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108,101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111,117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101,115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99,108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97,110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97,116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99,111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117,116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100,32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99,117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119,97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101,115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111,102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122,97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101,108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116,32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121,32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97,115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114,101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32,105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111,108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111,110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99,97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99,105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115,104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108,121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110,115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32,97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32,116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32,97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97,114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115,115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116,111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108,108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116,117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100,67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110,100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111,117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117,114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99,116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97,117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32,116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99,101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110,99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32,102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97,108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100,32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115,117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32,111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114,101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104,101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110,116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115,32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105,115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111,116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115,115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97,108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97,99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104,101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97,121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97,105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99,105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115,116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61,34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110,115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112,111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108,32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110,115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110,116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104,116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10,46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115,116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108,111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110,98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105,102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114,110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112,116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98,109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99,111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111,110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99,111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100,100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32,116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114,111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105,111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116,101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104,101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104,114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108,97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33,91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110,32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32,99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100,101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117,110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116,104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101,32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97,99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111,110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105,100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104,101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100,101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104,101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111,108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32,109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110,119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40,119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62,60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116,34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100,32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99,101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99,111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116,105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101,108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99,114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115,115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111,32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34,62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101,100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32,111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99,97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108,97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100,121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121,32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101,115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47,100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116,62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101,115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115,112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121,32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99,116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114,115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98,101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103,104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114,101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97,110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114,32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116,111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101,100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32,101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99,116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105,116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107,101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110,100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108,105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114,108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116,32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118,32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108,101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114,110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104,101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101,114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116,111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101,61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114,101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116,34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105,116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101,101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97,119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110,118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108,116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115,99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97,100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104,101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114,101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111,102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112,120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111,110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104,101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111,110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111,110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116,105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111,117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100,111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100,105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110,32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116,32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117,100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116,114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116,105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105,98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101,115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32,98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60,119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111,105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111,114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117,114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116,111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115,101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104,101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110,32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111,102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111,32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115,101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111,114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99,97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97,115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32,116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100,121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102,101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104,101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110,100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115,116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110,107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108,105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60,115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99,116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10,60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32,116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98,108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61,34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32,116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104,101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105,110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99,101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100,105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47,100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105,110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115,105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32,117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116,105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110,32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116,101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108,102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99,111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109,97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32,116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116,104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111,114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32,116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60,47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101,114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119,104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110,97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105,116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114,101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32,116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101,101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114,110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103,101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102,111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104,105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117,110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32,116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34,113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105,101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100,32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62,60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104,101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112,116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112,115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208,186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208,176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208,185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209,129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208,177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208,181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209,129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209,135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208,184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208,191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208,190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208,190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209,129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209,129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208,181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209,130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208,188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208,186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208,190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209,129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208,176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208,190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209,130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208,190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208,181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216,170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216,167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216,185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216,167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217,132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216,182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216,167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216,179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217,133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217,129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217,138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217,132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216,168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216,167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216,167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216,169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216,174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217,133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217,132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217,132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216,167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216,175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216,177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216,167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110,116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97,115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108,45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115,99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34,102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99,108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34,32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110,103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105,118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116,32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32,32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32,118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97,98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109,32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110,58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100,105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97,116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105,115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101,115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62,60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115,44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111,108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+286784);allocate([110,32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118,62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105,111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121,99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32,116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114,116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32,116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32,104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112,116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112,97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111,102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116,104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111,117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116,104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114,105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97,100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32,111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99,111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104,101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110,61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98,101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97,99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116,104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105,100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104,101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110,100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97,112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97,115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32,111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115,117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117,111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115,116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115,105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104,101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117,114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112,80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105,110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109,97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97,116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98,121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62,13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32,112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105,110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135,32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105,100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116,101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110,100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164,151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224,164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151,224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164,181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178,224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164,130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224,165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174,224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165,128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224,164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174,224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164,151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224,164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183,224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165,135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224,165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176,224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164,171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224,164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166,224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164,176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185,224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224,164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150,224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165,135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141,224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164,136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224,164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188,224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224,165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141,224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165,128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224,164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173,224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165,135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224,164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141,224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164,184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224,164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164,224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164,184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224,164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190,224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165,128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224,164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164,224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164,190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224,165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139,224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164,164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224,165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184,224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165,130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224,164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154,224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164,175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224,164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149,224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165,135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224,164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115,34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121,108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114,105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114,100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120,116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100,101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111,118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105,118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101,114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40,41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114,101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97,115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116,121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101,114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111,109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87,111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32,111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104,101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101,114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97,116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110,97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58,49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32,111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116,121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99,114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13,10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102,32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60,47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115,97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115,105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186,206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186,208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187,209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178,208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186,208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152,208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178,208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184,208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129,209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135,208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178,208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188,209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143,208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184,208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176,208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184,208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167,217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177,216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170,217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170,217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167,217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179,216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166,217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138,216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167,217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170,216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132,216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111,98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100,61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83,116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48,34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117,111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109,97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61,34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32,111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116,117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110,99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34,62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114,101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99,111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109,103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115,99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44,32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108,97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32,112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116,104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46,109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109,101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99,101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102,105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104,32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97,114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65,108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101,110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112,108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114,115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114,111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80,114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114,100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32,112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116,104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117,97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100,101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97,108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97,116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101,118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105,111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186,206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110,100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117,116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87,105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116,108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101,120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110,116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97,99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101,100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101,110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116,97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114,103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97,116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32,116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101,32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114,101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104,97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97,110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108,108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98,115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45,99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105,111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105,112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46,106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105,118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121,108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32,99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116,101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45,119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108,105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116,104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116,101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100,101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98,115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101,114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117,108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32,99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34,32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97,110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116,104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114,101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114,111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58,47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97,116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108,101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110,32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115,105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109,112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102,32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114,101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32,102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83,116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112,108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32,105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111,117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119,105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32,99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105,110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32,111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110,100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101,110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103,104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116,101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71,101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47,119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100,105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110,111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99,101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114,97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110,100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101,100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114,111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32,116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72,111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118,62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97,103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103,110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108,101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111,111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104,101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208,176,209,130,208,181,209],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+297024);allocate([128,208,184,208,176,208,187,209,139,208,191,208,190,208,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191,208,190,209,129,208,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120,116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115,116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112,116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58,47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110,101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116,58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105,116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97,114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115,115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10,13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102,45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46,105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112,101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116,105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101,100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32,98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111,102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32,32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47,115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114,121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97,110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105,101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104,101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105,110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32,112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113,117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97,109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105,99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105,101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32,99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105,110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118,101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34,47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101,120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117,97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99,97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117,103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101,100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110,32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102,102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10,60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101,114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105,98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117,110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102,32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112,101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98,101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110,116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44,32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114,32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105,101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105,116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110,32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109,101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100,104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34,32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115,97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99,116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116,37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68,97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105,111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47,100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97,114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34,32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119,101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108,61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117,108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121,61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116,101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62,60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115,32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32,116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109,101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101,110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103,104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32,109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116,105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105,111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105,99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115,116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38,97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101,32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101,103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101,101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116,111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110,32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114,115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116,40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112,97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114,105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111,116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97,114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110,103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109,105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116,104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115,112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208,163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209,131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208,160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208,188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208,184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209,131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208,189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208,184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208,152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208,160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208,186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208,184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209,130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208,180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216,167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216,167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216,167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104,116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115,112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108,105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105,112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40,41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112,111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62,60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110,97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165,141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224,164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183,224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164,168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224,164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141,224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165,141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224,164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184,224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164,154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168,224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164,190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224,164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190,224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164,149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224,164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154,224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164,130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224,164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191,224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164,190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224,164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164,188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224,164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191,224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114,105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115,34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60,47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103,61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115,112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74,97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115,112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105,110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115,116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61,34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117,110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100,101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111,110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111,32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208,183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208,183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208,184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208,177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60,33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101,114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112,58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119,119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68,84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49,47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116,105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66,101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97,100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99,117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112,116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103,101,116],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+307264);allocate([69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110,105,99,97,108,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176,224,164,191,224,164,175,224,164,164,224,164,190,0,32,0,32,116,104,101,32,0,115,32,0,32,111,102,32,0,32,97,110,100,32,0,44,32,0,32,105,110,32,0,32,116,111,32,0,101,32,0,34,0,34,62,0,10,0,93,0,32,102,111,114,32,0,32,97,32,0,32,116,104,97,116,32,0,46,32,0,32,119,105,116,104,32,0,39,0,32,102,114,111,109,32,0,32,98,121,32,0,46,32,84,104,101,32,0,32,111,110,32,0,32,97,115,32,0,32,105,115,32,0,105,110,103,32,0,10,9,0,58,0,101,100,32,0,40,0,32,97,116,32,0,108,121,32,0,61,34,0,46,99,111,109,47,0,32,111,102,32,116,104,101,32,0,46,32,84,104,105,115,32,0,44,0,32,110,111,116,32,0,101,114,32,0,97,108,32,0,61,39,0,102,117,108,32,0,105,118,101,32,0,108,101,115,115,32,0,101,115,116,32,0,105,122,101,32,0,194,160,0,111,117,115,32,0,0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,78,54,98,114,111,116,108,105,49,50,66,114,111,116,108,105,77,101,109,79,117,116,69,0,78,54,98,114,111,116,108,105,49,49,66,114,111,116,108,105,77,101,109,73,110,69,0,78,54,98,114,111,116,108,105,56,66,114,111,116,108,105,73,110,69,0,78,54,98,114,111,116,108,105,57,66,114,111,116,108,105,79,117,116,69,0,118,111,105,100,0,98,111,111,108,0,99,104,97,114,0,115,105,103,110,101,100,32,99,104,97,114,0,117,110,115,105,103,110,101,100,32,99,104,97,114,0,115,104,111,114,116,0,117,110,115,105,103,110,101,100,32,115,104,111,114,116,0,105,110,116,0,117,110,115,105,103,110,101,100,32,105,110,116,0,108,111,110,103,0,117,110,115,105,103,110,101,100,32,108,111,110,103,0,102,108,111,97,116,0,100,111,117,98,108,101,0,115,116,100,58,58,115,116,114,105,110,103,0,115,116,100,58,58,98,97,115,105,99,95,115,116,114,105,110,103,60,117,110,115,105,103,110,101,100,32,99,104,97,114,62,0,115,116,100,58,58,119,115,116,114,105,110,103,0,101,109,115,99,114,105,112,116,101,110,58,58,118,97,108,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,115,105,103,110,101,100,32,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,99,104,97,114,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,115,104,111,114,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,115,104,111,114,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,105,110,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,108,111,110,103,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,110,115,105,103,110,101,100,32,108,111,110,103,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,56,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,56,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,49,54,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,49,54,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,105,110,116,51,50,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,117,105,110,116,51,50,95,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,102,108,111,97,116,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,100,111,117,98,108,101,62,0,101,109,115,99,114,105,112,116,101,110,58,58,109,101,109,111,114,121,95,118,105,101,119,60,108,111,110,103,32,100,111,117,98,108,101,62,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,101,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,100,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,102,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,109,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,108,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,106,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,105,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,116,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,115,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,104,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,97,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,49,49,109,101,109,111,114,121,95,118,105,101,119,73,99,69,69,0,78,49,48,101,109,115,99,114,105,112,116,101,110,51,118,97,108,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,119,69,69,69,69,0,78,83,116,51,95,95,49,50,49,95,95,98,97,115,105,99,95,115,116,114,105,110,103,95,99,111,109,109,111,110,73,76,98,49,69,69,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,104,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,104,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,104,69,69,69,69,0,78,83,116,51,95,95,49,49,50,98,97,115,105,99,95,115,116,114,105,110,103,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,99,69,69,69,69,0,83,116,57,98,97,100,95,97,108,108,111,99,0,83,116,57,101,120,99,101,112,116,105,111,110,0,83,116,49,49,108,111,103,105,99,95,101,114,114,111,114,0,83,116,49,50,111,117,116,95,111,102,95,114,97,110,103,101,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,51,95,95,102,117,110,100,97,109,101,110,116,97,108,95,116,121,112,101,95,105,110,102,111,69,0,118,0,98,0,99,0,104,0,97,0,115,0,116,0,105,0,106,0,108,0,109,0,102,0,100,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,33,34,98,97,115,105,99,95,115,116,114,105,110,103,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,104,111,109,101,47,110,102,114,111,105,100,117,114,101,47,112,114,111,106,101,99,116,115,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,109,97,115,116,101,114,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,115,116,114,105,110,103,0,95,95,116,104,114,111,119,95,108,101,110,103,116,104,95,101,114,114,111,114,0,33,34,118,101,99,116,111,114,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,104,111,109,101,47,110,102,114,111,105,100,117,114,101,47,112,114,111,106,101,99,116,115,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,109,97,115,116,101,114,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,118,101,99,116,111,114,0,112,116,104,114,101,97,100,95,111,110,99,101,32,102,97,105,108,117,114,101,32,105,110,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,95,102,97,115,116,40,41,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,114,101,116,117,114,110,101,100,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,116,104,114,101,97,100,32,107,101,121,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,99,97,110,110,111,116,32,122,101,114,111,32,111,117,116,32,116,104,114,101,97,100,32,118,97,108,117,101,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,58,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,102,111,114,101,105,103,110,32,101,120,99,101,112,116,105,111,110,0,116,101,114,109,105,110,97,116,105,110,103,0,117,110,99,97,117,103,104,116,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+317504);allocate([17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,46,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+324419);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}Module["_i64Subtract"]=_i64Subtract;function ___assert_fail(condition,filename,line,func){ABORT=true;throw"Assertion failed: "+Pointer_stringify(condition)+", at: "+[filename?Pointer_stringify(filename):"unknown filename",line,func?Pointer_stringify(func):"unknown function"]+" at "+stackTrace()}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return(new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n"))(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,(function(message){this.name=errorName;this.message=message;var stack=(new Error(message)).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}}));errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=(function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}});return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach((function(type){typeDependencies[type]=dependentTypes}));function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i0);info.refcount--;if(info.refcount===0){if(info.destructor){Runtime.dynCall("vi",info.destructor,[ptr])}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}EXCEPTIONS.clearRef(EXCEPTIONS.deAdjust(ptr));throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(asm["setTempRet0"](0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(asm["setTempRet0"](0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted=thrown;return(asm["setTempRet0"](typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(asm["setTempRet0"](throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}Module["_memset"]=_memset;var _BDtoILow=true;function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(wt){return!!wt}),"toWireType":(function(destructors,o){return o?trueValue:falseValue}),"argPackAdvance":8,"readValueFromPointer":(function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])}),destructorFunction:null})}Module["_bitshift64Shl"]=_bitshift64Shl;function _abort(){Module["abort"]()}function _free(){}Module["_free"]=_free;function _malloc(bytes){var ptr=Runtime.dynamicAlloc(bytes+8);return ptr+8&4294967288}Module["_malloc"]=_malloc;function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function __embind_register_std_string(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){var length=HEAPU32[value>>2];var a=new Array(length);for(var i=0;i>2]=length;for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}if(destructors!==null){destructors.push(_free,ptr)}return ptr}),"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:(function(ptr){_free(ptr)})})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=(function(value){return value});if(minRange===0){var bitshift=32-8*size;fromWireType=(function(value){return value<>>bitshift})}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return value|0}),"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Runtime.dynCall("v",func);_pthread_once.seen[ptr]=1}function ___lock(){}function ___unlock(){}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};var TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){stream.tty.ops.flush(stream.tty)}),flush:(function(stream){stream.tty.ops.flush(stream.tty)}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.buffer.byteLength:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var errored=false;var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~32768;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};var _stdin=allocate(1,"i32*",ALLOC_STATIC);var _stdout=allocate(1,"i32*",ALLOC_STATIC);var _stderr=allocate(1,"i32*",ALLOC_STATIC);var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if((flags&2097155)!==0||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}var mounts=FS.getMounts(FS.root.mount);var completed=0;function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=mounts.length){callback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdev:(function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw new FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(ERRNO_CODES.EXDEV)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}}),rmdir:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return node.node_ops.readdir(node)}),unlink:(function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){if(err===ERRNO_CODES.EISDIR)err=ERRNO_CODES.EPERM;throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}}),readlink:(function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return node.node_ops.getattr(node)}),lstat:(function(path){return FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.nodePermissions(node,"w");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;Module["printErr"]("read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream}),close:(function(stream){if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=true;if(typeof position==="undefined"){position=stream.position;seeking=false}else if(!stream.seekable){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+e.message)}return bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return 0}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(ERRNO_CODES.ENOTTY)}return stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||"w";opts.encoding=opts.encoding||"utf8";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var stream=FS.open(path,opts.flags,opts.mode);if(opts.encoding==="utf8"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,0,opts.canOwn)}else if(opts.encoding==="binary"){FS.write(stream,data,0,data.length,0,opts.canOwn)}FS.close(stream)}),cwd:(function(){return FS.currentPath}),chdir:(function(path){var lookup=FS.lookupPath(path,{follow:true});if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var err=FS.nodePermissions(lookup.node,"x");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")}),createDefaultDevices:(function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:(function(){return 0}),write:(function(stream,buffer,offset,length,pos){return length})});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device;if(typeof crypto!=="undefined"){var randomBuffer=new Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]})}else if(ENVIRONMENT_IS_NODE){random_device=(function(){return require("crypto").randomBytes(1)[0]})}else{random_device=(function(){return Math.random()*256|0})}FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")}),createSpecialDirectories:(function(){FS.mkdir("/proc");FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:(function(){var node=FS.createNode("/proc/self","fd",16384|511,73);node.node_ops={lookup:(function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:(function(){return stream.path})}};ret.parent=ret;return ret})};return node})},{},"/proc/self/fd")}),createStandardStreams:(function(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin","r");assert(stdin.fd===0,"invalid handle for stdin ("+stdin.fd+")");var stdout=FS.open("/dev/stdout","w");assert(stdout.fd===1,"invalid handle for stdout ("+stdout.fd+")");var stderr=FS.open("/dev/stderr","w");assert(stderr.fd===2,"invalid handle for stderr ("+stderr.fd+")")}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var key in ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var fflush=Module["_fflush"];if(fflush)fflush(0);for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperty(lazyArray,"length",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})});Object.defineProperty(lazyArray,"chunkSize",{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperty(node,"usedBytes",{get:(function(){return this.contents.length})});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}if(Browser.mainLoop.method==="timeout"&&Module.ctx){Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter((function(){if(typeof arg!=="undefined"){Runtime.dynCall("vi",func,[arg])}else{Runtime.dynCall("v",func)}}));if(thisMainLoopId0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);var canvas=Module["canvas"];function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===canvas||document["mozPointerLockElement"]===canvas||document["webkitPointerLockElement"]===canvas||document["msPointerLockElement"]===canvas}if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&canvas.requestPointerLock){canvas.requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}canvas.style.backgroundColor="black"}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullScreenChange(){Browser.isFullScreen=false;var canvasContainer=canvas.parentNode;if((document["webkitFullScreenElement"]||document["webkitFullscreenElement"]||document["mozFullScreenElement"]||document["mozFullscreenElement"]||document["fullScreenElement"]||document["fullscreenElement"]||document["msFullScreenElement"]||document["msFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.cancelFullScreen=document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["webkitCancelFullScreen"]||document["msExitFullscreen"]||document["exitFullscreen"]||(function(){});canvas.cancelFullScreen=canvas.cancelFullScreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullScreen=true;if(Browser.resizeCanvas)Browser.setFullScreenCanvasSize()}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas)Browser.setWindowedCanvasSize()}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullScreen);Browser.updateCanvasDimensions(canvas)}if(!Browser.fullScreenHandlersInstalled){Browser.fullScreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullScreenChange,false);document.addEventListener("mozfullscreenchange",fullScreenChange,false);document.addEventListener("webkitfullscreenchange",fullScreenChange,false);document.addEventListener("MSFullscreenChange",fullScreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullScreen=canvasContainer["requestFullScreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullScreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullScreen()}}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),xhrLoad:(function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)}),asyncLoad:(function(url,onload,onerror,noRunDep){Browser.xhrLoad(url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(!noRunDep)removeRunDependency("al "+url)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(!noRunDep)addRunDependency("al "+url)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags|8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags&~8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);ret=ret.slice(0,Math.max(0,bufsize));writeStringToMemory(ret,buf,true);return ret.length}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["_i64Add"]=_i64Add;Module["_bitshift64Lshr"]=_bitshift64Lshr;var _llvm_ctlz_i32=true;function floatReadValueFromPointer(name,shift){switch(shift){case 2:return(function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])});case 3:return(function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])});default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":(function(value){return value}),"toWireType":(function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value}),"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}var _BDtoIHigh=true;function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Runtime.dynCall("vi",routine,[arg])}));_pthread_cleanup_push.level=__ATEXIT__.length}function ___cxa_guard_acquire(variable){if(!HEAP8[variable>>0]){HEAP8[variable>>0]=1;return 1}return 0}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",(function(){}));dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var argsList="";var argsListWired="";for(var i=0;i0?", ":"")+argsListWired}var returns=argTypes[0].name!=="void";invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value}}function requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i>>0}return ret}Module["_memmove"]=_memmove;function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var getHeap,shift;if(charSize===2){getHeap=(function(){return HEAPU16});shift=1}else if(charSize===4){getHeap=(function(){return HEAPU32});shift=2}registerType(rawType,{name:name,"fromWireType":(function(value){var HEAP=getHeap();var length=HEAPU32[value>>2];var a=new Array(length);var start=value+4>>shift;for(var i=0;i>2]=length;var start=ptr+4>>shift;for(var i=0;i>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(heap["buffer"],data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function _pthread_self(){return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");Module["requestFullScreen"]=function Module_requestFullScreen(lockPointer,resizeCanvas,vrDevice){Browser.requestFullScreen(lockPointer,resizeCanvas,vrDevice)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}init_emval();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);staticSealed=true;STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=DYNAMICTOP=Runtime.alignMemory(STACK_MAX);assert(DYNAMIC_BASE2147483648)return false;i=new a(newBuffer);j=new b(newBuffer);k=new c(newBuffer);l=new d(newBuffer);m=new e(newBuffer);n=new f(newBuffer);o=new g(newBuffer);p=new h(newBuffer);buffer=newBuffer;return true} +// EMSCRIPTEN_START_FUNCS +function me(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0;x=r;r=r+32|0;u=x+24|0;w=x+12|0;v=x;ne(w,a);q=v+4|0;k[q>>2]=0;s=v+8|0;k[s>>2]=0;c=v+4|0;k[v>>2]=c;t=b+4|0;d=k[t>>2]|0;e=k[b>>2]|0;a:do if((d|0)==(e|0)){f=a;e=d;j=0}else{n=c;i=0;m=0;j=0;while(1){l=e+(m<<2)|0;if(i){h=k[l>>2]|0;f=c;g=i;b:do{while(1){if((k[g+16>>2]|0)>=(h|0)){f=g;break}g=k[g+4>>2]|0;if(!g)break b}g=k[f>>2]|0}while((g|0)!=0);if(!((f|0)!=(c|0)?(h|0)>=(k[f+16>>2]|0):0))p=12}else p=12;if((p|0)==12){do if(i){h=k[l>>2]|0;d=i;while(1){f=k[d+16>>2]|0;if((h|0)<(f|0)){f=k[d>>2]|0;if(!f){e=d;p=16;break}else d=f}else{if((f|0)>=(h|0)){p=22;break}f=d+4|0;g=k[f>>2]|0;if(!g){e=f;p=20;break}else d=g}}if((p|0)==16){k[u>>2]=d;p=23;break}else if((p|0)==20){k[u>>2]=d;p=23;break}else if((p|0)==22){p=0;k[u>>2]=d;if(!d){e=u;p=23;break}else break}}else{k[u>>2]=c;e=c;d=n;p=23}while(0);if((p|0)==23){p=0;f=og(24)|0;k[f+16>>2]=k[l>>2];k[f+20>>2]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=d;k[e>>2]=f;d=k[k[v>>2]>>2]|0;if(!d)d=f;else{k[v>>2]=d;d=k[e>>2]|0}Hc(k[q>>2]|0,d);k[s>>2]=(k[s>>2]|0)+1;e=k[b>>2]|0;d=f}k[d+20>>2]=j;ki((k[a>>2]|0)+(j*2832|0)|0,(k[w>>2]|0)+((k[e+(m<<2)>>2]|0)*2832|0)|0,2832)|0;d=k[t>>2]|0;e=k[b>>2]|0;j=j+1|0}f=m+1|0;if(f>>>0>=d-e>>2>>>0){f=a;break a}i=k[c>>2]|0;m=f}}while(0);h=a+4|0;i=k[h>>2]|0;f=k[f>>2]|0;g=(i-f|0)/2832|0;if(j>>>0<=g>>>0){if(j>>>0>>0?(o=f+(j*2832|0)|0,(i|0)!=(o|0)):0)k[h>>2]=i+(~(((i+-2832-o|0)>>>0)/2832|0)*2832|0)}else{je(a,j-g|0);d=k[t>>2]|0;e=k[b>>2]|0}if((d|0)!=(e|0)){m=c;l=0;do{j=e+(l<<2)|0;f=k[c>>2]|0;do if(f){i=k[j>>2]|0;while(1){g=k[f+16>>2]|0;if((i|0)<(g|0)){g=k[f>>2]|0;if(!g){d=f;e=f;p=41;break}else f=g}else{if((g|0)>=(i|0)){p=47;break}g=f+4|0;h=k[g>>2]|0;if(!h){d=g;p=45;break}else f=h}}if((p|0)==41){k[u>>2]=e;g=d;d=e;p=48;break}else if((p|0)==45){k[u>>2]=f;g=d;d=f;p=48;break}else if((p|0)==47){p=0;k[u>>2]=f;if(!f){g=u;d=f;p=48;break}else break}}else{k[u>>2]=c;g=c;d=m;p=48}while(0);if((p|0)==48){f=og(24)|0;k[f+16>>2]=k[j>>2];k[f+20>>2]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=d;k[g>>2]=f;d=k[k[v>>2]>>2]|0;if(!d)d=f;else{k[v>>2]=d;d=k[g>>2]|0}Hc(k[q>>2]|0,d);k[s>>2]=(k[s>>2]|0)+1;e=k[b>>2]|0;d=k[t>>2]|0}k[e+(l<<2)>>2]=k[f+20>>2];l=l+1|0}while(l>>>0>2>>>0)}_d(v,k[c>>2]|0);e=k[w>>2]|0;if(!e){r=x;return}c=w+4|0;d=k[c>>2]|0;if((d|0)!=(e|0))k[c>>2]=d+(~(((d+-2832-e|0)>>>0)/2832|0)*2832|0);rg(e);r=x;return}function ne(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;k[a>>2]=0;f=a+4|0;k[f>>2]=0;k[a+8>>2]=0;e=b+4|0;h=k[e>>2]|0;g=k[b>>2]|0;c=h-g|0;d=(c|0)/2832|0;if((h|0)==(g|0))return;if(d>>>0>1516584)mg(a);c=og(c)|0;k[f>>2]=c;k[a>>2]=c;k[a+8>>2]=c+(d*2832|0);d=k[b>>2]|0;b=k[e>>2]|0;if((d|0)==(b|0))return;do{ki(c|0,d|0,2832)|0;c=(k[f>>2]|0)+2832|0;k[f>>2]=c;d=d+2832|0}while((d|0)!=(b|0));return}function oe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0,h=0.0,j=0.0,m=0.0,n=0.0,q=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=r;r=r+3584|0;y=C+2880|0;x=C+40|0;z=C+2876|0;A=C+2872|0;B=C;w=C+8|0;if((c|0)==(d|0)){r=C;return}g=(d|0)<(c|0);u=g?c:d;g=g?d:c;k[w>>2]=g;k[w+4>>2]=u;i[w+8>>0]=1;c=k[b+(g<<2)>>2]|0;d=k[b+(u<<2)>>2]|0;b=d+c|0;t=+(c|0);if((c|0)<256)q=+o[4036+(c<<2)>>2];else q=+oh(t);s=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(s);m=+(b|0);if((b|0)<256)h=+o[4036+(b<<2)>>2];else h=+oh(m);v=w+24|0;d=a+(g*2832|0)|0;f=+p[a+(g*2832|0)+2824>>3];n=+p[a+(u*2832|0)+2824>>3];j=(t*q+s*j-m*h)*.5-f-n;p[v>>3]=j;do if(!(k[a+(g*2832|0)+2816>>2]|0)){p[w+16>>3]=n;f=n}else{b=k[a+(u*2832|0)+2816>>2]|0;if(!b){p[w+16>>3]=f;break}c=k[e>>2]|0;if((c|0)==(k[e+4>>2]|0))h=1.e+99;else{h=+p[c+24>>3];h=h>0.0?h:0.0}ki(x|0,d|0,2832)|0;d=x+2816|0;k[d>>2]=(k[d>>2]|0)+b;c=0;do{g=x+(c<<2)|0;k[g>>2]=(k[g>>2]|0)+(k[a+(u*2832|0)+(c<<2)>>2]|0);c=c+1|0}while((c|0)!=704);b=k[d>>2]|0;a:do if(!b)f=12.0;else{c=0;d=0;do{c=((k[x+(d<<2)>>2]|0)>0&1)+c|0;d=d+1|0}while((d|0)<704&(c|0)<5);g=c;switch(g|0){case 1:{f=12.0;break a}case 2:{f=+(b+20|0);break a}default:{}}gi(y|0,0,704)|0;Af(x,704,15,y);c=0;d=0;do{c=(ha(l[y+d>>0]|0,k[x+(d<<2)>>2]|0)|0)+c|0;d=d+1|0}while((d|0)!=704);switch(g|0){case 3:{c=c+28|0;break}case 4:{c=c+37|0;break}default:c=(Vd(y,704)|0)+c|0}f=+(c|0)}while(0);if(f>3]=f;break}r=C;return}while(0);p[v>>3]=f+j;c=e+4|0;d=k[c>>2]|0;if((d|0)==(k[e+8>>2]|0)){ce(e,w);c=k[c>>2]|0}else{k[d>>2]=k[w>>2];k[d+4>>2]=k[w+4>>2];k[d+8>>2]=k[w+8>>2];k[d+12>>2]=k[w+12>>2];k[d+16>>2]=k[w+16>>2];k[d+20>>2]=k[w+20>>2];k[d+24>>2]=k[w+24>>2];k[d+28>>2]=k[w+28>>2];w=(k[c>>2]|0)+32|0;k[c>>2]=w;c=w}w=c;e=k[e>>2]|0;k[z>>2]=e;k[A>>2]=w;k[x>>2]=k[z>>2];k[y>>2]=k[A>>2];de(x,y,B,w-e>>5);r=C;return}function pe(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0;t=r;r=r+1040|0;s=t;c=(b>>>0)/(c>>>0)|0;o=c+1|0;o=(o|0)>(d|0)?d:o;j=(b>>>0)/(o>>>0)|0;if((o|0)<=0){r=t;return}m=b+-1-e|0;n=s+1024|0;q=f+4|0;p=f+8|0;i=c+1|0;i=(i|0)<(d|0)?i:d;if(!e){d=0;do{gi(s|0,0,1028)|0;c=k[q>>2]|0;if((c|0)==(k[p>>2]|0))ue(f,s);else{ki(c|0,s|0,1040)|0;k[q>>2]=(k[q>>2]|0)+1040}d=d+1|0}while((d|0)!=(i|0));r=t;return}else{c=7;h=0}do{d=((ha(h,b)|0)>>>0)/(o>>>0)|0;if(h){g=c*16807|0;g=(g|0)==0?1:g;c=g;d=((g>>>0)%(j>>>0)|0)+d|0}gi(s|0,0,1024)|0;k[n>>2]=e;d=a+((d+e|0)>>>0>>0?d:m)|0;g=e;while(1){u=s+((l[d>>0]|0)<<2)|0;k[u>>2]=(k[u>>2]|0)+1;g=g+-1|0;if(!g)break;else d=d+1|0}d=k[q>>2]|0;if((d|0)==(k[p>>2]|0))ue(f,s);else{ki(d|0,s|0,1040)|0;k[q>>2]=(k[q>>2]|0)+1040}h=h+1|0}while((h|0)!=(i|0));r=t;return}function qe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,m=0,n=0,o=0,p=0,q=0;p=r;r=r+1040|0;o=p;n=k[d>>2]|0;m=((k[d+4>>2]|0)-n|0)/1040|0;i=((b<<1>>>0)/(c>>>0)|0)+99+m|0;i=i-((i>>>0)%(m>>>0)|0)|0;if((i|0)<=0){r=p;return}h=b+1-c|0;j=o+1024|0;if(b>>>0<=c>>>0){f=(b|0)==0;g=0;do{gi(o|0,0,1024)|0;k[j>>2]=b;if(f)d=0;else{d=a;e=b;while(1){c=o+((l[d>>0]|0)<<2)|0;k[c>>2]=(k[c>>2]|0)+1;e=e+-1|0;if(!e)break;else d=d+1|0}d=k[j>>2]|0}e=(g>>>0)%(m>>>0)|0;c=n+(e*1040|0)+1024|0;k[c>>2]=(k[c>>2]|0)+d;d=0;do{c=n+(e*1040|0)+(d<<2)|0;k[c>>2]=(k[c>>2]|0)+(k[o+(d<<2)>>2]|0);d=d+1|0}while((d|0)!=256);g=g+1|0}while((g|0)<(i|0));r=p;return}f=(c|0)==0;g=7;b=0;do{gi(o|0,0,1024)|0;e=g*16807|0;g=(e|0)==0?1:e;k[j>>2]=c;if(f)d=0;else{d=a+((g>>>0)%(h>>>0)|0)|0;e=c;while(1){q=o+((l[d>>0]|0)<<2)|0;k[q>>2]=(k[q>>2]|0)+1;e=e+-1|0;if(!e)break;else d=d+1|0}d=k[j>>2]|0}e=(b>>>0)%(m>>>0)|0;q=n+(e*1040|0)+1024|0;k[q>>2]=(k[q>>2]|0)+d;d=0;do{q=n+(e*1040|0)+(d<<2)|0;k[q>>2]=(k[q>>2]|0)+(k[o+(d<<2)>>2]|0);d=d+1|0}while((d|0)!=256);b=b+1|0}while((b|0)<(i|0));r=p;return}function re(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,m=0.0,n=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0.0;n=k[d>>2]|0;d=(k[d+4>>2]|0)-n|0;v=(d|0)/1040|0;if(v>>>0<2){if(!b)return;gi(e|0,0,b|0)|0;return}u=v<<8;u=qg(u>>>0>536870911?-1:u<<3)|0;gi(u|0,0,v<<11|0)|0;t=(d|0)>0;h=0;do{if(t){g=ha(h,v)|0;j=0;do{d=k[n+(j*1040|0)+1024>>2]|0;f=k[n+(j*1040|0)+(h<<2)>>2]|0;if((d|0)<256)q=+o[4036+(d<<2)>>2];else q=+oh(+(d|0));if(!f)m=q+2.0;else{if((f|0)<256)m=+o[4036+(f<<2)>>2];else m=+oh(+(f|0));m=q-m}p[u+(j+g<<3)>>3]=m;j=j+1|0}while((j|0)<(v|0))}h=h+1|0}while((h|0)!=256);r=qg(v>>>0>536870911?-1:v<<3)|0;gi(r|0,0,v<<3|0)|0;n=ha(v,b)|0;s=qg(n)|0;gi(s|0,0,n|0)|0;if(b){j=0;do{h=ha(j,v)|0;d=ha(l[a+j>>0]|0,v)|0;if(t){f=e+j|0;g=0;m=1.e+99;while(1){n=r+(g<<3)|0;q=+p[u+(g+d<<3)>>3]+ +p[n>>3];p[n>>3]=q;if(q>0]=g;else q=m;g=g+1|0;if((g|0)>=(v|0))break;else m=q}}else q=1.e+99;if(j>>>0<2e3)m=(+(j>>>0)*.07/2.0e3+.77)*c;else m=c;if(t){f=0;do{d=r+(f<<3)|0;w=+p[d>>3]-q;p[d>>3]=w;if(w>=m){p[d>>3]=m;i[s+(f+h)>>0]=1}f=f+1|0}while((f|0)<(v|0))}j=j+1|0}while((j|0)!=(b|0));d=b+-1|0;if((d|0)>0){n=d;h=l[e+d>>0]|0;j=ha(v,d)|0;while(1){g=n;n=n+-1|0;j=j-v|0;f=e+n|0;if(!(i[s+(j+h)>>0]|0))d=h;else d=l[f>>0]|0;i[f>>0]=d;if((g|0)<=1)break;else h=d}}}sg(u);sg(r);sg(s);return}function se(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,m=0;h=Fd(c,b)|0;i=k[d>>2]|0;m=d+4|0;e=k[m>>2]|0;f=i;if((e|0)==(i|0))g=i;else{g=e+(~(((e+-1040-f|0)>>>0)/1040|0)*1040|0)|0;k[m>>2]=g}e=(g-f|0)/1040|0;if(h>>>0<=e>>>0){if(h>>>0>>0?(j=i+(h*1040|0)|0,(g|0)!=(j|0)):0)k[m>>2]=g+(~(((g+-1040-j|0)>>>0)/1040|0)*1040|0)}else we(d,h-e|0);if(!b)return;e=k[d>>2]|0;f=0;do{d=l[c+f>>0]|0;m=e+(d*1040|0)+((l[a+f>>0]|0)<<2)|0;k[m>>2]=(k[m>>2]|0)+1;d=e+(d*1040|0)+1024|0;k[d>>2]=(k[d>>2]|0)+1;f=f+1|0}while((f|0)!=(b|0));return}function te(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0;w=r;r=r+1088|0;u=w+1076|0;s=w+1064|0;m=w;q=w+1052|0;o=w+1040|0;k[u>>2]=0;v=u+4|0;k[v>>2]=0;k[u+8>>2]=0;k[s>>2]=0;t=s+4|0;k[t>>2]=0;k[s+8>>2]=0;n=(b|0)==0;do if(!n)if(b>>>0>1073741823)mg(s);else{h=b<<2;d=og(h)|0;k[s>>2]=d;j=d+(b<<2)|0;k[s+8>>2]=j;gi(d|0,0,h|0)|0;k[t>>2]=j;break}else d=0;while(0);gi(m|0,0,1028)|0;h=m+1024|0;j=u+8|0;g=0;e=0;a:while(1){while(1){if(e>>>0>=b>>>0)break a;f=e+1|0;if((f|0)==(b|0)){p=10;break}x=(i[c+e>>0]|0)==(i[c+f>>0]|0);k[d+(e<<2)>>2]=g;e=m+(l[a+e>>0]<<2)|0;k[e>>2]=(k[e>>2]|0)+1;k[h>>2]=(k[h>>2]|0)+1;if(x)e=f;else{e=f;break}}if((p|0)==10){p=0;k[d+(e<<2)>>2]=g;e=m+(l[a+e>>0]<<2)|0;k[e>>2]=(k[e>>2]|0)+1;k[h>>2]=(k[h>>2]|0)+1;e=b}f=k[v>>2]|0;if((f|0)==(k[j>>2]|0)){ue(u,m);d=k[s>>2]|0}else{ki(f|0,m|0,1040)|0;k[v>>2]=f+1040}gi(m|0,0,1028)|0;g=g+1|0}k[q>>2]=0;h=q+4|0;k[h>>2]=0;k[q+8>>2]=0;k[o>>2]=0;g=o+4|0;k[g>>2]=0;k[o+8>>2]=0;ve(u,1,((k[v>>2]|0)-(k[u>>2]|0)|0)/1040|0,256,q,o);if(n){d=k[o>>2]|0;if(d)p=19}else{f=k[s>>2]|0;d=k[o>>2]|0;e=0;do{i[c+e>>0]=k[d+(k[f+(e<<2)>>2]<<2)>>2];e=e+1|0}while((e|0)!=(b|0));p=19}if((p|0)==19){e=k[g>>2]|0;if((e|0)!=(d|0))k[g>>2]=e+(~((e+-4-d|0)>>>2)<<2);rg(d)}d=k[q>>2]|0;e=d;if(d){f=k[h>>2]|0;if((f|0)!=(d|0))k[h>>2]=f+(~(((f+-1040-e|0)>>>0)/1040|0)*1040|0);rg(d)}d=k[s>>2]|0;e=d;if(d){f=k[t>>2]|0;if((f|0)!=(d|0))k[t>>2]=f+(~((f+-4-e|0)>>>2)<<2);rg(d)}d=k[u>>2]|0;if(!d){r=w;return}e=k[v>>2]|0;if((e|0)!=(d|0))k[v>>2]=e+(~(((e+-1040-d|0)>>>0)/1040|0)*1040|0);rg(d);r=w;return}function ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;h=a+4|0;i=k[a>>2]|0;j=i;d=(((k[h>>2]|0)-j|0)/1040|0)+1|0;if(d>>>0>4129776)mg(a);l=a+8|0;e=i;c=((k[l>>2]|0)-e|0)/1040|0;if(c>>>0<2064888){c=c<<1;c=c>>>0>>0?d:c;e=(k[h>>2]|0)-e|0;d=(e|0)/1040|0;if(!c){g=0;f=0;c=e}else m=6}else{e=(k[h>>2]|0)-e|0;c=4129776;d=(e|0)/1040|0;m=6}if((m|0)==6){g=c;f=og(c*1040|0)|0;c=e}ki(f+(d*1040|0)|0,b|0,1040)|0;m=f+((((c|0)/-1040|0)+d|0)*1040|0)|0;ki(m|0,i|0,c|0)|0;k[a>>2]=m;k[h>>2]=f+((d+1|0)*1040|0);k[l>>2]=f+(g*1040|0);if(!j)return;rg(j);return}function ve(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0.0,j=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0,v=0;v=r;r=r+272|0;q=v+16|0;t=v;s=ha(c,b)|0;k[t>>2]=0;u=t+4|0;k[u>>2]=0;k[t+8>>2]=0;if(s){if(s>>>0>1073741823)mg(t);j=og(s<<2)|0;k[u>>2]=j;k[t>>2]=j;h=j+(s<<2)|0;k[t+8>>2]=h;g=s;while(1){k[j>>2]=1;g=g+-1|0;if(!g)break;else j=j+4|0}k[u>>2]=h}g=e+4|0;h=k[g>>2]|0;j=k[e>>2]|0;m=(h-j|0)/1040|0;if(s>>>0<=m>>>0){if(s>>>0>>0?(n=j+(s*1040|0)|0,(h|0)!=(n|0)):0)k[g>>2]=h+(~(((h+-1040-n|0)>>>0)/1040|0)*1040|0)}else we(e,s-m|0);g=f+4|0;h=k[g>>2]|0;j=k[f>>2]|0;m=h-j>>2;if(s>>>0<=m>>>0){if(s>>>0>>0?(o=j+(s<<2)|0,(h|0)!=(o|0)):0)k[g>>2]=h+(~((h+-4-o|0)>>>2)<<2)}else Ud(f,s-m|0);if((s|0)>0){g=k[e>>2]|0;o=0;do{ki(g+(o*1040|0)|0,(k[a>>2]|0)+(o*1040|0)|0,1040)|0;n=k[a>>2]|0;j=k[n+(o*1040|0)+1024>>2]|0;a:do if(!j)i=12.0;else{g=0;h=0;do{g=((k[n+(o*1040|0)+(h<<2)>>2]|0)>0&1)+g|0;h=h+1|0}while((h|0)<256&(g|0)<5);m=g;switch(m|0){case 1:{i=12.0;break a}case 2:{i=+(j+20|0);break a}default:{}}gi(q|0,0,256)|0;Af(n+(o*1040|0)|0,256,15,q);g=0;h=0;do{g=(ha(l[q+h>>0]|0,k[n+(o*1040|0)+(h<<2)>>2]|0)|0)+g|0;h=h+1|0}while((h|0)!=256);switch(m|0){case 3:{g=g+28|0;break}case 4:{g=g+37|0;break}default:g=(Vd(q,256)|0)+g|0}i=+(g|0)}while(0);g=k[e>>2]|0;p[g+(o*1040|0)+1032>>3]=i;k[(k[f>>2]|0)+(o<<2)>>2]=o;o=o+1|0}while((o|0)<(s|0))}if((b|0)>1&(c|0)>0){g=0;do{q=ha(g,b)|0;xe(k[e>>2]|0,k[t>>2]|0,(k[f>>2]|0)+(q<<2)|0,b,d);g=g+1|0}while((g|0)<(c|0))}xe(k[e>>2]|0,k[t>>2]|0,k[f>>2]|0,s,d);ye(k[a>>2]|0,s,k[e>>2]|0,k[f>>2]|0);ze(e,f);h=k[t>>2]|0;if(!h){r=v;return}g=k[u>>2]|0;if((g|0)!=(h|0))k[u>>2]=g+(~((g+-4-h|0)>>>2)<<2);rg(h);r=v;return}function we(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=a+8|0;e=k[i>>2]|0;j=a+4|0;c=k[j>>2]|0;d=c;if(((e-d|0)/1040|0)>>>0>=b>>>0){do{gi(c|0,0,1028)|0;c=(k[j>>2]|0)+1040|0;k[j>>2]=c;b=b+-1|0}while((b|0)!=0);return}c=k[a>>2]|0;d=((d-c|0)/1040|0)+b|0;if(d>>>0>4129776)mg(a);f=c;c=(e-f|0)/1040|0;if(c>>>0<2064888){c=c<<1;c=c>>>0>>0?d:c;d=((k[j>>2]|0)-f|0)/1040|0;if(!c){e=0;g=0}else h=8}else{c=4129776;d=((k[j>>2]|0)-f|0)/1040|0;h=8}if((h|0)==8){e=c;g=og(c*1040|0)|0}c=g+(d*1040|0)|0;f=g+(e*1040|0)|0;e=c;do{gi(e|0,0,1028)|0;e=c+1040|0;c=e;b=b+-1|0}while((b|0)!=0);b=k[a>>2]|0;e=(k[j>>2]|0)-b|0;h=g+((((e|0)/-1040|0)+d|0)*1040|0)|0;ki(h|0,b|0,e|0)|0;k[a>>2]=h;k[j>>2]=c;k[i>>2]=f;if(!b)return;rg(b);return}function xe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=r;r=r+96|0;x=I+8|0;w=I+92|0;v=I+88|0;y=I+84|0;z=I+80|0;A=I+76|0;B=I;H=I+64|0;E=I+52|0;D=I+40|0;s=H+4|0;k[s>>2]=0;t=H+8|0;k[t>>2]=0;F=H+4|0;k[H>>2]=F;k[E>>2]=0;G=E+4|0;k[G>>2]=0;k[E+8>>2]=0;C=(d|0)>0;if(C){o=F;q=E+8|0;l=0;f=0;while(1){n=c+(f<<2)|0;if(l){j=k[n>>2]|0;g=F;h=l;a:do{while(1){if((k[h+16>>2]|0)>=(j|0)){g=h;break}h=k[h+4>>2]|0;if(!h)break a}h=k[g>>2]|0}while((h|0)!=0);if(!((g|0)!=(F|0)?(j|0)>=(k[g+16>>2]|0):0))m=11}else m=11;do if((m|0)==11){m=0;do if(l){j=k[n>>2]|0;while(1){g=k[l+16>>2]|0;if((j|0)<(g|0)){g=k[l>>2]|0;if(!g){g=l;h=l;m=15;break}}else{if((g|0)>=(j|0)){g=l;m=20;break}h=l+4|0;g=k[h>>2]|0;if(!g){g=h;h=l;m=19;break}}l=g}if((m|0)==15){m=0;k[x>>2]=h;j=g;break}else if((m|0)==19){m=0;k[x>>2]=h;j=g;break}else if((m|0)==20){m=0;k[x>>2]=g;j=x;h=g;break}}else{k[x>>2]=F;j=F;h=o}while(0);if(!(k[j>>2]|0)){g=og(20)|0;k[g+16>>2]=k[n>>2];k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=h;k[j>>2]=g;h=k[k[H>>2]>>2]|0;if(h){k[H>>2]=h;g=k[j>>2]|0}Hc(k[s>>2]|0,g);k[t>>2]=(k[t>>2]|0)+1}g=k[G>>2]|0;if((g|0)==(k[q>>2]|0)){Jd(E,n);break}else{k[g>>2]=k[n>>2];k[G>>2]=g+4;break}}while(0);f=f+1|0;if((f|0)>=(d|0))break;l=k[F>>2]|0}g=k[G>>2]|0;f=k[E>>2]|0}else{g=0;f=0}k[D>>2]=0;s=D+4|0;k[s>>2]=0;k[D+8>>2]=0;if((g|0)==(f|0))g=f;else{l=0;do{j=l;l=l+1|0;if(l>>>0>2>>>0){h=l;do{Be(a,b,k[f+(j<<2)>>2]|0,k[f+(h<<2)>>2]|0,D);h=h+1|0;g=k[G>>2]|0;f=k[E>>2]|0}while(h>>>0>2>>>0)}}while(l>>>0>2>>>0)}b:do if(g-f>>2>>>0>1){u=0.0;q=1;while(1){while(1){m=k[D>>2]|0;if(+p[m+24>>3]>=u)break;o=k[m>>2]|0;n=k[m+4>>2]|0;h=a+(o*1040|0)+1024|0;k[h>>2]=(k[h>>2]|0)+(k[a+(n*1040|0)+1024>>2]|0);h=0;do{t=a+(o*1040|0)+(h<<2)|0;k[t>>2]=(k[t>>2]|0)+(k[a+(n*1040|0)+(h<<2)>>2]|0);h=h+1|0}while((h|0)!=256);p[a+(o*1040|0)+1032>>3]=+p[m+16>>3];t=b+(o<<2)|0;k[t>>2]=(k[t>>2]|0)+(k[b+(n<<2)>>2]|0);if(C){j=0;do{h=c+(j<<2)|0;if((k[h>>2]|0)==(n|0))k[h>>2]=o;j=j+1|0}while((j|0)!=(d|0))}j=g-f>>2;if(j>>>0>1){l=1;h=0;while(1){h=f+(h<<2)|0;if((k[h>>2]|0)>=(n|0))k[h>>2]=k[f+(l<<2)>>2];h=l+1|0;if(h>>>0>>0){t=l;l=h;h=t}else break}}k[G>>2]=g+-4;f=k[s>>2]|0;g=(f|0)==(m|0);c:do if(!g){h=f-m>>5;l=0;do{j=k[m+(l<<5)>>2]|0;if(!((j|0)!=(o|0)?(t=k[m+(l<<5)+4>>2]|0,!((t|0)==(n|0)|((j|0)==(n|0)|(t|0)==(o|0)))):0))i[m+(l<<5)+8>>0]=0;l=l+1|0}while(l>>>0>>0);if(!g){g=m;do{if(i[g+8>>0]|0)break c;h=g;j=f-h|0;if((j|0)>32){f=f+-32|0;k[x>>2]=k[g>>2];k[x+4>>2]=k[g+4>>2];k[x+8>>2]=k[g+8>>2];k[x+12>>2]=k[g+12>>2];k[x+16>>2]=k[g+16>>2];k[x+20>>2]=k[g+20>>2];k[x+24>>2]=k[g+24>>2];k[x+28>>2]=k[g+28>>2];k[g>>2]=k[f>>2];k[g+4>>2]=k[f+4>>2];k[g+8>>2]=k[f+8>>2];k[g+12>>2]=k[f+12>>2];k[g+16>>2]=k[f+16>>2];k[g+20>>2]=k[f+20>>2];k[g+24>>2]=k[f+24>>2];k[g+28>>2]=k[f+28>>2];k[f>>2]=k[x>>2];k[f+4>>2]=k[x+4>>2];k[f+8>>2]=k[x+8>>2];k[f+12>>2]=k[x+12>>2];k[f+16>>2]=k[x+16>>2];k[f+20>>2]=k[x+20>>2];k[f+24>>2]=k[x+24>>2];k[f+28>>2]=k[x+28>>2];k[y>>2]=h;k[z>>2]=f;k[A>>2]=h;k[v>>2]=k[y>>2];k[w>>2]=k[z>>2];k[x>>2]=k[A>>2];be(v,w,B,(j>>5)+-1|0,x);f=k[s>>2]|0;g=k[D>>2]|0}f=f+-32|0;k[s>>2]=f}while((g|0)!=(f|0))}}while(0);h=k[G>>2]|0;f=k[E>>2]|0;if((h|0)==(f|0)){g=h;f=h}else{h=0;do{Be(a,b,o,k[f+(h<<2)>>2]|0,D);h=h+1|0;g=k[G>>2]|0;f=k[E>>2]|0}while(h>>>0>2>>>0)}if(g-f>>2>>>0<=q>>>0)break b}if(g-f>>2>>>0>e>>>0){u=1.e+99;q=e}else break}}while(0);g=k[D>>2]|0;h=g;if(g){f=k[s>>2]|0;if((f|0)!=(g|0))k[s>>2]=f+(~((f+-32-h|0)>>>5)<<5);rg(g);f=k[E>>2]|0}if(!f){G=k[F>>2]|0;$d(H,G);r=I;return}g=k[G>>2]|0;if((g|0)!=(f|0))k[G>>2]=g+(~((g+-4-f|0)>>>2)<<2);rg(f);G=k[F>>2]|0;$d(H,G);r=I;return}function ye(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0.0,i=0.0,j=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=r;r=r+1312|0;y=D+1056|0;z=D;C=D+1040|0;o=C+4|0;k[o>>2]=0;q=C+8|0;k[q>>2]=0;B=C+4|0;k[C>>2]=B;A=(b|0)>0;if(A){s=B;f=0;n=0;while(1){m=d+(n<<2)|0;do if(f){g=k[m>>2]|0;j=f;while(1){e=k[j+16>>2]|0;if((g|0)<(e|0)){e=k[j>>2]|0;if(!e){e=j;f=j;x=10;break}}else{if((e|0)>=(g|0)){e=j;x=15;break}f=j+4|0;e=k[f>>2]|0;if(!e){e=f;f=j;x=14;break}}j=e}if((x|0)==10){x=0;k[y>>2]=f;g=e;break}else if((x|0)==14){x=0;k[y>>2]=f;g=e;break}else if((x|0)==15){x=0;k[y>>2]=e;g=y;f=e;break}}else{k[y>>2]=B;g=B;f=s}while(0);if(!(k[g>>2]|0)){e=og(20)|0;k[e+16>>2]=k[m>>2];k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=f;k[g>>2]=e;f=k[k[C>>2]>>2]|0;if(f){k[C>>2]=f;e=k[g>>2]|0}Hc(k[o>>2]|0,e);k[q>>2]=(k[q>>2]|0)+1}e=n+1|0;if((e|0)>=(b|0))break;f=k[B>>2]|0;n=e}if(A){u=z+1024|0;v=z+1024|0;w=0;while(1){e=k[((w|0)==0?d:d+(w+-1<<2)|0)>>2]|0;s=a+(w*1040|0)|0;t=a+(w*1040|0)+1024|0;if(!(k[t>>2]|0))h=0.0;else{ki(z|0,s|0,1040)|0;k[v>>2]=(k[v>>2]|0)+(k[c+(e*1040|0)+1024>>2]|0);f=0;do{q=z+(f<<2)|0;k[q>>2]=(k[q>>2]|0)+(k[c+(e*1040|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=256);j=k[v>>2]|0;a:do if(!j)h=12.0;else{f=0;g=0;do{f=((k[z+(g<<2)>>2]|0)>0&1)+f|0;g=g+1|0}while((g|0)<256&(f|0)<5);m=f;switch(m|0){case 1:{h=12.0;break a}case 2:{h=+(j+20|0);break a}default:{}}gi(y|0,0,256)|0;Af(z,256,15,y);f=0;g=0;do{f=(ha(l[y+g>>0]|0,k[z+(g<<2)>>2]|0)|0)+f|0;g=g+1|0}while((g|0)!=256);switch(m|0){case 3:{f=f+28|0;break}case 4:{f=f+37|0;break}default:f=(Vd(y,256)|0)+f|0}h=+(f|0)}while(0);h=h-+p[c+(e*1040|0)+1032>>3]}f=k[C>>2]|0;if((f|0)!=(B|0)){g=f;while(1){q=g+16|0;o=k[q>>2]|0;if(!(k[t>>2]|0))i=0.0;else{ki(z|0,s|0,1040)|0;k[u>>2]=(k[u>>2]|0)+(k[c+(o*1040|0)+1024>>2]|0);f=0;do{n=z+(f<<2)|0;k[n>>2]=(k[n>>2]|0)+(k[c+(o*1040|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=256);m=k[u>>2]|0;b:do if(!m)i=12.0;else{f=0;j=0;do{f=((k[z+(j<<2)>>2]|0)>0&1)+f|0;j=j+1|0}while((j|0)<256&(f|0)<5);n=f;switch(n|0){case 1:{i=12.0;break b}case 2:{i=+(m+20|0);break b}default:{}}gi(y|0,0,256)|0;Af(z,256,15,y);f=0;j=0;do{f=(ha(l[y+j>>0]|0,k[z+(j<<2)>>2]|0)|0)+f|0;j=j+1|0}while((j|0)!=256);switch(n|0){case 3:{f=f+28|0;break}case 4:{f=f+37|0;break}default:f=(Vd(y,256)|0)+f|0}i=+(f|0)}while(0);i=i-+p[c+(o*1040|0)+1032>>3]}if(i>2]|0}f=k[g+4>>2]|0;if(!f)while(1){f=k[g+8>>2]|0;if((k[f>>2]|0)==(g|0))break;else g=f}else while(1){g=k[f>>2]|0;if(!g)break;else f=g}if((f|0)==(B|0))break;else g=f}}k[d+(w<<2)>>2]=e;w=w+1|0;if((w|0)>=(b|0)){g=B;e=C;break}}}else x=4}else x=4;if((x|0)==4){g=B;e=C}f=k[e>>2]|0;if((f|0)!=(g|0))while(1){gi(c+((k[f+16>>2]|0)*1040|0)|0,0,1028)|0;e=k[f+4>>2]|0;if(!e)while(1){e=k[f+8>>2]|0;if((k[e>>2]|0)==(f|0))break;else f=e}else while(1){f=k[e>>2]|0;if(!f)break;else e=f}if((e|0)==(B|0))break;else f=e}if(A)g=0;else{d=k[B>>2]|0;$d(C,d);r=D;return}do{e=k[d+(g<<2)>>2]|0;f=c+(e*1040|0)+1024|0;k[f>>2]=(k[f>>2]|0)+(k[a+(g*1040|0)+1024>>2]|0);f=0;do{A=c+(e*1040|0)+(f<<2)|0;k[A>>2]=(k[A>>2]|0)+(k[a+(g*1040|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=256);g=g+1|0}while((g|0)!=(b|0));d=k[B>>2]|0;$d(C,d);r=D;return}function ze(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0;x=r;r=r+32|0;u=x+24|0;w=x+12|0;v=x;Ae(w,a);q=v+4|0;k[q>>2]=0;s=v+8|0;k[s>>2]=0;c=v+4|0;k[v>>2]=c;t=b+4|0;d=k[t>>2]|0;e=k[b>>2]|0;a:do if((d|0)==(e|0)){f=a;e=d;j=0}else{n=c;i=0;m=0;j=0;while(1){l=e+(m<<2)|0;if(i){h=k[l>>2]|0;f=c;g=i;b:do{while(1){if((k[g+16>>2]|0)>=(h|0)){f=g;break}g=k[g+4>>2]|0;if(!g)break b}g=k[f>>2]|0}while((g|0)!=0);if(!((f|0)!=(c|0)?(h|0)>=(k[f+16>>2]|0):0))p=12}else p=12;if((p|0)==12){do if(i){h=k[l>>2]|0;d=i;while(1){f=k[d+16>>2]|0;if((h|0)<(f|0)){f=k[d>>2]|0;if(!f){e=d;p=16;break}else d=f}else{if((f|0)>=(h|0)){p=22;break}f=d+4|0;g=k[f>>2]|0;if(!g){e=f;p=20;break}else d=g}}if((p|0)==16){k[u>>2]=d;p=23;break}else if((p|0)==20){k[u>>2]=d;p=23;break}else if((p|0)==22){p=0;k[u>>2]=d;if(!d){e=u;p=23;break}else break}}else{k[u>>2]=c;e=c;d=n;p=23}while(0);if((p|0)==23){p=0;f=og(24)|0;k[f+16>>2]=k[l>>2];k[f+20>>2]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=d;k[e>>2]=f;d=k[k[v>>2]>>2]|0;if(!d)d=f;else{k[v>>2]=d;d=k[e>>2]|0}Hc(k[q>>2]|0,d);k[s>>2]=(k[s>>2]|0)+1;e=k[b>>2]|0;d=f}k[d+20>>2]=j;ki((k[a>>2]|0)+(j*1040|0)|0,(k[w>>2]|0)+((k[e+(m<<2)>>2]|0)*1040|0)|0,1040)|0;d=k[t>>2]|0;e=k[b>>2]|0;j=j+1|0}f=m+1|0;if(f>>>0>=d-e>>2>>>0){f=a;break a}i=k[c>>2]|0;m=f}}while(0);h=a+4|0;i=k[h>>2]|0;f=k[f>>2]|0;g=(i-f|0)/1040|0;if(j>>>0<=g>>>0){if(j>>>0>>0?(o=f+(j*1040|0)|0,(i|0)!=(o|0)):0)k[h>>2]=i+(~(((i+-1040-o|0)>>>0)/1040|0)*1040|0)}else{we(a,j-g|0);d=k[t>>2]|0;e=k[b>>2]|0}if((d|0)!=(e|0)){m=c;l=0;do{j=e+(l<<2)|0;f=k[c>>2]|0;do if(f){i=k[j>>2]|0;while(1){g=k[f+16>>2]|0;if((i|0)<(g|0)){g=k[f>>2]|0;if(!g){d=f;e=f;p=41;break}else f=g}else{if((g|0)>=(i|0)){p=47;break}g=f+4|0;h=k[g>>2]|0;if(!h){d=g;p=45;break}else f=h}}if((p|0)==41){k[u>>2]=e;g=d;d=e;p=48;break}else if((p|0)==45){k[u>>2]=f;g=d;d=f;p=48;break}else if((p|0)==47){p=0;k[u>>2]=f;if(!f){g=u;d=f;p=48;break}else break}}else{k[u>>2]=c;g=c;d=m;p=48}while(0);if((p|0)==48){f=og(24)|0;k[f+16>>2]=k[j>>2];k[f+20>>2]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=d;k[g>>2]=f;d=k[k[v>>2]>>2]|0;if(!d)d=f;else{k[v>>2]=d;d=k[g>>2]|0}Hc(k[q>>2]|0,d);k[s>>2]=(k[s>>2]|0)+1;e=k[b>>2]|0;d=k[t>>2]|0}k[e+(l<<2)>>2]=k[f+20>>2];l=l+1|0}while(l>>>0>2>>>0)}_d(v,k[c>>2]|0);e=k[w>>2]|0;if(!e){r=x;return}c=w+4|0;d=k[c>>2]|0;if((d|0)!=(e|0))k[c>>2]=d+(~(((d+-1040-e|0)>>>0)/1040|0)*1040|0);rg(e);r=x;return}function Ae(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;k[a>>2]=0;f=a+4|0;k[f>>2]=0;k[a+8>>2]=0;e=b+4|0;h=k[e>>2]|0;g=k[b>>2]|0;c=h-g|0;d=(c|0)/1040|0;if((h|0)==(g|0))return;if(d>>>0>4129776)mg(a);c=og(c)|0;k[f>>2]=c;k[a>>2]=c;k[a+8>>2]=c+(d*1040|0);d=k[b>>2]|0;b=k[e>>2]|0;if((d|0)==(b|0))return;do{ki(c|0,d|0,1040)|0;c=(k[f>>2]|0)+1040|0;k[f>>2]=c;d=d+1040|0}while((d|0)!=(b|0));return}function Be(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0,h=0.0,j=0.0,m=0.0,n=0.0,q=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=r;r=r+1344|0;y=C+1088|0;x=C+40|0;z=C+1084|0;A=C+1080|0;B=C;w=C+8|0;if((c|0)==(d|0)){r=C;return}g=(d|0)<(c|0);u=g?c:d;g=g?d:c;k[w>>2]=g;k[w+4>>2]=u;i[w+8>>0]=1;c=k[b+(g<<2)>>2]|0;d=k[b+(u<<2)>>2]|0;b=d+c|0;t=+(c|0);if((c|0)<256)q=+o[4036+(c<<2)>>2];else q=+oh(t);s=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(s);m=+(b|0);if((b|0)<256)h=+o[4036+(b<<2)>>2];else h=+oh(m);v=w+24|0;d=a+(g*1040|0)|0;f=+p[a+(g*1040|0)+1032>>3];n=+p[a+(u*1040|0)+1032>>3];j=(t*q+s*j-m*h)*.5-f-n;p[v>>3]=j;do if(!(k[a+(g*1040|0)+1024>>2]|0)){p[w+16>>3]=n;f=n}else{b=k[a+(u*1040|0)+1024>>2]|0;if(!b){p[w+16>>3]=f;break}c=k[e>>2]|0;if((c|0)==(k[e+4>>2]|0))h=1.e+99;else{h=+p[c+24>>3];h=h>0.0?h:0.0}ki(x|0,d|0,1040)|0;d=x+1024|0;k[d>>2]=(k[d>>2]|0)+b;c=0;do{g=x+(c<<2)|0;k[g>>2]=(k[g>>2]|0)+(k[a+(u*1040|0)+(c<<2)>>2]|0);c=c+1|0}while((c|0)!=256);b=k[d>>2]|0;a:do if(!b)f=12.0;else{c=0;d=0;do{c=((k[x+(d<<2)>>2]|0)>0&1)+c|0;d=d+1|0}while((d|0)<256&(c|0)<5);g=c;switch(g|0){case 1:{f=12.0;break a}case 2:{f=+(b+20|0);break a}default:{}}gi(y|0,0,256)|0;Af(x,256,15,y);c=0;d=0;do{c=(ha(l[y+d>>0]|0,k[x+(d<<2)>>2]|0)|0)+c|0;d=d+1|0}while((d|0)!=256);switch(g|0){case 3:{c=c+28|0;break}case 4:{c=c+37|0;break}default:c=(Vd(y,256)|0)+c|0}f=+(c|0)}while(0);if(f>3]=f;break}r=C;return}while(0);p[v>>3]=f+j;c=e+4|0;d=k[c>>2]|0;if((d|0)==(k[e+8>>2]|0)){ce(e,w);c=k[c>>2]|0}else{k[d>>2]=k[w>>2];k[d+4>>2]=k[w+4>>2];k[d+8>>2]=k[w+8>>2];k[d+12>>2]=k[w+12>>2];k[d+16>>2]=k[w+16>>2];k[d+20>>2]=k[w+20>>2];k[d+24>>2]=k[w+24>>2];k[d+28>>2]=k[w+28>>2];w=(k[c>>2]|0)+32|0;k[c>>2]=w;c=w}w=c;e=k[e>>2]|0;k[z>>2]=e;k[A>>2]=w;k[x>>2]=k[z>>2];k[y>>2]=k[A>>2];de(x,y,B,w-e>>5);r=C;return}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0;f=k[b>>2]|0;d=c+(f>>3)|0;e=l[d>>0]|0;if(!a){c=d;a=c;i[a>>0]=e;i[a+1>>0]=e>>8;i[a+2>>0]=e>>16;i[a+3>>0]=e>>24;c=c+4|0;i[c>>0]=0;i[c+1>>0]=0;i[c+2>>0]=0;i[c+3>>0]=0;c=f+1|0;k[b>>2]=c;return}h=hi(1,0,f&7|0)|0;g=L;h=h|e;e=d;i[e>>0]=h;i[e+1>>0]=h>>8;i[e+2>>0]=h>>16;i[e+3>>0]=h>>24;d=d+4|0;i[d>>0]=g;i[d+1>>0]=g>>8;i[d+2>>0]=g>>16;i[d+3>>0]=g>>24;d=f+1|0;k[b>>2]=d;g=(ja(a|0)|0)^31;if(g>>>0>=8)Ka(195222,195244,52,195268);h=c+(d>>3)|0;j=l[h>>0]|0;d=hi(g|0,0,d&7|0)|0;e=L;j=d|j;d=h;h=d;i[h>>0]=j;i[h+1>>0]=j>>8;i[h+2>>0]=j>>16;i[h+3>>0]=j>>24;d=d+4|0;i[d>>0]=e;i[d+1>>0]=e>>8;i[d+2>>0]=e>>16;i[d+3>>0]=e>>24;f=f+4|0;k[b>>2]=f;d=a-(1<>31;h=hi(1,0,g|0)|0;a=L;if(!(a>>>0>e>>>0|(a|0)==(e|0)&h>>>0>d>>>0))Ka(195222,195244,52,195268);j=c+(f>>3)|0;c=l[j>>0]|0;a=hi(d|0,e|0,f&7|0)|0;h=L;a=c|a;c=j;i[c>>0]=a;i[c+1>>0]=a>>8;i[c+2>>0]=a>>16;i[c+3>>0]=a>>24;j=j+4|0;i[j>>0]=h;i[j+1>>0]=h>>8;i[j+2>>0]=h>>16;i[j+3>>0]=h>>24;j=f+g|0;k[b>>2]=j;return}function De(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0,n=0;f=k[c>>2]|0;e=d+(f>>3)|0;j=l[e>>0]|0;h=hi(a&1|0,0,f&7|0)|0;g=L;j=h|j;h=e;i[h>>0]=j;i[h+1>>0]=j>>8;i[h+2>>0]=j>>16;i[h+3>>0]=j>>24;e=e+4|0;i[e>>0]=g;i[e+1>>0]=g>>8;i[e+2>>0]=g>>16;i[e+3>>0]=g>>24;e=f+1|0;k[c>>2]=e;g=(b|0)==0;if(a){h=d+(e>>3)|0;n=l[h>>0]|0;m=hi(g&1|0,0,e&7|0)|0;j=L;m=n|m;e=h;h=e;i[h>>0]=m;i[h+1>>0]=m>>8;i[h+2>>0]=m>>16;i[h+3>>0]=m>>24;e=e+4|0;i[e>>0]=j;i[e+1>>0]=j>>8;i[e+2>>0]=j>>16;i[e+3>>0]=j>>24;e=f+2|0;k[c>>2]=e;if(g){n=1;return n|0}}else if(g){n=0;return n|0}b=b+-1|0;if(b){f=((ja(b|0)|0)^31)+1|0;if(f>>>0>24){n=0;return n|0}}else f=1;g=(f|0)<16?4:(f+3|0)/4|0;f=g+-4|0;g=g<<2;if(f>>>0>=4)Ka(195222,195244,52,195268);m=d+(e>>3)|0;j=l[m>>0]|0;f=hi(f|0,((f|0)<0)<<31>>31|0,e&7|0)|0;n=L;j=f|j;f=m;m=f;i[m>>0]=j;i[m+1>>0]=j>>8;i[m+2>>0]=j>>16;i[m+3>>0]=j>>24;f=f+4|0;i[f>>0]=n;i[f+1>>0]=n>>8;i[f+2>>0]=n>>16;i[f+3>>0]=n>>24;e=e+2|0;k[c>>2]=e;f=((b|0)<0)<<31>>31;n=hi(1,0,g|0)|0;m=L;if(!(m>>>0>f>>>0|(m|0)==(f|0)&n>>>0>b>>>0))Ka(195222,195244,52,195268);n=d+(e>>3)|0;j=l[n>>0]|0;h=hi(b|0,f|0,e&7|0)|0;m=L;h=j|h;j=n;i[j>>0]=h;i[j+1>>0]=h>>8;i[j+2>>0]=h>>16;i[j+3>>0]=h>>24;n=n+4|0;i[n>>0]=m;i[n+1>>0]=m>>8;i[n+2>>0]=m>>16;i[n+3>>0]=m>>24;e=e+g|0;k[c>>2]=e;if(a){n=1;return n|0}n=d+(e>>3)|0;j=l[n>>0]|0;m=n;i[m>>0]=j;i[m+1>>0]=j>>8;i[m+2>>0]=j>>16;i[m+3>>0]=j>>24;n=n+4|0;i[n>>0]=0;i[n+1>>0]=0;i[n+2>>0]=0;i[n+3>>0]=0;k[c>>2]=e+1;n=1;return n|0}function Ee(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,m=0;d=k[b>>2]|0;f=c+(d>>3)|0;e=l[f>>0]|0;g=f;i[g>>0]=e;i[g+1>>0]=e>>8;i[g+2>>0]=e>>16;i[g+3>>0]=e>>24;f=f+4|0;i[f>>0]=0;i[f+1>>0]=0;i[f+2>>0]=0;i[f+3>>0]=0;f=d+1|0;k[b>>2]=f;g=a+-1|0;if(g){a=((ja(g|0)|0)^31)+1|0;if(a>>>0>24){b=0;return b|0}}else a=1;e=(a|0)<16?4:(a+3|0)/4|0;a=e+-4|0;e=e<<2;if(a>>>0>=4)Ka(195222,195244,52,195268);h=c+(f>>3)|0;j=l[h>>0]|0;a=hi(a|0,((a|0)<0)<<31>>31|0,f&7|0)|0;f=L;j=a|j;a=h;h=a;i[h>>0]=j;i[h+1>>0]=j>>8;i[h+2>>0]=j>>16;i[h+3>>0]=j>>24;a=a+4|0;i[a>>0]=f;i[a+1>>0]=f>>8;i[a+2>>0]=f>>16;i[a+3>>0]=f>>24;a=d+3|0;k[b>>2]=a;d=((g|0)<0)<<31>>31;f=hi(1,0,e|0)|0;h=L;if(!(h>>>0>d>>>0|(h|0)==(d|0)&f>>>0>g>>>0))Ka(195222,195244,52,195268);j=c+(a>>3)|0;m=l[j>>0]|0;f=hi(g|0,d|0,a&7|0)|0;h=L;f=m|f;g=j;i[g>>0]=f;i[g+1>>0]=f>>8;i[g+2>>0]=f>>16;i[g+3>>0]=f>>24;j=j+4|0;i[j>>0]=h;i[j+1>>0]=h>>8;i[j+2>>0]=h>>16;i[j+3>>0]=h>>24;j=a+e|0;h=c+(j>>3)|0;g=l[h>>0]|0;f=hi(1,0,j&7|0)|0;c=L;f=g|f;g=h;i[g>>0]=f;i[g+1>>0]=f>>8;i[g+2>>0]=f>>16;i[g+3>>0]=f>>24;h=h+4|0;i[h>>0]=c;i[h+1>>0]=c>>8;i[h+2>>0]=c>>16;i[h+3>>0]=c>>24;k[b>>2]=j+1;j=1;return j|0}function Fe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0,n=0;if((a|0)>1?(i[b+15>>0]|0)==0:0)if(!(i[b+14>>0]|0))if(!(i[b+13>>0]|0))if(!(i[b+12>>0]|0))if(!(i[b+11>>0]|0))if(!(i[b+10>>0]|0))if(!(i[b+9>>0]|0))if(!(i[b+8>>0]|0))if(!(i[b+7>>0]|0))if(!(i[b+16>>0]|0))if(!(i[b+6>>0]|0))if(!(i[b+17>>0]|0))if(!(i[b+5>>0]|0))if(!(i[b>>0]|0))if(!(i[b+4>>0]|0))if(!(i[b+3>>0]|0))if(!(i[b+2>>0]|0))h=(i[b+1>>0]|0)!=0&1;else h=2;else h=3;else h=4;else h=5;else h=6;else h=7;else h=8;else h=9;else h=10;else h=11;else h=12;else h=13;else h=14;else h=15;else h=16;else h=17;else h=18;if((i[b+1>>0]|0)==0?(i[b+2>>0]|0)==0:0)e=(i[b+3>>0]|0)==0?3:2;else e=0;a=k[c>>2]|0;g=d+(a>>3)|0;m=l[g>>0]|0;j=hi(e|0,0,a&7|0)|0;f=L;m=j|m;j=g;i[j>>0]=m;i[j+1>>0]=m>>8;i[j+2>>0]=m>>16;i[j+3>>0]=m>>24;g=g+4|0;i[g>>0]=f;i[g+1>>0]=f>>8;i[g+2>>0]=f>>16;i[g+3>>0]=f>>24;a=a+2|0;k[c>>2]=a;if(e>>>0>=h>>>0)return;while(1){g=l[b+(l[195278+e>>0]|0)>>0]|0;f=i[195296+g>>0]|0;g=l[195302+g>>0]|0;m=hi(1,0,f&255|0)|0;j=L;if(!(j>>>0>0|(j|0)==0&m>>>0>g>>>0)){a=9;break}m=d+(a>>3)|0;n=l[m>>0]|0;g=hi(g|0,0,a&7|0)|0;j=L;n=g|n;g=m;i[g>>0]=n;i[g+1>>0]=n>>8;i[g+2>>0]=n>>16;i[g+3>>0]=n>>24;m=m+4|0;i[m>>0]=j;i[m+1>>0]=j>>8;i[m+2>>0]=j>>16;i[m+3>>0]=j>>24;a=a+(f&255)|0;k[c>>2]=a;e=e+1|0;if((e|0)>=(h|0)){a=11;break}}if((a|0)==9)Ka(195222,195244,52,195268);else if((a|0)==11)return}function Ge(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,n=0,o=0,p=0,q=0,r=0,s=0;g=k[a+4>>2]|0;o=k[a>>2]|0;if((g|0)==(o|0))return;n=k[d>>2]|0;j=g-o|0;b=k[b>>2]|0;h=0;a:while(1){g=l[o+h>>0]|0;a=i[c+g>>0]|0;d=m[n+(g<<1)>>1]|0;p=hi(1,0,a&255|0)|0;q=L;if(!(q>>>0>0|(q|0)==0&p>>>0>d>>>0)){a=4;break}q=k[e>>2]|0;r=f+(q>>3)|0;s=l[r>>0]|0;d=hi(d|0,0,q&7|0)|0;p=L;s=d|s;d=r;r=d;i[r>>0]=s;i[r+1>>0]=s>>8;i[r+2>>0]=s>>16;i[r+3>>0]=s>>24;d=d+4|0;i[d>>0]=p;i[d+1>>0]=p>>8;i[d+2>>0]=p>>16;i[d+3>>0]=p>>24;d=q+(a&255)|0;k[e>>2]=d;switch(g|0){case 16:{a=i[b+h>>0]|0;if((a&255)>=4){a=7;break a}s=f+(d>>3)|0;q=l[s>>0]|0;p=hi(a&255|0,0,d&7|0)|0;r=L;p=q|p;q=s;i[q>>0]=p;i[q+1>>0]=p>>8;i[q+2>>0]=p>>16;i[q+3>>0]=p>>24;s=s+4|0;i[s>>0]=r;i[s+1>>0]=r>>8;i[s+2>>0]=r>>16;i[s+3>>0]=r>>24;k[e>>2]=d+2;break}case 17:{a=i[b+h>>0]|0;if((a&255)>=8){a=10;break a}s=f+(d>>3)|0;q=l[s>>0]|0;p=hi(a&255|0,0,d&7|0)|0;r=L;p=q|p;q=s;i[q>>0]=p;i[q+1>>0]=p>>8;i[q+2>>0]=p>>16;i[q+3>>0]=p>>24;s=s+4|0;i[s>>0]=r;i[s+1>>0]=r>>8;i[s+2>>0]=r>>16;i[s+3>>0]=r>>24;k[e>>2]=d+3;break}default:{}}h=h+1|0;if(h>>>0>=j>>>0){a=13;break}}if((a|0)==4)Ka(195222,195244,52,195268);else if((a|0)==7)Ka(195222,195244,52,195268);else if((a|0)==10)Ka(195222,195244,52,195268);else if((a|0)==13)return}function He(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,r=0;g=k[e>>2]|0;h=f+(g>>3)|0;n=l[h>>0]|0;o=hi(1,0,g&7|0)|0;j=L;n=o|n;o=h;i[o>>0]=n;i[o+1>>0]=n>>8;i[o+2>>0]=n>>16;i[o+3>>0]=n>>24;h=h+4|0;i[h>>0]=j;i[h+1>>0]=j>>8;i[h+2>>0]=j>>16;i[h+3>>0]=j>>24;h=g+2|0;k[e>>2]=h;j=c+-1|0;if(j>>>0>=4)Ka(195222,195244,52,195268);o=f+(h>>3)|0;m=l[o>>0]|0;j=hi(j|0,((j|0)<0)<<31>>31|0,h&7|0)|0;n=L;j=m|j;m=o;i[m>>0]=j;i[m+1>>0]=j>>8;i[m+2>>0]=j>>16;i[m+3>>0]=j>>24;o=o+4|0;i[o>>0]=n;i[o+1>>0]=n>>8;i[o+2>>0]=n>>16;i[o+3>>0]=n>>24;k[e>>2]=g+4;o=0;do{g=o;o=o+1|0;if((o|0)<(c|0)){m=b+(g<<2)|0;j=k[m>>2]|0;n=o;while(1){h=b+(n<<2)|0;g=k[h>>2]|0;if((l[a+g>>0]|0)<(l[a+j>>0]|0)){k[h>>2]=j;k[m>>2]=g}else g=j;n=n+1|0;if((n|0)==(c|0))break;else j=g}}}while((o|0)!=(c|0));if((c|0)==2){g=k[b>>2]|0;h=((g|0)<0)<<31>>31;m=hi(1,0,d|0)|0;n=L;if(!(n>>>0>h>>>0|(n|0)==(h|0)&m>>>0>g>>>0))Ka(195222,195244,52,195268);j=k[e>>2]|0;a=f+(j>>3)|0;c=l[a>>0]|0;g=hi(g|0,h|0,j&7|0)|0;h=L;c=g|c;g=a;a=g;i[a>>0]=c;i[a+1>>0]=c>>8;i[a+2>>0]=c>>16;i[a+3>>0]=c>>24;g=g+4|0;i[g>>0]=h;i[g+1>>0]=h>>8;i[g+2>>0]=h>>16;i[g+3>>0]=h>>24;j=j+d|0;k[e>>2]=j;g=k[b+4>>2]|0;h=((g|0)<0)<<31>>31;if(!(n>>>0>h>>>0|(n|0)==(h|0)&m>>>0>g>>>0))Ka(195222,195244,52,195268);f=f+(j>>3)|0;a=l[f>>0]|0;c=hi(g|0,h|0,j&7|0)|0;b=L;c=a|c;a=f;i[a>>0]=c;i[a+1>>0]=c>>8;i[a+2>>0]=c>>16;i[a+3>>0]=c>>24;f=f+4|0;i[f>>0]=b;i[f+1>>0]=b>>8;i[f+2>>0]=b>>16;i[f+3>>0]=b>>24;k[e>>2]=j+d;return}g=k[b>>2]|0;h=((g|0)<0)<<31>>31;m=hi(1,0,d|0)|0;n=L;if(!(n>>>0>h>>>0|(n|0)==(h|0)&m>>>0>g>>>0))Ka(195222,195244,52,195268);j=k[e>>2]|0;o=f+(j>>3)|0;p=l[o>>0]|0;g=hi(g|0,h|0,j&7|0)|0;h=L;p=g|p;g=o;o=g;i[o>>0]=p;i[o+1>>0]=p>>8;i[o+2>>0]=p>>16;i[o+3>>0]=p>>24;g=g+4|0;i[g>>0]=h;i[g+1>>0]=h>>8;i[g+2>>0]=h>>16;i[g+3>>0]=h>>24;g=j+d|0;k[e>>2]=g;h=k[b+4>>2]|0;j=((h|0)<0)<<31>>31;if(!(n>>>0>j>>>0|(n|0)==(j|0)&m>>>0>h>>>0))Ka(195222,195244,52,195268);p=f+(g>>3)|0;q=l[p>>0]|0;o=hi(h|0,j|0,g&7|0)|0;j=L;o=q|o;h=p;p=h;i[p>>0]=o;i[p+1>>0]=o>>8;i[p+2>>0]=o>>16;i[p+3>>0]=o>>24;h=h+4|0;i[h>>0]=j;i[h+1>>0]=j>>8;i[h+2>>0]=j>>16;i[h+3>>0]=j>>24;g=g+d|0;k[e>>2]=g;h=k[b+8>>2]|0;j=((h|0)<0)<<31>>31;if(!(n>>>0>j>>>0|(n|0)==(j|0)&m>>>0>h>>>0))Ka(195222,195244,52,195268);p=f+(g>>3)|0;r=l[p>>0]|0;o=hi(h|0,j|0,g&7|0)|0;q=L;o=r|o;j=p;p=j;i[p>>0]=o;i[p+1>>0]=o>>8;i[p+2>>0]=o>>16;i[p+3>>0]=o>>24;j=j+4|0;i[j>>0]=q;i[j+1>>0]=q>>8;i[j+2>>0]=q>>16;i[j+3>>0]=q>>24;j=g+d|0;k[e>>2]=j;if((c|0)==3)return;g=k[b+12>>2]|0;h=((g|0)<0)<<31>>31;if(!(n>>>0>h>>>0|(n|0)==(h|0)&m>>>0>g>>>0))Ka(195222,195244,52,195268);r=f+(j>>3)|0;p=l[r>>0]|0;c=hi(g|0,h|0,j&7|0)|0;q=L;c=p|c;p=r;i[p>>0]=c;i[p+1>>0]=c>>8;i[p+2>>0]=c>>16;i[p+3>>0]=c>>24;r=r+4|0;i[r>>0]=q;i[r+1>>0]=q>>8;i[r+2>>0]=q>>16;i[r+3>>0]=q>>24;r=j+d|0;k[e>>2]=r;q=f+(r>>3)|0;d=l[q>>0]|0;f=hi((i[a+(k[b>>2]|0)>>0]|0)==1|0,0,r&7|0)|0;p=L;d=f|d;f=q;i[f>>0]=d;i[f+1>>0]=d>>8;i[f+2>>0]=d>>16;i[f+3>>0]=d>>24;q=q+4|0;i[q>>0]=p;i[q+1>>0]=p>>8;i[q+2>>0]=p>>16;i[q+3>>0]=p>>24;k[e>>2]=r+1;return}function Ie(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0;v=r;r=r+144|0;t=v+24|0;p=v+12|0;q=v+40|0;n=v+112|0;o=v;k[t>>2]=0;u=t+4|0;k[u>>2]=0;k[t+8>>2]=0;k[p>>2]=0;s=p+4|0;k[s>>2]=0;k[p+8>>2]=0;h=og(256)|0;m=h;k[t>>2]=m;k[u>>2]=m;k[t+8>>2]=h+256;h=og(256)|0;m=h;k[p>>2]=m;k[s>>2]=m;k[p+8>>2]=h+256;Ef(a,b,t,p);h=q;m=h+72|0;do{k[h>>2]=0;h=h+4|0}while((h|0)<(m|0));a=k[u>>2]|0;e=k[t>>2]|0;if((a|0)==(e|0)){a=0;e=0;b=0}else{a=a-e|0;b=0;do{m=q+((l[e+b>>0]|0)<<2)|0;k[m>>2]=(k[m>>2]|0)+1;b=b+1|0}while(b>>>0>>0);a=0;e=0;b=0}do{if(k[q+(e<<2)>>2]|0)if(b){if((b|0)==1){b=2;break}}else{a=e;b=1}e=e+1|0}while((e|0)<18);h=n;m=h+18|0;do{i[h>>0]=0;h=h+1|0}while((h|0)<(m|0));k[o>>2]=0;e=o+4|0;k[e>>2]=0;k[o+8>>2]=0;f=og(36)|0;k[o>>2]=f;g=f+36|0;k[o+8>>2]=g;h=f;m=h+36|0;do{j[h>>1]=0;h=h+2|0}while((h|0)<(m|0));k[e>>2]=g;Af(q,18,5,n);Ff(n,18,f);Fe(b,n,c,d);if((b|0)==1)i[n+a>>0]=0;Ge(t,p,n,o,c,d);k[e>>2]=f;rg(f);a=k[p>>2]|0;if(a){if((k[s>>2]|0)!=(a|0))k[s>>2]=a;rg(a)}a=k[t>>2]|0;if(!a){r=v;return}if((k[u>>2]|0)!=(a|0))k[u>>2]=a;rg(a);r=v;return}function Je(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,m=0,n=0,o=0,p=0;p=r;r=r+16|0;o=p;k[o>>2]=0;k[o+4>>2]=0;k[o+8>>2]=0;k[o+12>>2]=0;if(b){g=0;h=0;while(1){if(k[a+(h<<2)>>2]|0){if((g|0)>=4){if((g|0)>4){h=g;break}}else k[o+(g<<2)>>2]=h;g=g+1|0}h=h+1|0;if(h>>>0>=b>>>0){h=g;break}}g=b+-1|0;if(!g){g=h;m=0}else{j=h;n=9}}else{g=-1;j=0;n=9}if((n|0)==9){h=0;do{g=g>>1;h=h+1|0}while((g|0)!=0);g=j;m=h}if((g|0)<2){j=k[e>>2]|0;g=f+(j>>3)|0;a=l[g>>0]|0;b=hi(1,0,j&7|0)|0;h=L;a=b|a;b=g;i[b>>0]=a;i[b+1>>0]=a>>8;i[b+2>>0]=a>>16;i[b+3>>0]=a>>24;g=g+4|0;i[g>>0]=h;i[g+1>>0]=h>>8;i[g+2>>0]=h>>16;i[g+3>>0]=h>>24;j=j+4|0;k[e>>2]=j;g=k[o>>2]|0;h=((g|0)<0)<<31>>31;o=hi(1,0,m|0)|0;b=L;if(!(b>>>0>h>>>0|(b|0)==(h|0)&o>>>0>g>>>0))Ka(195222,195244,52,195268);f=f+(j>>3)|0;b=l[f>>0]|0;a=hi(g|0,h|0,j&7|0)|0;o=L;a=b|a;b=f;i[b>>0]=a;i[b+1>>0]=a>>8;i[b+2>>0]=a>>16;i[b+3>>0]=a>>24;f=f+4|0;i[f>>0]=o;i[f+1>>0]=o>>8;i[f+2>>0]=o>>16;i[f+3>>0]=o>>24;k[e>>2]=j+m;r=p;return}Af(a,b,15,c);Ff(c,b,d);if((g|0)<5){He(c,o,g,m,e,f);r=p;return}else{Ie(c,b,e,f);r=p;return}}function Ke(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+32|0;h=s+12|0;q=s;d=k[b>>2]|0;g=b+4|0;f=k[g>>2]|0;if((d|0)==(f|0)){Te(a,b);r=s;return}c=d+4|0;if((c|0)==(f|0))c=d;else{e=c;c=d;do{l=(k[d>>2]|0)<(k[e>>2]|0);c=l?e:c;d=l?e:d;e=e+4|0}while((e|0)!=(f|0))}c=(k[c>>2]|0)+1|0;k[h>>2]=0;l=h+4|0;k[l>>2]=0;k[h+8>>2]=0;if(c){if(c>>>0>1073741823)mg(h);j=c<<2;e=og(j)|0;k[h>>2]=e;c=e+(c<<2)|0;k[h+8>>2]=c;gi(e|0,0,j|0)|0;k[l>>2]=c;if((c|0)!=(e|0)){c=c-e>>2;d=0;do{k[e+(d<<2)>>2]=d;d=d+1|0}while(d>>>0>>0)}}c=k[g>>2]|0;d=k[b>>2]|0;e=c-d|0;f=e>>2;k[q>>2]=0;j=q+4|0;k[j>>2]=0;k[q+8>>2]=0;do if(f)if(f>>>0>1073741823)mg(q);else{o=og(e)|0;k[q>>2]=o;p=o+(f<<2)|0;k[q+8>>2]=p;gi(o|0,0,e|0)|0;k[j>>2]=p;i=k[g>>2]|0;m=k[b>>2]|0;n=o;break}else{i=c;m=d;n=0;o=0;p=0}while(0);a:do if((i|0)==(m|0))d=k[h>>2]|0;else{f=k[l>>2]|0;d=k[h>>2]|0;i=i-m>>2;h=f-d>>2;if((f|0)==(d|0)){c=f+-4|0;e=0;while(1){k[n+(e<<2)>>2]=-1;k[f>>2]=k[c>>2];e=e+1|0;if(e>>>0>=i>>>0)break a}}g=d+-4|0;b=0;do{c=k[m+(b<<2)>>2]|0;e=0;while(1){if((k[d+(e<<2)>>2]|0)==(c|0)){f=25;break}e=e+1|0;if(e>>>0>=h>>>0){f=24;break}}if((f|0)==24){k[n+(b<<2)>>2]=-1;c=k[g>>2]|0}else if((f|0)==25){k[n+(b<<2)>>2]=e;c=k[d+(e<<2)>>2]|0;if((e|0)>0)do{f=e;e=e+-1|0;k[d+(f<<2)>>2]=k[d+(e<<2)>>2]}while((f|0)>1)}k[d>>2]=c;b=b+1|0}while(b>>>0>>0)}while(0);k[a>>2]=o;k[a+4>>2]=p;k[a+8>>2]=p;k[q+8>>2]=0;k[j>>2]=0;k[q>>2]=0;if(!d){r=s;return}c=k[l>>2]|0;if((c|0)!=(d|0))k[l>>2]=c+(~((c+-4-d|0)>>>2)<<2);rg(d);r=s;return}function Le(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0;w=r;r=r+32|0;p=w+16|0;q=w+12|0;v=w+8|0;s=w+4|0;t=w;u=a+4|0;l=k[u>>2]|0;h=k[a>>2]|0;j=(l|0)==(h|0);if(j){c=k[b>>2]|0;k[b>>2]=(c|0)<0?c:0;r=w;return}i=l-h>>2;f=0;e=0;do{a:do if(f>>>0>>0)do{if(!(k[h+(f<<2)>>2]|0))break a;f=f+1|0}while(f>>>0>>0);while(0);b:do if(f>>>0>>0){g=0;do{if(k[h+(f<<2)>>2]|0)break b;g=g+1|0;f=f+1|0}while(f>>>0>>0)}else g=0;while(0);e=(g|0)<(e|0)?e:g}while(f>>>0>>0);if((e|0)>0)e=(ja(e|0)|0)^31;else e=0;o=k[b>>2]|0;k[b>>2]=(o|0)<(e|0)?o:e;if(j){r=w;return}j=c+4|0;m=c+8|0;n=d+4|0;o=d+8|0;f=l;i=0;while(1){e=k[h+(i<<2)>>2]|0;c:do if(!e){e=i+1|0;g=f-h>>2;if(e>>>0>>0){f=1;do{if(k[h+(e<<2)>>2]|0)break;f=f+1|0;e=e+1|0}while(e>>>0>>0);e=f+i|0;if(!f)break}else{e=i+1|0;f=1}h=k[b>>2]|0;while(1){if((f|0)<(2<>2]|0;if((g|0)==(k[m>>2]|0))Jd(c,b);else{k[g>>2]=h;k[j>>2]=g+4}g=(1<>2])+-1|0;k[t>>2]=g;h=k[n>>2]|0;if(h>>>0<(k[o>>2]|0)>>>0){k[h>>2]=g;k[n>>2]=h+4}else Nd(d,t);h=k[b>>2]|0;f=f+1+(-2<>2]=g;h=k[j>>2]|0;if((h|0)==(k[m>>2]|0))Jd(c,v);else{k[h>>2]=g;k[j>>2]=h+4}f=f-(1<>2]=f;g=k[n>>2]|0;if(g>>>0<(k[o>>2]|0)>>>0){k[g>>2]=f;k[n>>2]=g+4;break}else{Nd(d,s);break}}else{e=(k[b>>2]|0)+e|0;k[p>>2]=e;f=k[j>>2]|0;if(f>>>0<(k[m>>2]|0)>>>0){k[f>>2]=e;k[j>>2]=f+4}else Nd(c,p);k[q>>2]=0;e=k[n>>2]|0;if(e>>>0<(k[o>>2]|0)>>>0){k[e>>2]=0;k[n>>2]=e+4}else Nd(d,q);e=i+1|0}while(0);f=k[u>>2]|0;h=k[a>>2]|0;if(e>>>0>=f-h>>2>>>0)break;else i=e}r=w;return}function Me(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0;u=r;r=r+1136|0;t=u+1120|0;n=u+1108|0;s=u+1104|0;o=u;h=t+4|0;i=t+8|0;j=n+4|0;l=n+8|0;m=o+1088|0;b=0;p=1;q=0;f=2147483647;while(1){k[t>>2]=0;k[h>>2]=0;k[i>>2]=0;k[n>>2]=0;k[j>>2]=0;k[l>>2]=0;k[s>>2]=q;Le(a,s,t,n);if((k[s>>2]|0)<(q|0))g=0;else{gi(o|0,0,1092)|0;c=k[h>>2]|0;e=k[t>>2]|0;if((c|0)!=(e|0)){c=c-e>>2;d=0;do{g=o+(k[e+(d<<2)>>2]<<2)|0;k[g>>2]=(k[g>>2]|0)+1;k[m>>2]=(k[m>>2]|0)+1;d=d+1|0}while(d>>>0>>0)}c=~~+Ue(o);c=(q|0)>0?c+4|0:c;if((q|0)>=1){d=1;do{c=(ha(k[o+(d<<2)>>2]|0,d)|0)+c|0;d=d+1|0}while((d|0)!=(p|0))}e=(c|0)<(f|0);g=1;b=e?q:b;f=e?c:f}c=k[n>>2]|0;d=c;if(c){e=k[j>>2]|0;if((e|0)!=(c|0))k[j>>2]=e+(~((e+-4-d|0)>>>2)<<2);rg(c)}c=k[t>>2]|0;d=c;if(c){e=k[h>>2]|0;if((e|0)!=(c|0))k[h>>2]=e+(~((e+-4-d|0)>>>2)<<2);rg(c)}q=q+1|0;if(!g){c=19;break}if((q|0)>=17){c=19;break}else p=p+1|0}if((c|0)==19){r=u;return b|0}return 0}function Ne(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;y=r;r=r+1984|0;x=y+1968|0;v=y+1120|0;o=y+1108|0;h=y+1104|0;j=y;q=y+1132|0;Ce(b+-1|0,c,d);if((b|0)==1){r=y;return}Ke(x,a);k[v>>2]=0;w=v+4|0;k[w>>2]=0;k[v+8>>2]=0;k[o>>2]=0;t=o+4|0;k[t>>2]=0;k[o+8>>2]=0;a=Me(x)|0;k[h>>2]=a;Le(x,h,v,o);gi(j|0,0,1092)|0;a=k[w>>2]|0;g=k[v>>2]|0;if((a|0)!=(g|0)){f=j+1088|0;a=a-g>>2;e=0;do{p=j+(k[g+(e<<2)>>2]<<2)|0;k[p>>2]=(k[p>>2]|0)+1;k[f>>2]=(k[f>>2]|0)+1;e=e+1|0}while(e>>>0>>0)}p=k[h>>2]|0;n=(p|0)>0;a=k[c>>2]|0;e=d+(a>>3)|0;f=l[e>>0]|0;g=hi(n&1|0,0,a&7|0)|0;h=L;f=g|f;g=e;i[g>>0]=f;i[g+1>>0]=f>>8;i[g+2>>0]=f>>16;i[g+3>>0]=f>>24;e=e+4|0;i[e>>0]=h;i[e+1>>0]=h>>8;i[e+2>>0]=h>>16;i[e+3>>0]=h>>24;e=a+1|0;k[c>>2]=e;do if(n){f=p+-1|0;if(f>>>0<16){n=d+(e>>3)|0;g=l[n>>0]|0;f=hi(f|0,((f|0)<0)<<31>>31|0,e&7|0)|0;h=L;f=g|f;g=n;i[g>>0]=f;i[g+1>>0]=f>>8;i[g+2>>0]=f>>16;i[g+3>>0]=f>>24;n=n+4|0;i[n>>0]=h;i[n+1>>0]=h>>8;i[n+2>>0]=h>>16;i[n+3>>0]=h>>24;k[c>>2]=a+5;break}else Ka(195222,195244,52,195268)}while(0);gi(q|0,0,816)|0;Je(j,p+b|0,q,q+272|0,c,d);e=k[w>>2]|0;a=k[v>>2]|0;a:do if((e|0)!=(a|0)){n=e-a>>2;b=k[o>>2]|0;j=0;while(1){g=a+(j<<2)|0;f=k[g>>2]|0;e=i[q+f>>0]|0;f=m[q+272+(f<<1)>>1]|0;o=hi(1,0,e&255|0)|0;h=L;if(!(h>>>0>0|(h|0)==0&o>>>0>f>>>0)){e=13;break}h=k[c>>2]|0;o=d+(h>>3)|0;A=l[o>>0]|0;z=hi(f|0,0,h&7|0)|0;f=L;A=z|A;z=o;i[z>>0]=A;i[z+1>>0]=A>>8;i[z+2>>0]=A>>16;i[z+3>>0]=A>>24;o=o+4|0;i[o>>0]=f;i[o+1>>0]=f>>8;i[o+2>>0]=f>>16;i[o+3>>0]=f>>24;e=h+(e&255)|0;k[c>>2]=e;h=k[g>>2]|0;if(!((h|0)<1|(h|0)>(p|0))){f=k[b+(j<<2)>>2]|0;g=((f|0)<0)<<31>>31;A=hi(1,0,h|0)|0;z=L;if(!(z>>>0>g>>>0|(z|0)==(g|0)&A>>>0>f>>>0)){e=16;break}A=d+(e>>3)|0;o=l[A>>0]|0;g=hi(f|0,g|0,e&7|0)|0;z=L;g=o|g;o=A;i[o>>0]=g;i[o+1>>0]=g>>8;i[o+2>>0]=g>>16;i[o+3>>0]=g>>24;A=A+4|0;i[A>>0]=z;i[A+1>>0]=z>>8;i[A+2>>0]=z>>16;i[A+3>>0]=z>>24;e=h+e|0;k[c>>2]=e}j=j+1|0;if(j>>>0>=n>>>0){s=e;u=b;break a}}if((e|0)==13)Ka(195222,195244,52,195268);else if((e|0)==16)Ka(195222,195244,52,195268)}else{s=k[c>>2]|0;u=k[o>>2]|0}while(0);e=d+(s>>3)|0;d=l[e>>0]|0;z=hi(1,0,s&7|0)|0;A=L;d=z|d;z=e;i[z>>0]=d;i[z+1>>0]=d>>8;i[z+2>>0]=d>>16;i[z+3>>0]=d>>24;e=e+4|0;i[e>>0]=A;i[e+1>>0]=A>>8;i[e+2>>0]=A>>16;i[e+3>>0]=A>>24;k[c>>2]=s+1;e=u;if(u){a=k[t>>2]|0;if((a|0)!=(u|0))k[t>>2]=a+(~((a+-4-e|0)>>>2)<<2);rg(u);a=k[v>>2]|0}e=a;if(a){f=k[w>>2]|0;if((f|0)!=(a|0))k[w>>2]=f+(~((f+-4-e|0)>>>2)<<2);rg(a)}f=k[x>>2]|0;if(!f){r=y;return}a=x+4|0;e=k[a>>2]|0;if((e|0)!=(f|0))k[a>>2]=e+(~((e+-4-f|0)>>>2)<<2);rg(f);r=y;return}function Oe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,n=0;do if((b|0)>0){e=k[(k[a>>2]|0)+(b<<2)>>2]|0;f=i[(k[a+48>>2]|0)+e>>0]|0;e=m[(k[a+60>>2]|0)+(e<<1)>>1]|0;h=hi(1,0,f&255|0)|0;g=L;if(g>>>0>0|(g|0)==0&h>>>0>e>>>0){h=k[c>>2]|0;g=d+(h>>3)|0;n=l[g>>0]|0;j=hi(e|0,0,h&7|0)|0;e=L;n=j|n;j=g;i[j>>0]=n;i[j+1>>0]=n>>8;i[j+2>>0]=n>>16;i[j+3>>0]=n>>24;g=g+4|0;i[g>>0]=e;i[g+1>>0]=e>>8;i[g+2>>0]=e>>16;i[g+3>>0]=e>>24;k[c>>2]=h+(f&255);break}else Ka(195222,195244,52,195268)}while(0);f=k[(k[a+12>>2]|0)+(b<<2)>>2]|0;e=i[(k[a+72>>2]|0)+f>>0]|0;f=m[(k[a+84>>2]|0)+(f<<1)>>1]|0;n=hi(1,0,e&255|0)|0;j=L;if(!(j>>>0>0|(j|0)==0&n>>>0>f>>>0))Ka(195222,195244,52,195268);g=k[c>>2]|0;h=d+(g>>3)|0;j=l[h>>0]|0;n=hi(f|0,0,g&7|0)|0;f=L;j=n|j;n=h;i[n>>0]=j;i[n+1>>0]=j>>8;i[n+2>>0]=j>>16;i[n+3>>0]=j>>24;h=h+4|0;i[h>>0]=f;i[h+1>>0]=f>>8;i[h+2>>0]=f>>16;i[h+3>>0]=f>>24;g=g+(e&255)|0;k[c>>2]=g;h=k[(k[a+24>>2]|0)+(b<<2)>>2]|0;e=k[(k[a+36>>2]|0)+(b<<2)>>2]|0;f=((e|0)<0)<<31>>31;n=hi(1,0,h|0)|0;j=L;if(j>>>0>f>>>0|(j|0)==(f|0)&n>>>0>e>>>0){n=d+(g>>3)|0;d=l[n>>0]|0;a=hi(e|0,f|0,g&7|0)|0;j=L;a=d|a;d=n;i[d>>0]=a;i[d+1>>0]=a>>8;i[d+2>>0]=a>>16;i[d+3>>0]=a>>24;n=n+4|0;i[n>>0]=j;i[n+1>>0]=j>>8;i[n+2>>0]=j>>16;i[n+3>>0]=j>>24;k[c>>2]=h+g;return}else Ka(195222,195244,52,195268)}function Pe(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;G=r;r=r+16|0;E=G;v=(k[a+4>>2]|0)-(k[a>>2]|0)|0;C=v>>2;D=c+2|0;k[E>>2]=0;F=E+4|0;k[F>>2]=0;k[E+8>>2]=0;do if(D)if(D>>>0>1073741823)mg(E);else{A=D<<2;z=og(A)|0;k[E>>2]=z;B=z+(D<<2)|0;k[E+8>>2]=B;gi(z|0,0,A|0)|0;k[F>>2]=B;break}while(0);B=og(104)|0;g=B;h=g+104|0;do{k[g>>2]=0;g=g+4|0}while((g|0)<(h|0));g=d+4|0;h=k[g>>2]|0;i=k[d>>2]|0;j=h-i>>2;if(C>>>0<=j>>>0){if(C>>>0>>0?(l=i+(C<<2)|0,(h|0)!=(l|0)):0)k[g>>2]=h+(~((h+-4-l|0)>>>2)<<2)}else Ud(d,C-j|0);t=d+12|0;g=d+16|0;h=k[g>>2]|0;i=k[t>>2]|0;j=h-i>>2;if(C>>>0<=j>>>0){if(C>>>0>>0?(m=i+(C<<2)|0,(h|0)!=(m|0)):0)k[g>>2]=h+(~((h+-4-m|0)>>>2)<<2)}else Ud(t,C-j|0);m=d+24|0;g=d+28|0;h=k[g>>2]|0;i=k[m>>2]|0;j=h-i>>2;if(C>>>0<=j>>>0){if(C>>>0>>0?(n=i+(C<<2)|0,(h|0)!=(n|0)):0)k[g>>2]=h+(~((h+-4-n|0)>>>2)<<2)}else Ud(m,C-j|0);l=d+36|0;g=d+40|0;h=k[g>>2]|0;i=k[l>>2]|0;j=h-i>>2;if(C>>>0<=j>>>0){if(C>>>0>>0?(o=i+(C<<2)|0,(h|0)!=(o|0)):0)k[g>>2]=h+(~((h+-4-o|0)>>>2)<<2)}else Ud(l,C-j|0);A=d+48|0;g=d+52|0;h=k[g>>2]|0;i=k[A>>2]|0;j=h-i|0;if(D>>>0<=j>>>0){if(D>>>0>>0?(p=i+D|0,(h|0)!=(p|0)):0)k[g>>2]=p}else uc(A,D-j|0);z=d+60|0;h=d+64|0;i=k[h>>2]|0;j=k[z>>2]|0;g=i-j>>1;if(D>>>0<=g>>>0){if(D>>>0>>0?(q=j+(D<<1)|0,(i|0)!=(q|0)):0)k[h>>2]=i+(~((i+-2-q|0)>>>1)<<1)}else Ve(z,D-g|0);y=d+72|0;g=d+76|0;h=k[g>>2]|0;i=k[y>>2]|0;j=h-i|0;if(j>>>0>=26){if(j>>>0>26?(s=i+26|0,(h|0)!=(s|0)):0)k[g>>2]=s}else uc(y,26-j|0);x=d+84|0;g=d+88|0;h=k[g>>2]|0;i=k[x>>2]|0;j=h-i>>1;if(j>>>0>=26){if(j>>>0>26?(u=i+52|0,(h|0)!=(u|0)):0)k[g>>2]=h+(~((h+-2-u|0)>>>1)<<1)}else Ve(x,26-j|0);if((v|0)>0){v=k[a>>2]|0;a=k[d>>2]|0;w=k[E>>2]|0;u=k[b>>2]|0;t=k[t>>2]|0;s=k[m>>2]|0;n=k[l>>2]|0;p=0;q=1;g=0;while(1){o=k[v+(p<<2)>>2]|0;if((o|0)==(q+1|0))g=1;else g=(o|0)==(g|0)?0:o+2|0;k[a+(p<<2)>>2]=g;if((p|0)>0){b=w+(g<<2)|0;k[b>>2]=(k[b>>2]|0)+1}i=k[u+(p<<2)>>2]|0;j=t+(p<<2)|0;l=s+(p<<2)|0;m=n+(p<<2)|0;k[j>>2]=0;h=0;while(1){g=h+1|0;if((k[1876+(g<<3)>>2]|0)>(i|0)){g=h;break}k[j>>2]=g;if((g|0)<25)h=g;else break}k[l>>2]=k[1876+(g<<3)+4>>2];k[m>>2]=i-(k[1876+(k[j>>2]<<3)>>2]|0);b=B+(k[j>>2]<<2)|0;k[b>>2]=(k[b>>2]|0)+1;p=p+1|0;if((p|0)>=(C|0))break;else{g=q;q=o}}}Ce(c+-1|0,e,f);if((c|0)>1){Je(k[E>>2]|0,D,k[A>>2]|0,k[z>>2]|0,e,f);Je(B,26,k[y>>2]|0,k[x>>2]|0,e,f);Oe(d,0,e,f)}rg(B);g=k[E>>2]|0;if(!g){r=G;return}h=k[F>>2]|0;if((h|0)!=(g|0))k[F>>2]=h+(~((h+-4-g|0)>>>2)<<2);rg(g);r=G;return}function Qe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;x=r;r=r+48|0;v=x+24|0;u=x+12|0;t=x;Ce(a+-1|0,c,d);if((a|0)<=1){r=x;return}p=b+-1|0;n=(1<>2]=0;w=v+4|0;k[w>>2]=0;k[v+8>>2]=0;do if(j){if(j>>>0>1073741823)mg(v);h=j<<2;g=og(h)|0;k[v>>2]=g;f=g+(j<<2)|0;k[v+8>>2]=f;gi(g|0,0,h|0)|0;k[w>>2]=f;k[u>>2]=0;f=u+4|0;k[f>>2]=0;k[u+8>>2]=0;h=(j|0)<0;if(h)mg(u);g=og(j)|0;k[f>>2]=g;k[u>>2]=g;k[u+8>>2]=g+j;e=j;do{i[g>>0]=0;g=(k[f>>2]|0)+1|0;k[f>>2]=g;e=e+-1|0}while((e|0)!=0);k[t>>2]=0;e=t+4|0;k[e>>2]=0;k[t+8>>2]=0;if(h)mg(t);else{q=j<<1;h=og(q)|0;k[t>>2]=h;o=h+(j<<1)|0;k[t+8>>2]=o;gi(h|0,0,q|0)|0;k[e>>2]=o;o=u;q=t;break}}else{k[u>>2]=0;k[u+4>>2]=0;k[u+8>>2]=0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;o=u;q=t}while(0);e=k[c>>2]|0;f=d+(e>>3)|0;y=l[f>>0]|0;h=hi(1,0,e&7|0)|0;g=L;y=h|y;h=f;i[h>>0]=y;i[h+1>>0]=y>>8;i[h+2>>0]=y>>16;i[h+3>>0]=y>>24;f=f+4|0;i[f>>0]=g;i[f+1>>0]=g>>8;i[f+2>>0]=g>>16;i[f+3>>0]=g>>24;f=e+1|0;k[c>>2]=f;g=b+-2|0;if(g>>>0>=16)Ka(195222,195244,52,195268);h=d+(f>>3)|0;z=l[h>>0]|0;g=hi(g|0,((g|0)<0)<<31>>31|0,f&7|0)|0;y=L;g=z|g;f=h;h=f;i[h>>0]=g;i[h+1>>0]=g>>8;i[h+2>>0]=g>>16;i[h+3>>0]=g>>24;f=f+4|0;i[f>>0]=y;i[f+1>>0]=y>>8;i[f+2>>0]=y>>16;i[f+3>>0]=y>>24;k[c>>2]=e+5;f=k[v>>2]|0;k[f+(p<<2)>>2]=a;k[f>>2]=1;if((j|0)>(b|0)){g=b+a+-1|0;e=b;do{k[f+(e<<2)>>2]=1;e=e+1|0}while((e|0)!=(g|0))}Je(f,j,k[o>>2]|0,k[q>>2]|0,c,d);a:do if((a|0)>0){h=((n|0)<0)<<31>>31;z=hi(1,0,p|0)|0;y=L;if(y>>>0>h>>>0|(y|0)==(h|0)&z>>>0>n>>>0){b=0;while(1){f=(b|0)==0?0:p+b|0;e=i[(k[o>>2]|0)+f>>0]|0;f=m[(k[q>>2]|0)+(f<<1)>>1]|0;z=hi(1,0,e&255|0)|0;y=L;if(!(y>>>0>0|(y|0)==0&z>>>0>f>>>0)){e=25;break}g=k[c>>2]|0;y=d+(g>>3)|0;j=l[y>>0]|0;f=hi(f|0,0,g&7|0)|0;z=L;j=f|j;f=y;y=f;i[y>>0]=j;i[y+1>>0]=j>>8;i[y+2>>0]=j>>16;i[y+3>>0]=j>>24;f=f+4|0;i[f>>0]=z;i[f+1>>0]=z>>8;i[f+2>>0]=z>>16;i[f+3>>0]=z>>24;e=g+(e&255)|0;k[c>>2]=e;f=i[(k[o>>2]|0)+p>>0]|0;g=m[(k[q>>2]|0)+(p<<1)>>1]|0;z=hi(1,0,f&255|0)|0;y=L;if(!(y>>>0>0|(y|0)==0&z>>>0>g>>>0)){e=27;break}z=d+(e>>3)|0;A=l[z>>0]|0;y=hi(g|0,0,e&7|0)|0;j=L;y=A|y;g=z;i[g>>0]=y;i[g+1>>0]=y>>8;i[g+2>>0]=y>>16;i[g+3>>0]=y>>24;z=z+4|0;i[z>>0]=j;i[z+1>>0]=j>>8;i[z+2>>0]=j>>16;i[z+3>>0]=j>>24;e=(f&255)+e|0;z=d+(e>>3)|0;j=l[z>>0]|0;g=hi(n|0,h|0,e&7|0)|0;y=L;g=j|g;j=z;i[j>>0]=g;i[j+1>>0]=g>>8;i[j+2>>0]=g>>16;i[j+3>>0]=g>>24;z=z+4|0;i[z>>0]=y;i[z+1>>0]=y>>8;i[z+2>>0]=y>>16;i[z+3>>0]=y>>24;e=e+p|0;k[c>>2]=e;b=b+1|0;if((b|0)>=(a|0)){s=e;break a}}if((e|0)==25)Ka(195222,195244,52,195268);else if((e|0)==27)Ka(195222,195244,52,195268)}else{e=i[k[o>>2]>>0]|0;f=m[k[q>>2]>>1]|0;A=hi(1,0,e&255|0)|0;z=L;if(!(z>>>0>0|(z|0)==0&A>>>0>f>>>0))Ka(195222,195244,52,195268);g=k[c>>2]|0;z=d+(g>>3)|0;y=l[z>>0]|0;f=hi(f|0,0,g&7|0)|0;A=L;y=f|y;f=z;z=f;i[z>>0]=y;i[z+1>>0]=y>>8;i[z+2>>0]=y>>16;i[z+3>>0]=y>>24;f=f+4|0;i[f>>0]=A;i[f+1>>0]=A>>8;i[f+2>>0]=A>>16;i[f+3>>0]=A>>24;g=g+(e&255)|0;k[c>>2]=g;f=i[(k[o>>2]|0)+p>>0]|0;e=m[(k[q>>2]|0)+(p<<1)>>1]|0;A=hi(1,0,f&255|0)|0;z=L;if(z>>>0>0|(z|0)==0&A>>>0>e>>>0){A=d+(g>>3)|0;y=l[A>>0]|0;q=hi(e|0,0,g&7|0)|0;z=L;q=y|q;y=A;i[y>>0]=q;i[y+1>>0]=q>>8;i[y+2>>0]=q>>16;i[y+3>>0]=q>>24;A=A+4|0;i[A>>0]=z;i[A+1>>0]=z>>8;i[A+2>>0]=z>>16;i[A+3>>0]=z>>24;k[c>>2]=(f&255)+g;Ka(195222,195244,52,195268)}else Ka(195222,195244,52,195268)}}else s=k[c>>2]|0;while(0);g=d+(s>>3)|0;z=l[g>>0]|0;A=hi(1,0,s&7|0)|0;h=L;z=A|z;A=g;i[A>>0]=z;i[A+1>>0]=z>>8;i[A+2>>0]=z>>16;i[A+3>>0]=z>>24;g=g+4|0;i[g>>0]=h;i[g+1>>0]=h>>8;i[g+2>>0]=h>>16;i[g+3>>0]=h>>24;k[c>>2]=s+1;g=k[t>>2]|0;h=g;if(g){e=t+4|0;f=k[e>>2]|0;if((f|0)!=(g|0))k[e>>2]=f+(~((f+-2-h|0)>>>1)<<1);rg(g)}f=k[u>>2]|0;if(f){e=u+4|0;if((k[e>>2]|0)!=(f|0))k[e>>2]=f;rg(f)}e=k[v>>2]|0;if(!e){r=x;return}f=k[w>>2]|0;if((f|0)!=(e|0))k[w>>2]=f+(~((f+-4-e|0)>>>2)<<2);rg(e);r=x;return}function Re(a,b,c,d,e,f,g,h,m,n,o,p,q,s,t){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;m=m|0;n=n|0;o=o|0;p=p|0;q=q|0;s=s|0;t=t|0;var u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=0;Q=r;r=r+448|0;P=Q+296|0;N=Q+148|0;K=Q;if(!(De(g,c,s,t)|0)){P=0;r=Q;return P|0}if(!c){P=(k[s>>2]|0)+7|0;k[s>>2]=P&-8;i[t+(P>>3)>>0]=0;P=1;r=Q;return P|0}D=k[q>>2]|0;E=q+4|0;F=q+16|0;k[P>>2]=256;k[P+4>>2]=D;k[P+8>>2]=E;k[P+12>>2]=F;O=P+16|0;u=P+116|0;y=O;z=y+100|0;do{k[y>>2]=0;y=y+4|0}while((y|0)<(z|0));c=k[F>>2]|0;if((c|0)==(k[q+20>>2]|0))c=0;else c=k[c>>2]|0;k[u>>2]=c;B=P+120|0;k[B>>2]=0;k[B+4>>2]=0;k[B+8>>2]=0;k[B+12>>2]=0;k[B+16>>2]=0;k[B+20>>2]=0;k[B+24>>2]=0;B=k[q+28>>2]|0;c=q+44|0;k[N>>2]=704;A=N+4|0;k[A>>2]=B;B=N+8|0;k[B>>2]=q+32;C=N+12|0;k[C>>2]=c;M=N+16|0;u=N+116|0;y=M;z=y+100|0;do{k[y>>2]=0;y=y+4|0}while((y|0)<(z|0));c=k[c>>2]|0;if((c|0)==(k[q+48>>2]|0))c=0;else c=k[c>>2]|0;k[u>>2]=c;v=N+120|0;k[v>>2]=0;k[v+4>>2]=0;k[v+8>>2]=0;k[v+12>>2]=0;k[v+16>>2]=0;k[v+20>>2]=0;k[v+24>>2]=0;v=k[q+56>>2]|0;c=q+72|0;k[K>>2]=h+16+(48<>2]=v;v=K+8|0;k[v>>2]=q+60;w=K+12|0;k[w>>2]=c;J=K+16|0;x=K+116|0;y=J;z=y+100|0;do{k[y>>2]=0;y=y+4|0}while((y|0)<(z|0));c=k[c>>2]|0;if((c|0)==(k[q+76>>2]|0))c=0;else c=k[c>>2]|0;k[x>>2]=c;I=K+120|0;k[I>>2]=0;k[I+4>>2]=0;k[I+8>>2]=0;k[I+12>>2]=0;k[I+16>>2]=0;k[I+20>>2]=0;k[I+24>>2]=0;Pe(E,F,D,O,s,t);Pe(k[B>>2]|0,k[C>>2]|0,k[A>>2]|0,M,s,t);Pe(k[v>>2]|0,k[w>>2]|0,k[u>>2]|0,J,s,t);if(m>>>0>=4)Ka(195222,195244,52,195268);u=k[s>>2]|0;v=t+(u>>3)|0;H=l[v>>0]|0;I=hi(m|0,((m|0)<0)<<31>>31|0,u&7|0)|0;c=L;H=I|H;I=v;i[I>>0]=H;i[I+1>>0]=H>>8;i[I+2>>0]=H>>16;i[I+3>>0]=H>>24;v=v+4|0;i[v>>0]=c;i[v+1>>0]=c>>8;i[v+2>>0]=c>>16;i[v+3>>0]=c>>24;v=u+2|0;k[s>>2]=v;c=h>>m;if(c>>>0>=16)Ka(195222,195244,52,195268);H=t+(v>>3)|0;h=l[H>>0]|0;G=hi(c|0,((c|0)<0)<<31>>31|0,v&7|0)|0;I=L;G=h|G;c=H;H=c;i[H>>0]=G;i[H+1>>0]=G>>8;i[H+2>>0]=G>>16;i[H+3>>0]=G>>24;c=c+4|0;i[c>>0]=I;i[c+1>>0]=I>>8;i[c+2>>0]=I>>16;i[c+3>>0]=I>>24;c=u+6|0;k[s>>2]=c;if((k[q>>2]|0)>0){v=((n|0)<0)<<31>>31;if(n>>>0<4){u=0;do{I=t+(c>>3)|0;h=l[I>>0]|0;G=hi(n|0,v|0,c&7|0)|0;H=L;h=G|h;G=I;i[G>>0]=h;i[G+1>>0]=h>>8;i[G+2>>0]=h>>16;i[G+3>>0]=h>>24;I=I+4|0;i[I>>0]=H;i[I+1>>0]=H>>8;i[I+2>>0]=H>>16;i[I+3>>0]=H>>24;c=c+2|0;k[s>>2]=c;u=u+1|0}while((u|0)<(k[q>>2]|0))}else Ka(195222,195244,52,195268)}H=q+84|0;I=q+88|0;v=q+108|0;c=((k[q+112>>2]|0)-(k[v>>2]|0)|0)/1040|0;if((k[H>>2]|0)==(k[I>>2]|0))Qe(c,6,s,t);else Ne(H,c,s,t);h=q+96|0;G=q+100|0;c=q+132|0;u=((k[q+136>>2]|0)-(k[c>>2]|0)|0)/2096|0;if((k[h>>2]|0)==(k[G>>2]|0))Qe(u,2,s,t);else Ne(h,u,s,t);We(P,v,s,t);Xe(N,q+120|0,s,t);Ye(K,c,s,t);a:do if(p){m=(n|0)==0;u=e;c=f;F=0;z=b;while(1){y=k[o+(F<<5)>>2]|0;A=k[o+(F<<5)+4>>2]|0;B=j[o+(F<<5)+8>>1]|0;C=j[o+(F<<5)+10>>1]|0;x=o+(F<<5)+16|0;v=k[x>>2]|0;x=k[x+4>>2]|0;D=k[o+(F<<5)+24>>2]|0;E=B&65535;Ze(N,E,s,t);w=x&65535;x=ji(v|0,x|0,48)|0;b=hi(1,0,x|0)|0;f=L;if(!(f>>>0>w>>>0|(f|0)==(w|0)&b>>>0>v>>>0)){c=27;break}b=k[s>>2]|0;e=t+(b>>3)|0;q=l[e>>0]|0;v=hi(v|0,w|0,b&7|0)|0;f=L;q=v|q;v=e;e=v;i[e>>0]=q;i[e+1>>0]=q>>8;i[e+2>>0]=q>>16;i[e+3>>0]=q>>24;v=v+4|0;i[v>>0]=f;i[v+1>>0]=f>>8;i[v+2>>0]=f>>16;i[v+3>>0]=f>>24;k[s>>2]=b+x;v=(y|0)>0;b:do if((k[H>>2]|0)==(k[I>>2]|0))if(v){w=0;v=z;do{Ze(P,l[a+(v&d)>>0]|0,s,t);v=v+1|0;w=w+1|0}while((w|0)<(y|0));x=u;u=v}else{x=u;u=z}else if(v){if(m){c=u;w=0;u=z;while(1){v=i[a+(u&d)>>0]|0;_e(P,v&255,c&63,H,s,t);u=u+1|0;w=w+1|0;if((w|0)>=(y|0)){x=v;break b}else c=v}}else{x=0;w=z}while(1){switch(n|0){case 3:{c=((l[318858+(u&255)>>0]|0)<<3)+(l[318858+(c&255)>>0]|0)&255;break}case 1:{c=(u&255)>>>2;break}case 2:{c=i[318346+(c&255|256)>>0]|i[318346+(u&255)>>0];break}default:c=0}v=i[a+(w&d)>>0]|0;_e(P,v&255,c&255,H,s,t);w=w+1|0;x=x+1|0;if((x|0)>=(y|0)){x=v;c=u;u=w;break b}else{c=u;u=v}}}else{x=u;u=z}while(0);z=u+A|0;if((A|0)>0){c=i[a+(z+-2&d)>>0]|0;u=i[a+(z+-1&d)>>0]|0;if((B&65535)>127){w=C&65535;x=D>>>24;v=D&16777215;if((k[h>>2]|0)==(k[G>>2]|0))Ze(K,w,s,t);else{f=E>>>6;b=E&7;$e(K,w,b>>>0<3&((f|0)==7|((f|0)==4|(f&1021|0)==0))?b:3,h,s,t)}b=hi(1,0,x|0)|0;f=L;if(!(f>>>0>0|(f|0)==0&b>>>0>v>>>0)){c=45;break}b=k[s>>2]|0;f=t+(b>>3)|0;E=l[f>>0]|0;q=hi(v|0,0,b&7|0)|0;e=L;E=q|E;q=f;i[q>>0]=E;i[q+1>>0]=E>>8;i[q+2>>0]=E>>16;i[q+3>>0]=E>>24;f=f+4|0;i[f>>0]=e;i[f+1>>0]=e>>8;i[f+2>>0]=e>>16;i[f+3>>0]=e>>24;k[s>>2]=b+x}}else u=x;F=F+1|0;if(F>>>0>=p>>>0)break a}if((c|0)==27)Ka(195222,195244,52,195268);else if((c|0)==45)Ka(195222,195244,52,195268)}while(0);if(g){g=(k[s>>2]|0)+7|0;k[s>>2]=g&-8;i[t+(g>>3)>>0]=0}c=k[K+136>>2]|0;u=c;if(c){v=K+140|0;w=k[v>>2]|0;if((w|0)!=(c|0))k[v>>2]=w+(~((w+-2-u|0)>>>1)<<1);rg(c)}u=k[K+124>>2]|0;if(u){c=K+128|0;if((k[c>>2]|0)!=(u|0))k[c>>2]=u;rg(u)}af(J);c=k[N+136>>2]|0;u=c;if(c){v=N+140|0;w=k[v>>2]|0;if((w|0)!=(c|0))k[v>>2]=w+(~((w+-2-u|0)>>>1)<<1);rg(c)}u=k[N+124>>2]|0;if(u){c=N+128|0;if((k[c>>2]|0)!=(u|0))k[c>>2]=u;rg(u)}af(M);c=k[P+136>>2]|0;u=c;if(c){v=P+140|0;w=k[v>>2]|0;if((w|0)!=(c|0))k[v>>2]=w+(~((w+-2-u|0)>>>1)<<1);rg(c)}u=k[P+124>>2]|0;if(u){c=P+128|0;if((k[c>>2]|0)!=(u|0))k[c>>2]=u;rg(u)}af(O);P=1;r=Q;return P|0}function Se(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;if(!(Ee(e,f,g)|0)){f=0;return f|0}j=(k[f>>2]|0)+7|0;h=j&-8;k[f>>2]=h;i[g+(j>>3)>>0]=0;c=d&c;d=d+1|0;if((c+e|0)>>>0>d>>>0){d=d-c|0;ki(g+(j>>3)|0,b+c|0,d|0)|0;h=h+(d<<3)|0;k[f>>2]=h;e=e-d|0;c=0}ki(g+(h>>3)|0,b+c|0,e|0)|0;c=h+(e<<3)|0;k[f>>2]=c;if(c&7)Ka(195308,195244,85,195323);h=g+(c>>3)|0;i[h>>0]=0;if(!a){f=1;return f|0}j=h;a=j;i[a>>0]=1;i[a+1>>0]=0;i[a+2>>0]=0;i[a+3>>0]=0;j=j+4|0;i[j>>0]=0;i[j+1>>0]=0;i[j+2>>0]=0;i[j+3>>0]=0;j=c+1|0;a=g+(j>>3)|0;d=l[a>>0]|0;j=hi(1,0,j&7|0)|0;b=L;d=j|d;j=a;i[j>>0]=d;i[j+1>>0]=d>>8;i[j+2>>0]=d>>16;i[j+3>>0]=d>>24;a=a+4|0;i[a>>0]=b;i[a+1>>0]=b>>8;i[a+2>>0]=b>>16;i[a+3>>0]=b>>24;a=c+9|0;k[f>>2]=a&-8;i[g+(a>>3)>>0]=0;f=1;return f|0}function Te(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;k[a>>2]=0;g=a+4|0;k[g>>2]=0;k[a+8>>2]=0;e=b+4|0;c=(k[e>>2]|0)-(k[b>>2]|0)|0;d=c>>2;if(!d)return;if(d>>>0>1073741823)mg(a);f=og(c)|0;k[g>>2]=f;k[a>>2]=f;k[a+8>>2]=f+(d<<2);c=k[b>>2]|0;b=k[e>>2]|0;if((c|0)==(b|0))return;a=(b+-4-c|0)>>>2;d=f;while(1){k[d>>2]=k[c>>2];c=c+4|0;if((c|0)==(b|0))break;else d=d+4|0}k[g>>2]=f+(a+1<<2);return}function Ue(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;q=r;r=r+368|0;p=q;o=q+344|0;n=q+72|0;d=k[a+1088>>2]|0;if(!d){s=12.0;r=q;return +s}else{b=0;c=0}do{b=((k[a+(c<<2)>>2]|0)>0&1)+b|0;c=c+1|0}while((b|0)<5&(c|0)<272);switch(b|0){case 2:{s=+(d+20|0);r=q;return +s}case 1:{s=12.0;r=q;return +s}default:{gi(n|0,0,272)|0;Af(a,272,15,n);c=0;d=0;do{c=(ha(l[n+d>>0]|0,k[a+(d<<2)>>2]|0)|0)+c|0;d=d+1|0}while((d|0)!=272);switch(b|0){case 3:{b=c+28|0;break}case 4:{b=c+37|0;break}default:{d=p;a=d+72|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(a|0));j=p+68|0;m=p+64|0;d=0;b=1;h=8;a:while(1){g=d;while(1){e=i[n+g>>0]|0;f=e&255;b=(f|0)>(b|0)?f:b;d=g+1|0;b:do if((d|0)<272){a=1;do{if((i[n+d>>0]|0)!=e<<24>>24)break b;a=a+1|0;d=d+1|0}while((d|0)<272)}else a=1;while(0);g=a+g|0;d=e<<24>>24==0;if(d&(g|0)==272)break a;if(!d){e=g;d=a;break}if((a|0)<3)k[p>>2]=(k[p>>2]|0)+a;else{d=k[j>>2]|0;a=a+-2|0;do{d=d+1|0;a=a>>3}while((a|0)>0);k[j>>2]=d}if((g|0)>=272)break a}if((f|0)==(h|0))a=d;else{a=p+(f<<2)|0;k[a>>2]=(k[a>>2]|0)+1;a=d+-1|0}if((a|0)<3){h=p+(f<<2)|0;k[h>>2]=(k[h>>2]|0)+a}else{d=k[m>>2]|0;a=a+-2|0;do{d=d+1|0;a=a>>2}while((a|0)>0);k[m>>2]=d}if((e|0)<272){d=e;h=f}else break}d=o;a=d+18|0;do{i[d>>0]=0;d=d+1|0}while((d|0)<(a|0));Af(p,18,7,o);C=o+16|0;i[C>>0]=(l[C>>0]|0)+2;B=o+17|0;n=(l[B>>0]|0)+3|0;i[B>>0]=n;B=ha(l[o>>0]|0,k[p>>2]|0)|0;A=ha(l[o+1>>0]|0,k[p+4>>2]|0)|0;z=ha(l[o+2>>0]|0,k[p+8>>2]|0)|0;y=ha(l[o+3>>0]|0,k[p+12>>2]|0)|0;x=ha(l[o+4>>0]|0,k[p+16>>2]|0)|0;w=ha(l[o+5>>0]|0,k[p+20>>2]|0)|0;v=ha(l[o+6>>0]|0,k[p+24>>2]|0)|0;u=ha(l[o+7>>0]|0,k[p+28>>2]|0)|0;t=ha(l[o+8>>0]|0,k[p+32>>2]|0)|0;d=ha(l[o+9>>0]|0,k[p+36>>2]|0)|0;a=ha(l[o+10>>0]|0,k[p+40>>2]|0)|0;e=ha(l[o+11>>0]|0,k[p+44>>2]|0)|0;f=ha(l[o+12>>0]|0,k[p+48>>2]|0)|0;g=ha(l[o+13>>0]|0,k[p+52>>2]|0)|0;h=ha(l[o+14>>0]|0,k[p+56>>2]|0)|0;o=ha(l[o+15>>0]|0,k[p+60>>2]|0)|0;p=ha(l[C>>0]|0,k[m>>2]|0)|0;b=c+18+(b<<1)+B+A+z+y+x+w+v+u+t+d+a+e+f+g+h+o+p+(ha(k[j>>2]|0,n&255)|0)|0}}s=+(b|0);r=q;return +s}}return 0.0}function Ve(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0;g=a+8|0;d=k[g>>2]|0;j=a+4|0;e=k[j>>2]|0;c=e;if(d-c>>1>>>0>=b>>>0){gi(e|0,0,b<<1|0)|0;k[j>>2]=e+(b<<1);return}h=k[a>>2]|0;i=h;c=(c-i>>1)+b|0;if((c|0)<0)mg(a);l=h;f=d-l|0;f=f>>1>>>0<1073741823?(f>>>0>>0?c:f):2147483647;c=e-l|0;d=c>>1;if(!f)e=0;else e=og(f<<1)|0;gi(e+(d<<1)|0,0,b<<1|0)|0;ki(e|0,h|0,c|0)|0;k[a>>2]=e;k[j>>2]=e+(d+b<<1);k[g>>2]=e+(f<<1);if(!i)return;rg(i);return}function We(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;p=a+124|0;q=b+4|0;f=k[q>>2]|0;e=k[b>>2]|0;g=k[a>>2]|0;n=ha(g,(f-e|0)/1040|0)|0;h=a+128|0;i=k[h>>2]|0;j=k[p>>2]|0;l=i-j|0;if(n>>>0<=l>>>0){if(n>>>0>>0?(m=j+n|0,(i|0)!=(m|0)):0)k[h>>2]=m}else{uc(p,n-l|0);f=k[q>>2]|0;e=k[b>>2]|0;g=k[a>>2]|0}m=a+136|0;g=ha(g,(f-e|0)/1040|0)|0;h=a+140|0;i=k[h>>2]|0;j=k[m>>2]|0;l=i-j>>1;if(g>>>0<=l>>>0){if(g>>>0>>0?(o=j+(g<<1)|0,(i|0)!=(o|0)):0)k[h>>2]=i+(~((i+-2-o|0)>>>1)<<1)}else{Ve(m,g-l|0);f=k[q>>2]|0;e=k[b>>2]|0}if((f|0)==(e|0))return;else f=0;do{n=k[a>>2]|0;o=ha(n,f)|0;Je(e+(f*1040|0)|0,n,(k[p>>2]|0)+o|0,(k[m>>2]|0)+(o<<1)|0,c,d);f=f+1|0;e=k[b>>2]|0}while(f>>>0<(((k[q>>2]|0)-e|0)/1040|0)>>>0);return}function Xe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;p=a+124|0;q=b+4|0;f=k[q>>2]|0;e=k[b>>2]|0;g=k[a>>2]|0;n=ha(g,(f-e|0)/2832|0)|0;h=a+128|0;i=k[h>>2]|0;j=k[p>>2]|0;l=i-j|0;if(n>>>0<=l>>>0){if(n>>>0>>0?(m=j+n|0,(i|0)!=(m|0)):0)k[h>>2]=m}else{uc(p,n-l|0);f=k[q>>2]|0;e=k[b>>2]|0;g=k[a>>2]|0}m=a+136|0;g=ha(g,(f-e|0)/2832|0)|0;h=a+140|0;i=k[h>>2]|0;j=k[m>>2]|0;l=i-j>>1;if(g>>>0<=l>>>0){if(g>>>0>>0?(o=j+(g<<1)|0,(i|0)!=(o|0)):0)k[h>>2]=i+(~((i+-2-o|0)>>>1)<<1)}else{Ve(m,g-l|0);f=k[q>>2]|0;e=k[b>>2]|0}if((f|0)==(e|0))return;else f=0;do{n=k[a>>2]|0;o=ha(n,f)|0;Je(e+(f*2832|0)|0,n,(k[p>>2]|0)+o|0,(k[m>>2]|0)+(o<<1)|0,c,d);f=f+1|0;e=k[b>>2]|0}while(f>>>0<(((k[q>>2]|0)-e|0)/2832|0)>>>0);return}function Ye(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;p=a+124|0;q=b+4|0;f=k[q>>2]|0;e=k[b>>2]|0;g=k[a>>2]|0;n=ha(g,(f-e|0)/2096|0)|0;h=a+128|0;i=k[h>>2]|0;j=k[p>>2]|0;l=i-j|0;if(n>>>0<=l>>>0){if(n>>>0>>0?(m=j+n|0,(i|0)!=(m|0)):0)k[h>>2]=m}else{uc(p,n-l|0);f=k[q>>2]|0;e=k[b>>2]|0;g=k[a>>2]|0}m=a+136|0;g=ha(g,(f-e|0)/2096|0)|0;h=a+140|0;i=k[h>>2]|0;j=k[m>>2]|0;l=i-j>>1;if(g>>>0<=l>>>0){if(g>>>0>>0?(o=j+(g<<1)|0,(i|0)!=(o|0)):0)k[h>>2]=i+(~((i+-2-o|0)>>>1)<<1)}else{Ve(m,g-l|0);f=k[q>>2]|0;e=k[b>>2]|0}if((f|0)==(e|0))return;else f=0;do{n=k[a>>2]|0;o=ha(n,f)|0;Je(e+(f*2096|0)|0,n,(k[p>>2]|0)+o|0,(k[m>>2]|0)+(o<<1)|0,c,d);f=f+1|0;e=k[b>>2]|0}while(f>>>0<(((k[q>>2]|0)-e|0)/2096|0)>>>0);return}function Ze(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;g=a+116|0;e=k[g>>2]|0;if(!e){h=a+112|0;e=(k[h>>2]|0)+1|0;k[h>>2]=e;k[g>>2]=k[(k[k[a+12>>2]>>2]|0)+(e<<2)>>2];h=ha(k[a>>2]|0,k[(k[k[a+8>>2]>>2]|0)+(e<<2)>>2]|0)|0;f=a+120|0;k[f>>2]=h;Oe(a+16|0,e,c,d);e=k[g>>2]|0}else f=a+120|0;k[g>>2]=e+-1;e=(k[f>>2]|0)+b|0;f=i[(k[a+124>>2]|0)+e>>0]|0;e=m[(k[a+136>>2]|0)+(e<<1)>>1]|0;h=hi(1,0,f&255|0)|0;a=L;if(a>>>0>0|(a|0)==0&h>>>0>e>>>0){h=k[c>>2]|0;d=d+(h>>3)|0;g=l[d>>0]|0;b=hi(e|0,0,h&7|0)|0;a=L;g=b|g;b=d;i[b>>0]=g;i[b+1>>0]=g>>8;i[b+2>>0]=g>>16;i[b+3>>0]=g>>24;d=d+4|0;i[d>>0]=a;i[d+1>>0]=a>>8;i[d+2>>0]=a>>16;i[d+3>>0]=a>>24;k[c>>2]=h+(f&255);return}else Ka(195222,195244,52,195268)}function _e(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;j=a+116|0;g=k[j>>2]|0;if(!g){h=a+112|0;g=(k[h>>2]|0)+1|0;k[h>>2]=g;k[j>>2]=k[(k[k[a+12>>2]>>2]|0)+(g<<2)>>2];h=a+120|0;k[h>>2]=k[(k[k[a+8>>2]>>2]|0)+(g<<2)>>2]<<6;Oe(a+16|0,g,e,f);g=k[j>>2]|0}else h=a+120|0;k[j>>2]=g+-1;g=(ha(k[a>>2]|0,k[(k[d>>2]|0)+((k[h>>2]|0)+c<<2)>>2]|0)|0)+b|0;h=i[(k[a+124>>2]|0)+g>>0]|0;g=m[(k[a+136>>2]|0)+(g<<1)>>1]|0;a=hi(1,0,h&255|0)|0;b=L;if(b>>>0>0|(b|0)==0&a>>>0>g>>>0){a=k[e>>2]|0;f=f+(a>>3)|0;c=l[f>>0]|0;d=hi(g|0,0,a&7|0)|0;b=L;c=d|c;d=f;i[d>>0]=c;i[d+1>>0]=c>>8;i[d+2>>0]=c>>16;i[d+3>>0]=c>>24;f=f+4|0;i[f>>0]=b;i[f+1>>0]=b>>8;i[f+2>>0]=b>>16;i[f+3>>0]=b>>24;k[e>>2]=a+(h&255);return}else Ka(195222,195244,52,195268)}function $e(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;j=a+116|0;g=k[j>>2]|0;if(!g){h=a+112|0;g=(k[h>>2]|0)+1|0;k[h>>2]=g;k[j>>2]=k[(k[k[a+12>>2]>>2]|0)+(g<<2)>>2];h=a+120|0;k[h>>2]=k[(k[k[a+8>>2]>>2]|0)+(g<<2)>>2]<<2;Oe(a+16|0,g,e,f);g=k[j>>2]|0}else h=a+120|0;k[j>>2]=g+-1;g=(ha(k[a>>2]|0,k[(k[d>>2]|0)+((k[h>>2]|0)+c<<2)>>2]|0)|0)+b|0;h=i[(k[a+124>>2]|0)+g>>0]|0;g=m[(k[a+136>>2]|0)+(g<<1)>>1]|0;a=hi(1,0,h&255|0)|0;b=L;if(b>>>0>0|(b|0)==0&a>>>0>g>>>0){a=k[e>>2]|0;f=f+(a>>3)|0;c=l[f>>0]|0;d=hi(g|0,0,a&7|0)|0;b=L;c=d|c;d=f;i[d>>0]=c;i[d+1>>0]=c>>8;i[d+2>>0]=c>>16;i[d+3>>0]=c>>24;f=f+4|0;i[f>>0]=b;i[f+1>>0]=b>>8;i[f+2>>0]=b>>16;i[f+3>>0]=b>>24;k[e>>2]=a+(h&255);return}else Ka(195222,195244,52,195268)}function af(a){a=a|0;var b=0,c=0,d=0,e=0;b=k[a+84>>2]|0;c=b;if(b){d=a+88|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-2-c|0)>>>1)<<1);rg(b)}b=k[a+72>>2]|0;if(b){c=a+76|0;if((k[c>>2]|0)!=(b|0))k[c>>2]=b;rg(b)}b=k[a+60>>2]|0;c=b;if(b){d=a+64|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-2-c|0)>>>1)<<1);rg(b)}b=k[a+48>>2]|0;if(b){c=a+52|0;if((k[c>>2]|0)!=(b|0))k[c>>2]=b;rg(b)}b=k[a+36>>2]|0;c=b;if(b){d=a+40|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}b=k[a+24>>2]|0;c=b;if(b){d=a+28|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}b=k[a+12>>2]|0;c=b;if(b){d=a+16|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}d=k[a>>2]|0;if(!d)return;b=a+4|0;c=k[b>>2]|0;if((c|0)!=(d|0))k[b>>2]=c+(~((c+-4-d|0)>>>2)<<2);rg(d);return}function bf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0;d=i[b>>0]|0;e=d&255;if((e&128|0)==0?(k[a>>2]=e,d<<24>>24!=0):0){a=1;return a|0}if((c|0)>1){d=l[b>>0]|0;if(((d&224|0)==192?(f=l[b+1>>0]|0,(f&192|0)==128):0)?(f=f&63|d<<6&1984,k[a>>2]=f,f>>>0>127):0){a=2;return a|0}if((c|0)>2){d=l[b>>0]|0;if((((d&240|0)==224?(g=l[b+1>>0]|0,(g&192|0)==128):0)?(h=l[b+2>>0]|0,(h&192|0)==128):0)?(h=g<<6&4032|d<<12&61440|h&63,k[a>>2]=h,h>>>0>2047):0){a=3;return a|0}if((((((c|0)>3?(j=l[b>>0]|0,(j&248|0)==240):0)?(m=l[b+1>>0]|0,(m&192|0)==128):0)?(n=l[b+2>>0]|0,(n&192|0)==128):0)?(o=l[b+3>>0]|0,(o&192|0)==128):0)?(c=m<<12&258048|j<<18&1835008|n<<6&4032|o&63,k[a>>2]=c,(c+-65536|0)>>>0<1048576):0){a=4;return a|0}}}k[a>>2]=l[b>>0]|0|1114112;a=1;return a|0}function cf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,l=0,n=0,o=0,p=0;if((d|c|0)==0|(b|0)==0)return;h=c+16|0;i=1<>2]|0)>0?(m[a+(n<<5)+8>>1]|0)>127:0){g=a+(n<<5)+10|0;f=j[g>>1]|0;c=f&65535;if((f&65535)<16){c=c+1|0;f=a+(n<<5)+24|0}else{f=a+(n<<5)+24|0;o=k[f>>2]|0;e=o>>>24;c=(o&16777215)+13+(c+-12-(e<<1)<>>e&1;o=e-d|0;j[g>>1]=(c&l)+h+(((o<<1)+-2|p)<>d|o<<24}else{j[g>>1]=e;c=0}k[f>>2]=c}n=n+1|0}while((n|0)!=(b|0));return}function df(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0;k[a>>2]=k[b>>2];k[a+4>>2]=k[b+4>>2];k[a+8>>2]=k[b+8>>2];k[a+12>>2]=k[b+12>>2];k[a+16>>2]=k[b+16>>2];b=a+24|0;j=og(36)|0;c=j;d=j;e=d+36|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[b>>2]=c;k[a+32>>2]=0;f=a+36|0;k[f>>2]=0;g=a+40|0;k[g>>2]=0;h=a+52|0;b=a+4|0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0;k[h+16>>2]=0;d=a+90|0;e=d+10|0;do{i[d>>0]=0;d=d+1|0}while((d|0)<(e|0));e=k[b>>2]|0;e=(e|0)>0?e:0;k[b>>2]=e;b=a+8|0;c=k[b>>2]|0;if((c|0)>=16)if((c|0)>24){k[b>>2]=24;d=24}else d=c;else{k[b>>2]=16;d=16}b=a+12|0;c=k[b>>2]|0;if(!c){k[b>>2]=16;if((e|0)>8)if((d|0)>16){c=(d|0)<21?d:21;k[b>>2]=c;b=c;c=10}else{b=16;c=10}else{b=16;c=11}}else{c=k[((c|0)>16?b:2088)>>2]|0;c=(c|0)<24?c:24;k[b>>2]=c;b=c;c=10}if((c|0)==10)if((e|0)<10)c=11;if((c|0)==11){i[a+16>>0]=0;i[a+17>>0]=0;i[a+18>>0]=1;i[a+19>>0]=0}k[a+20>>2]=(1<>2]=l;l=1<>2]=l+-1;b=1<>2]=b;k[c+12>>2]=0;l=b+l|0;m=qg((l|0)<-3?-1:l+3|0)|0;k[c+16>>2]=m;i[m+l>>0]=0;i[m+(l+1)>>0]=0;i[m+(l+2)>>0]=0;k[f>>2]=c;if((e|0)>9){k[a+44>>2]=b+-1;m=qg(b>>>0>1073741823?-1:b<<2)|0;k[g>>2]=m}m=(b|0)>262144?b:262144;k[a+48>>2]=m;m=qg(m>>>0>134217727?-1:m<<5)|0;k[h>>2]=m;if((d|0)==16){c=1;b=0}else{c=4;b=((d<<1)+222|1)&255}i[a+88>>0]=b;i[a+89>>0]=c;k[a+72>>2]=4;k[a+76>>2]=11;k[a+80>>2]=15;k[a+84>>2]=16;switch(e|0){case 1:case 0:{k[a+28>>2]=1;b=1;break}case 3:case 2:{k[a+28>>2]=2;b=2;break}case 4:{k[a+28>>2]=3;b=3;break}case 6:case 5:{k[a+28>>2]=4;b=4;break}case 7:{k[a+28>>2]=5;b=5;break}case 8:{k[a+28>>2]=6;b=6;break}case 9:{k[a+28>>2]=7;b=7;break}default:{b=(k[a>>2]|0)==0?8:9;k[a+28>>2]=b}}lf(j,b);if(k[a>>2]|0)return;if(!(i[a+16>>0]|0))return;b=(i[a+17>>0]|0)!=0;if(!(k[521]|0)){m=og(40)|0;k[m>>2]=0;k[m+4>>2]=0;k[m+8>>2]=0;k[m+12>>2]=0;o[m+16>>2]=1.0;l=m+20|0;k[l>>2]=0;k[l+4>>2]=0;k[l+8>>2]=0;k[l+12>>2]=0;o[m+36>>2]=1.0;k[521]=m;mf(m,b)}b=k[(k[a+24>>2]|0)+28>>2]|0;if(!b)return;k[b+33619976>>2]=k[521];return}function ef(a){a=a|0;var b=0,c=0;c=a+96|0;b=k[c>>2]|0;k[c>>2]=0;if(b)sg(b);c=a+52|0;b=k[c>>2]|0;k[c>>2]=0;if(b)sg(b);c=a+40|0;b=k[c>>2]|0;k[c>>2]=0;if(b)sg(b);c=a+36|0;b=k[c>>2]|0;k[c>>2]=0;if(b){c=k[b+16>>2]|0;if(c)sg(c);rg(b)}a=a+24|0;b=k[a>>2]|0;k[a>>2]=0;if(!b)return;nf(b);rg(b);return}function ff(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0.0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;A=r;r=r+16|0;m=A;q=a+32|0;f=k[q>>2]|0;v=a+68|0;g=k[v>>2]|0;w=f-g|0;s=k[a+36>>2]|0;z=k[s+16>>2]|0;s=k[s+4>>2]|0;t=a+12|0;if(w>>>0>1<>2]>>>0){a=0;r=A;return a|0}u=a+19|0;if(!(i[u>>0]|0))p=0;else{l=s&g;if((f|0)==(g|0))h=0.0;else{g=0;f=0;do{p=bf(m,z+(g+l)|0,w-g|0)|0;g=p+g|0;f=((k[m>>2]|0)<1114112?p:0)+f|0}while(g>>>0>>0);h=+(f>>>0)}p=h>+(w>>>0)*.75}o=a+40|0;g=k[o>>2]|0;do if(g){l=k[v>>2]|0;f=a+44|0;m=k[f>>2]|0;if(p){Mf(l,w,s,m,z,g);break}else{Nf(l,w,s,m,z,g);break}}else f=a+44|0;while(0);l=a+60|0;m=a+56|0;n=a+52|0;jd(w,k[v>>2]|0,z,s,k[o>>2]|0,k[f>>2]|0,k[a+20>>2]|0,(i[u>>0]|0)!=0?8.115:4.0,k[a+4>>2]|0,k[a+24>>2]|0,k[a+28>>2]|0,a+72|0,l,(k[n>>2]|0)+(k[m>>2]<<5)|0,m);if((!(b|c)?(x=1<>2],((x>>>1)+(k[m>>2]|0)|0)>>>0<(k[a+48>>2]|0)>>>0):0)?(y=k[q>>2]|0,(y+x|0)>>>0<=(s+1+(k[a+64>>2]|0)|0)>>>0):0){k[v>>2]=y;k[d>>2]=0;a=1;r=A;return a|0}g=k[l>>2]|0;if((g|0)>0){do if((g|0)>=6){if((g|0)<130){c=g+-2|0;f=((ja(c|0)|0)^31)+-1|0;f=(c>>f)+2+(f<<1)|0;break}if((g|0)<2114){f=((ja(g+-66|0)|0)^31)+10|0;break}if((g|0)<6210)f=21;else f=(g|0)<22594?22:23}else f=g;while(0);x=g-(k[2188+(f<<2)>>2]|0)|0;y=(f<<3&56|k[2284+((f>>3)*3<<2)>>2]<<6|2)&65535;w=hi(k[2092+(f<<2)>>2]|0,0,48)|0;c=k[m>>2]|0;k[m>>2]=c+1;z=k[n>>2]|0;k[z+(c<<5)>>2]=g;k[z+(c<<5)+4>>2]=0;j[z+(c<<5)+8>>1]=y;j[z+(c<<5)+10>>1]=16;y=z+(c<<5)+16|0;k[y>>2]=x|w;k[y+4>>2]=((x|0)<0)<<31>>31|L;k[z+(c<<5)+24>>2]=0;k[l>>2]=0}a=gf(a,b,p,d,e)|0;r=A;return a|0}function gf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,m=0.0,n=0.0,q=0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;J=r;r=r+1056|0;I=J+16|0;G=J+24|0;H=J;B=a+32|0;s=k[B>>2]|0;D=a+64|0;w=k[D>>2]|0;E=s-w|0;C=k[a+36>>2]|0;F=k[C+16>>2]|0;C=k[C+4>>2]|0;g=(E<<1)+500|0;h=a+92|0;if((k[h>>2]|0)>>>0>>0){A=qg(g)|0;f=a+96|0;j=k[f>>2]|0;k[f>>2]=A;if(j)sg(j);k[h>>2]=g}else f=a+96|0;x=k[f>>2]|0;y=a+88|0;i[x>>0]=i[y>>0]|0;z=a+89|0;k[I>>2]=l[z>>0];A=a+56|0;g=k[A>>2]|0;if(g>>>0<((E>>>8)+2|0)>>>0){if((g|0)>0){h=k[a+52>>2]|0;j=0;f=0;do{f=(k[h+(j<<5)>>2]|0)+f|0;j=j+1|0}while((j|0)<(g|0))}else f=0;m=+(E>>>0);if(+(f|0)>m*.99){gi(G|0,0,1024)|0;if((i[200]|0)==0?(Ga(200)|0)!=0:0){p[26]=m*7.92/13.0;sb(200)}f=k[D>>2]|0;g=k[B>>2]|0;if(f>>>0>>0)do{q=G+(l[F+(f&C)>>0]<<2)|0;k[q>>2]=(k[q>>2]|0)+1;f=f+13|0}while(f>>>0>>0);q=G+1024|0;j=G;m=0.0;f=0;do{g=k[j>>2]|0;v=+(g|0);if((g|0)<256)u=+o[4036+(g<<2)>>2];else u=+oh(v);h=k[j+4>>2]|0;j=j+8|0;f=g+f+h|0;t=+(h|0);if((h|0)<256)n=+o[4036+(h<<2)>>2];else n=+oh(t);m=m-v*u-t*n}while(j>>>0>>0);t=+(f|0);if(f){if((f|0)<256)n=+o[4036+(f<<2)>>2];else n=+oh(t);m=m+t*n}f=(m+p[26]}else f=0}else f=0;a:do if((s|0)==(w|0))if(De(b,0,I,x)|0){k[I>>2]=(k[I>>2]|0)+7&-8;break}else{a=0;r=J;return a|0}else{if(f){if(Se(b,F,k[D>>2]|0,C,E,I,x)|0)break;else f=0;r=J;return f|0}h=a+72|0;k[H>>2]=k[h>>2];k[H+4>>2]=k[h+4>>2];k[H+8>>2]=k[h+8>>2];k[H+12>>2]=k[h+12>>2];j=a+4|0;if((k[j>>2]|0)>9?(k[a>>2]|0)==1:0){cf(k[a+52>>2]|0,k[A>>2]|0,12,1);q=1;s=12}else{q=0;s=0}f=c?2:3;gi(G|0,0,144)|0;g=k[D>>2]|0;if(!(i[a+18>>0]|0))Of(F,g,C,i[a+90>>0]|0,i[a+91>>0]|0,k[a+52>>2]|0,k[A>>2]|0,f,(i[a+19>>0]|0)!=0,G);else Pf(F,g,C,k[a+52>>2]|0,k[A>>2]|0,G);if((k[j>>2]|0)>2)Qf(s,q,G);do if(Re(F,k[D>>2]|0,E,C,i[a+90>>0]|0,i[a+91>>0]|0,b,s,q,f,k[a+52>>2]|0,k[A>>2]|0,G,I,x)|0){if((E+4|0)>>>0>2]>>3>>>0?(k[h>>2]=k[H>>2],k[h+4>>2]=k[H+4>>2],k[h+8>>2]=k[H+8>>2],k[h+12>>2]=k[H+12>>2],i[x>>0]=i[y>>0]|0,k[I>>2]=l[z>>0],!(Se(b,F,k[D>>2]|0,C,E,I,x)|0)):0)break;of(G);break a}while(0);of(G);a=0;r=J;return a|0}while(0);H=k[I>>2]|0;I=H>>3;i[y>>0]=i[x+I>>0]|0;i[z>>0]=H&7;H=k[B>>2]|0;k[D>>2]=H;k[a+68>>2]=H;i[a+90>>0]=i[F+(H+-1&C)>>0]|0;i[a+91>>0]=i[F+(H+-2&C)>>0]|0;k[A>>2]=0;k[e>>2]=x;k[d>>2]=I;a=1;r=J;return a|0}function hf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;j=r;r=r+160|0;h=j+136|0;i=j+16|0;f=j+120|0;g=j;if(!(k[d>>2]|0)){i=0;r=j;return i|0};k[h>>2]=k[a>>2];k[h+4>>2]=k[a+4>>2];k[h+8>>2]=k[a+8>>2];k[h+12>>2]=k[a+12>>2];k[h+16>>2]=k[a+16>>2];df(i,h);bg(f,c,b);$f(g,e,k[d>>2]|0);k[h>>2]=k[a>>2];k[h+4>>2]=k[a+4>>2];k[h+8>>2]=k[a+8>>2];k[h+12>>2]=k[a+12>>2];k[h+16>>2]=k[a+16>>2];if(!(jf(h,f,g)|0))e=0;else{k[d>>2]=k[g+12>>2];e=1}ef(i);i=e;r=j;return i|0}function jf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+128|0;g=i+108|0;e=i+104|0;f=i;h=i+4|0;k[e>>2]=0;k[g>>2]=k[a>>2];k[g+4>>2]=k[a+4>>2];k[g+8>>2]=k[a+8>>2];k[g+12>>2]=k[a+12>>2];k[g+16>>2]=k[a+16>>2];df(h,g);while(1){if(!(kf(b,h)|0))d=1;else d=(Pb[k[(k[b>>2]|0)+8>>2]&15](b,0,g)|0)==0;k[e>>2]=0;if(!(ff(h,d,0,e,f)|0)){a=0;d=8;break}a=k[e>>2]|0;if(!a)if(d){a=1;d=8;break}else continue;else{a=(Pb[k[(k[c>>2]|0)+8>>2]&15](c,k[f>>2]|0,a)|0)^1;if(d|a){a=a&1^1;d=8;break}else continue}}if((d|0)==8){ef(h);r=i;return a|0}return 0}function kf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0;u=r;r=r+16|0;q=u+4|0;s=u;n=1<>2];k[q>>2]=0;l=Pb[k[(k[a>>2]|0)+8>>2]&15](a,n,q)|0;if(!l){t=0;r=u;return t|0}m=k[q>>2]|0;p=b+36|0;f=k[p>>2]|0;g=f+12|0;h=k[f+4>>2]&k[g>>2];j=f+8|0;c=k[j>>2]|0;if(c>>>0>h>>>0){o=f+16|0;c=c-h|0;ki((k[o>>2]|0)+((1<>2])+h)|0,l|0,(c>>>0>>0?c:m)|0)|0;c=o}else c=f+16|0;d=1<>2];e=(k[c>>2]|0)+h|0;if((h+m|0)>>>0>d>>>0){o=(k[j>>2]|0)+(d-h)|0;ki(e|0,l|0,(o>>>0>>0?o:m)|0)|0;o=(1<>2])-h|0;ki(k[c>>2]|0,l+o|0,m-o|0)|0}else ki(e|0,l|0,m|0)|0;k[g>>2]=(k[g>>2]|0)+m;o=b+32|0;k[o>>2]=(k[o>>2]|0)+m;c=k[p>>2]|0;d=k[c+12>>2]|0;if(d>>>0<=(k[c+4>>2]|0)>>>0){m=(k[c+16>>2]|0)+d|0;i[m>>0]=0;i[m+1>>0]=0;i[m+2>>0]=0}c=k[q>>2]|0;if((n|0)==(c|0)){t=n;r=u;return t|0}m=n-c|0;while(1){k[s>>2]=0;f=Pb[k[(k[a>>2]|0)+8>>2]&15](a,m,s)|0;if(!f)break;g=k[s>>2]|0;h=k[p>>2]|0;j=h+12|0;l=k[h+4>>2]&k[j>>2];b=h+8|0;c=k[b>>2]|0;if(c>>>0>l>>>0){n=h+16|0;c=c-l|0;ki((k[n>>2]|0)+((1<>2])+l)|0,f|0,(c>>>0>>0?c:g)|0)|0;c=n}else c=h+16|0;d=1<>2];e=(k[c>>2]|0)+l|0;if((l+g|0)>>>0>d>>>0){n=(k[b>>2]|0)+(d-l)|0;ki(e|0,f|0,(n>>>0>>0?n:g)|0)|0;n=(1<>2])-l|0;ki(k[c>>2]|0,f+n|0,g-n|0)|0}else ki(e|0,f|0,g|0)|0;k[j>>2]=(k[j>>2]|0)+g;k[o>>2]=(k[o>>2]|0)+g;c=k[p>>2]|0;d=k[c+12>>2]|0;if(d>>>0<=(k[c+4>>2]|0)>>>0){n=(k[c+16>>2]|0)+d|0;i[n>>0]=0;i[n+1>>0]=0;i[n+2>>0]=0}d=k[s>>2]|0;c=(k[q>>2]|0)+d|0;k[q>>2]=c;if((m|0)==(d|0)){t=23;break}else m=m-d|0}if((t|0)==23){r=u;return c|0}t=k[q>>2]|0;r=u;return t|0}function lf(a,b){a=a|0;b=b|0;var c=0,d=0;do switch(b|0){case 1:{c=og(262156)|0;gi(c|0,0,262156)|0;b=k[a>>2]|0;k[a>>2]=c;if(!b)return;rg(b);return}case 2:{d=og(524312)|0;gi(d|0,0,524312)|0;c=a+4|0;b=k[c>>2]|0;k[c>>2]=d;if(!b)return;rg(b);return}case 3:{c=og(1081356)|0;k[c+1081352>>2]=0;gi(c|0,0,32768)|0;k[c+1081344>>2]=0;k[c+1081348>>2]=0;d=a+8|0;b=k[d>>2]|0;k[d>>2]=c;if(!b)return;rg(b);return}case 4:{c=og(2129932)|0;k[c+2129928>>2]=0;gi(c|0,0,32768)|0;k[c+2129920>>2]=0;k[c+2129924>>2]=0;d=a+12|0;b=k[d>>2]|0;k[d>>2]=c;if(!b)return;rg(b);return}case 5:{c=og(8454156)|0;k[c+8454152>>2]=0;gi(c|0,0,65536)|0;k[c+8454144>>2]=0;k[c+8454148>>2]=0;d=a+16|0;b=k[d>>2]|0;k[d>>2]=c;if(!b)return;rg(b);return}case 6:{c=og(16842764)|0;k[c+16842760>>2]=0;gi(c|0,0,65536)|0;k[c+16842752>>2]=0;k[c+16842756>>2]=0;d=a+20|0;b=k[d>>2]|0;k[d>>2]=c;if(!b)return;rg(b);return}case 7:{c=og(33619980)|0;k[c+33619976>>2]=0;gi(c|0,0,65536)|0;k[c+33619968>>2]=0;k[c+33619972>>2]=0;d=a+24|0;b=k[d>>2]|0;k[d>>2]=c;if(!b)return;rg(b);return}case 8:{c=og(33619980)|0;k[c+33619976>>2]=0;gi(c|0,0,65536)|0;k[c+33619968>>2]=0;k[c+33619972>>2]=0;d=a+28|0;b=k[d>>2]|0;k[d>>2]=c;if(!b)return;rg(b);return}case 9:{c=og(33619980)|0;k[c+33619976>>2]=0;gi(c|0,0,65536)|0;k[c+33619968>>2]=0;k[c+33619972>>2]=0;d=a+32|0;b=k[d>>2]|0;k[d>>2]=c;if(!b)return;rg(b);return}default:return}while(0)}function mf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0;n=r;r=r+16|0;m=n;l=m+4|0;j=b?120:0;while(1){f=24;do{d=k[2320+(f<<2)>>2]|0;c=1<>2]|0;g=c;do{h=g;g=g+-1|0;e=g+d|0;pf(m,2520+(((e|0)/(c|0)|0)*12|0)|0,195347+((ha((e|0)%(c|0)|0,f)|0)+b)|0,f);o=i[m>>0]|0;if(((o&1)==0?(o&255)>>>1:k[l>>2]|0)>>>0>3)qf(a,m,f,e);bi(m)}while((h|0)>1);f=f+-1|0}while((f|0)>3);if((j|0)>0)j=j+-1|0;else break}r=n;return}function nf(a){a=a|0;var b=0,c=0;c=a+32|0;b=k[c>>2]|0;k[c>>2]=0;if(b)rg(b);c=a+28|0;b=k[c>>2]|0;k[c>>2]=0;if(b)rg(b);c=a+24|0;b=k[c>>2]|0;k[c>>2]=0;if(b)rg(b);c=a+20|0;b=k[c>>2]|0;k[c>>2]=0;if(b)rg(b);c=a+16|0;b=k[c>>2]|0;k[c>>2]=0;if(b)rg(b);c=a+12|0;b=k[c>>2]|0;k[c>>2]=0;if(b)rg(b);c=a+8|0;b=k[c>>2]|0;k[c>>2]=0;if(b)rg(b);c=a+4|0;b=k[c>>2]|0;k[c>>2]=0;if(b)rg(b);b=k[a>>2]|0;k[a>>2]=0;if(!b)return;rg(b);return}function of(a){a=a|0;var b=0,c=0,d=0,e=0;b=k[a+132>>2]|0;c=b;if(b){d=a+136|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~(((e+-2096-c|0)>>>0)/2096|0)*2096|0);rg(b)}b=k[a+120>>2]|0;c=b;if(b){d=a+124|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~(((e+-2832-c|0)>>>0)/2832|0)*2832|0);rg(b)}b=k[a+108>>2]|0;c=b;if(b){d=a+112|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~(((e+-1040-c|0)>>>0)/1040|0)*1040|0);rg(b)}b=k[a+96>>2]|0;c=b;if(b){d=a+100|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}b=k[a+84>>2]|0;c=b;if(b){d=a+88|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}b=k[a+72>>2]|0;c=b;if(b){d=a+76|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}b=k[a+60>>2]|0;c=b;if(b){d=a+64|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}b=k[a+44>>2]|0;c=b;if(b){d=a+48|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}b=k[a+32>>2]|0;c=b;if(b){d=a+36|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}b=k[a+16>>2]|0;c=b;if(b){d=a+20|0;e=k[d>>2]|0;if((e|0)!=(b|0))k[d>>2]=e+(~((e+-4-c|0)>>>2)<<2);rg(b)}d=k[a+4>>2]|0;if(!d)return;b=a+8|0;c=k[b>>2]|0;if((c|0)!=(d|0))k[b>>2]=c+(~((c+-4-d|0)>>>2)<<2);rg(d);return}function pf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0;p=r;r=r+48|0;m=p+24|0;j=p+12|0;o=p;n=k[b>>2]|0;ai(a,n,kh(n)|0);n=b+4|0;e=k[n>>2]|0;f=(e|0)<10?e:0;g=d-f|0;a:do if((g|0)>0){if((e|0)>11){d=e+-11|0;if((g|0)<=(d|0))break;f=c+d|0;h=c+g|0;c=h-f|0;if(c>>>0>4294967279)lg(m);if(c>>>0<11){i[m>>0]=c<<1;e=m+1|0}else{n=c+16&-16;e=og(n)|0;k[m+8>>2]=e;k[m>>2]=n|1;k[m+4>>2]=c}if((d|0)!=(g|0)){g=e;while(1){i[g>>0]=i[f>>0]|0;f=f+1|0;if((f|0)==(h|0))break;else g=g+1|0}e=e+c|0}i[e>>0]=0;n=i[m>>0]|0;j=(n&1)==0;ci(a,j?m+1|0:k[m+8>>2]|0,j?(n&255)>>>1:k[m+4>>2]|0)|0;bi(m);break}h=c+g|0;if(g>>>0<11){i[j>>0]=g<<1;e=j+1|0}else{m=g+16&-16;e=og(m)|0;k[j+8>>2]=e;k[j>>2]=m|1;k[j+4>>2]=g}if((f|0)!=(d|0)){f=c;d=e;while(1){i[d>>0]=i[f>>0]|0;f=f+1|0;if((f|0)==(h|0))break;else d=d+1|0}e=e+g|0}i[e>>0]=0;e=i[j>>0]|0;m=(e&1)==0;ci(a,m?j+1|0:k[j+8>>2]|0,m?(e&255)>>>1:k[j+4>>2]|0)|0;bi(j);e=i[a>>0]|0;if(!(e&1)){e=(e&255)>>>1;h=a+1|0}else{e=k[a+4>>2]|0;h=k[a+8>>2]|0}d=e-g|0;f=h+d|0;switch(k[n>>2]|0){case 10:{e=i[f>>0]|0;if((g|0)==1|(e&255)<192){if((e+-97&255)>=26)break a;i[f>>0]=e&255^32;break a}if((e&255)<224){n=h+(d+1)|0;i[n>>0]=(l[n>>0]|0)^32;break a}if((g|0)==2)break a;n=h+(d+2)|0;i[n>>0]=(l[n>>0]|0)^5;break a}case 11:break;default:break a}while(1){e=i[f>>0]|0;do if((g|0)==1|(e&255)<192)if((e+-97&255)<26){i[f>>0]=e&255^32;e=1}else e=1;else{if((e&255)<224){e=f+1|0;i[e>>0]=(l[e>>0]|0)^32;e=2;break}if((g|0)==2)e=2;else{e=f+2|0;i[e>>0]=(l[e>>0]|0)^5;e=3}}while(0);g=g-e|0;if((g|0)<=0)break;else f=f+e|0}}while(0);b=k[b+8>>2]|0;ai(o,b,kh(b)|0);b=i[o>>0]|0;n=(b&1)==0;ci(a,n?o+1|0:k[o+8>>2]|0,n?(b&255)>>>1:k[o+4>>2]|0)|0;bi(o);r=p;return}function qf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0;m=r;r=r+16|0;j=m;d=(d<<6)+c|0;e=rf(a,b)|0;if((e|0)!=0?(d|0)>=(k[e+20>>2]|0):0){r=m;return}c=sf(a,b)|0;k[c>>2]=d;k[j>>2]=0;d=i[b>>0]|0;c=(d&1)==0;e=b+4|0;d=c?(d&255)>>>1:k[e>>2]|0;c=c?b+1|0:k[b+8>>2]|0;if((((d|0)!=0?(f=i[c>>0]|0,k[j>>2]=f,d>>>0>1):0)?(g=(i[c+1>>0]<<8)+f|0,k[j>>2]=g,d>>>0>2):0)?(h=(i[c+2>>0]<<16)+g|0,k[j>>2]=h,d>>>0>3):0)k[j>>2]=(l[c+3>>0]<<24)+h;c=a+20|0;a=tf(c,j)|0;d=i[b>>0]|0;d=(d&1)==0?(d&255)>>>1:k[e>>2]|0;if((k[a>>2]|0)>>>0>=d>>>0){r=m;return}j=tf(c,j)|0;k[j>>2]=d;r=m;return}function rf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0;m=i[b>>0]|0;j=(m&1)==0;n=j?b+1|0:k[b+8>>2]|0;m=j?(m&255)>>>1:k[b+4>>2]|0;if(m>>>0>3){c=m;d=n;b=m;while(1){j=ha(l[d>>0]|l[d+1>>0]<<8|l[d+2>>0]<<16|l[d+3>>0]<<24,1540483477)|0;b=(ha(j>>>24^j,1540483477)|0)^(ha(b,1540483477)|0);c=c+-4|0;if(c>>>0<=3)break;else d=d+4|0}c=m+-4|0;d=c&-4;c=c-d|0;d=n+(d+4)|0}else{c=m;d=n;b=m}switch(c|0){case 3:{e=l[d+2>>0]<<16^b;h=6;break}case 2:{e=b;h=6;break}case 1:{f=b;h=7;break}default:g=b}if((h|0)==6){f=l[d+1>>0]<<8^e;h=7}if((h|0)==7)g=ha(l[d>>0]^f,1540483477)|0;b=ha(g>>>13^g,1540483477)|0;b=b>>>15^b;f=k[a+4>>2]|0;if(!f){n=0;return n|0}g=f+-1|0;c=(g&f|0)==0;if(c)j=b&g;else j=(b>>>0)%(f>>>0)|0;b=k[(k[a>>2]|0)+(j<<2)>>2]|0;if(!b){n=0;return n|0}b=k[b>>2]|0;if(!b){n=0;return n|0}h=(m|0)==0;if(c){a:while(1){if((k[b+4>>2]&g|0)!=(j|0)){b=0;h=31;break}c=b+8|0;a=i[c>>0]|0;d=(a&1)==0;b:do if(((d?(a&255)>>>1:k[b+12>>2]|0)|0)==(m|0)){c=d?c+1|0:k[b+16>>2]|0;if(!d)if(!(mh(c,n,m)|0)){h=31;break a}else break;if(h){h=31;break a}else{e=m;d=n}while(1){if((i[c>>0]|0)!=(i[d>>0]|0))break b;e=e+-1|0;if(!e){h=31;break a}else{c=c+1|0;d=d+1|0}}}while(0);b=k[b>>2]|0;if(!b){b=0;h=31;break}}if((h|0)==31)return b|0}else{c:while(1){if((((k[b+4>>2]|0)>>>0)%(f>>>0)|0|0)!=(j|0)){b=0;h=31;break}c=b+8|0;a=i[c>>0]|0;d=(a&1)==0;d:do if(((d?(a&255)>>>1:k[b+12>>2]|0)|0)==(m|0)){c=d?c+1|0:k[b+16>>2]|0;if(!d)if(!(mh(c,n,m)|0)){h=31;break c}else break;if(h){h=31;break c}else{e=m;d=n}while(1){if((i[c>>0]|0)!=(i[d>>0]|0))break d;e=e+-1|0;if(!e){h=31;break c}else{c=c+1|0;d=d+1|0}}}while(0);b=k[b>>2]|0;if(!b){b=0;h=31;break}}if((h|0)==31)return b|0}return 0}function sf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;e=r;r=r+16|0;c=e;d=rf(a,b)|0;if(d){a=d;a=a+20|0;r=e;return a|0}d=og(24)|0;$h(d+8|0,b);k[d+20>>2]=0;xf(c,a,d);a=k[c>>2]|0;a=a+20|0;r=e;return a|0}function tf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+16|0;h=i;f=k[b>>2]|0;d=k[a+4>>2]|0;a:do if(d){e=d+-1|0;c=(e&d|0)==0;if(c)g=e&f;else g=(f>>>0)%(d>>>0)|0;b=k[(k[a>>2]|0)+(g<<2)>>2]|0;if(b)if(c){do{b=k[b>>2]|0;if(!b)break a;if((k[b+4>>2]&e|0)!=(g|0))break a}while((k[b+8>>2]|0)!=(f|0));a=b+12|0;r=i;return a|0}else{do{b=k[b>>2]|0;if(!b)break a;if((((k[b+4>>2]|0)>>>0)%(d>>>0)|0|0)!=(g|0))break a}while((k[b+8>>2]|0)!=(f|0));a=b+12|0;r=i;return a|0}}while(0);g=og(16)|0;k[g+8>>2]=f;k[g+12>>2]=0;uf(h,a,g);a=k[h>>2]|0;a=a+12|0;r=i;return a|0}function uf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0.0,h=0.0,j=0,l=0,m=0,n=0,p=0,q=0,r=0;l=k[c+8>>2]|0;r=c+4|0;k[r>>2]=l;q=b+4|0;j=k[q>>2]|0;p=(j|0)==0;a:do if(!p){m=j+-1|0;n=(m&j|0)==0;if(n)e=m&l;else e=(l>>>0)%(j>>>0)|0;d=k[(k[b>>2]|0)+(e<<2)>>2]|0;if(d){while(1){d=k[d>>2]|0;if(!d)break a;f=k[d+4>>2]|0;if(n)f=f&m;else f=(f>>>0)%(j>>>0)|0;if((f|0)!=(e|0))break a;if((k[d+8>>2]|0)==(l|0)){e=0;break}}b=d;k[a>>2]=b;a=a+4|0;i[a>>0]=e;return}}else e=0;while(0);l=b+12|0;g=+(((k[l>>2]|0)+1|0)>>>0);h=+o[b+16>>2];do if(p|g>+(j>>>0)*h){if(j>>>0>2)d=(j+-1&j|0)==0;else d=0;f=(d&1|j<<1)^1;d=~~+ga(+(g/h))>>>0;vf(b,f>>>0>>0?d:f);f=k[q>>2]|0;d=k[r>>2]|0;e=f+-1|0;if(!(e&f)){j=f;e=e&d;break}else{j=f;e=(d>>>0)%(f>>>0)|0;break}}while(0);d=k[(k[b>>2]|0)+(e<<2)>>2]|0;if(!d){d=b+8|0;k[c>>2]=k[d>>2];k[d>>2]=c;k[(k[b>>2]|0)+(e<<2)>>2]=d;d=k[c>>2]|0;if(d){d=k[d+4>>2]|0;e=j+-1|0;if(!(e&j))d=d&e;else d=(d>>>0)%(j>>>0)|0;k[(k[b>>2]|0)+(d<<2)>>2]=c}}else{k[c>>2]=k[d>>2];k[d>>2]=c}k[l>>2]=(k[l>>2]|0)+1;b=1;k[a>>2]=c;a=a+4|0;i[a>>0]=b;return}function vf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;if((b|0)!=1){if(b+-1&b)b=Zh(b)|0}else b=2;e=k[a+4>>2]|0;if(b>>>0>e>>>0){wf(a,b);return}if(b>>>0>=e>>>0)return;if(e>>>0>2)d=(e+-1&e|0)==0;else d=0;c=~~+ga(+(+((k[a+12>>2]|0)>>>0)/+o[a+16>>2]))>>>0;if(d)c=1<<32-(ja(c+-1|0)|0);else c=Zh(c)|0;b=b>>>0>>0?c:b;if(b>>>0>=e>>>0)return;wf(a,b);return}function wf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;d=a+4|0;if(!b){c=k[a>>2]|0;k[a>>2]=0;if(c)rg(c);k[d>>2]=0;return}m=og(b<<2)|0;c=k[a>>2]|0;k[a>>2]=m;if(c)rg(c);k[d>>2]=b;c=0;do{k[(k[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));d=a+8|0;f=k[d>>2]|0;if(!f)return;c=k[f+4>>2]|0;l=b+-1|0;m=(l&b|0)==0;if(m)e=c&l;else e=(c>>>0)%(b>>>0)|0;k[(k[a>>2]|0)+(e<<2)>>2]=d;c=k[f>>2]|0;if(!c)return;else{g=f;d=f}a:while(1){j=g;i=d;b:while(1){while(1){d=k[c+4>>2]|0;if(m)h=d&l;else h=(d>>>0)%(b>>>0)|0;if((h|0)==(e|0)){d=c;break}d=(k[a>>2]|0)+(h<<2)|0;if(!(k[d>>2]|0)){e=h;f=c;c=i;break b}g=c+8|0;d=c;while(1){f=k[d>>2]|0;if(!f)break;if((k[g>>2]|0)==(k[f+8>>2]|0))d=f;else break}k[i>>2]=f;k[d>>2]=k[k[(k[a>>2]|0)+(h<<2)>>2]>>2];k[k[(k[a>>2]|0)+(h<<2)>>2]>>2]=c;c=k[j>>2]|0;if(!c){c=27;break a}}c=k[d>>2]|0;if(!c){c=27;break a}else{j=d;i=d}}k[d>>2]=c;c=k[f>>2]|0;if(!c){c=27;break}else{g=f;d=f}}if((c|0)==27)return}function xf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0.0,j=0.0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;w=c+8|0;v=i[w>>0]|0;u=(v&1)==0;w=u?w+1|0:k[c+16>>2]|0;v=u?(v&255)>>>1:k[c+12>>2]|0;if(v>>>0>3){f=v;g=w;e=v;while(1){u=ha(l[g>>0]|l[g+1>>0]<<8|l[g+2>>0]<<16|l[g+3>>0]<<24,1540483477)|0;e=(ha(u>>>24^u,1540483477)|0)^(ha(e,1540483477)|0);f=f+-4|0;if(f>>>0<=3)break;else g=g+4|0}f=v+-4|0;g=f&-4;f=f-g|0;g=w+(g+4)|0}else{f=v;g=w;e=v}switch(f|0){case 3:{e=l[g+2>>0]<<16^e;m=6;break}case 2:{m=6;break}case 1:{m=7;break}default:{}}if((m|0)==6){e=l[g+1>>0]<<8^e;m=7}if((m|0)==7)e=ha(l[g>>0]^e,1540483477)|0;e=ha(e>>>13^e,1540483477)|0;e=e>>>15^e;u=c+4|0;k[u>>2]=e;t=b+4|0;g=k[t>>2]|0;s=(g|0)==0;a:do if(!s){q=g+-1|0;r=(q&g|0)==0;if(r)e=e&q;else e=(e>>>0)%(g>>>0)|0;f=k[(k[b>>2]|0)+(e<<2)>>2]|0;if((f|0)!=0?(d=k[f>>2]|0,(d|0)!=0):0){p=(v|0)==0;b:while(1){f=k[d+4>>2]|0;if(r)f=f&q;else f=(f>>>0)%(g>>>0)|0;if((f|0)!=(e|0))break a;f=d+8|0;n=i[f>>0]|0;m=(n&1)==0;c:do if(((m?(n&255)>>>1:k[d+12>>2]|0)|0)==(v|0)){f=m?f+1|0:k[d+16>>2]|0;if(!m)if(!(mh(f,w,v)|0)){e=0;m=40;break b}else break;if(p){e=0;m=40;break b}else{n=v;m=w}while(1){if((i[f>>0]|0)!=(i[m>>0]|0))break c;n=n+-1|0;if(!n){e=0;m=40;break b}else{f=f+1|0;m=m+1|0}}}while(0);d=k[d>>2]|0;if(!d)break a}if((m|0)==40){b=d;k[a>>2]=b;a=a+4|0;i[a>>0]=e;return}}}else e=0;while(0);m=b+12|0;h=+(((k[m>>2]|0)+1|0)>>>0);j=+o[b+16>>2];do if(s|h>+(g>>>0)*j){if(g>>>0>2)d=(g+-1&g|0)==0;else d=0;f=(d&1|g<<1)^1;d=~~+ga(+(h/j))>>>0;yf(b,f>>>0>>0?d:f);f=k[t>>2]|0;d=k[u>>2]|0;e=f+-1|0;if(!(e&f)){g=f;e=e&d;break}else{g=f;e=(d>>>0)%(f>>>0)|0;break}}while(0);d=k[(k[b>>2]|0)+(e<<2)>>2]|0;if(!d){d=b+8|0;k[c>>2]=k[d>>2];k[d>>2]=c;k[(k[b>>2]|0)+(e<<2)>>2]=d;d=k[c>>2]|0;if(d){d=k[d+4>>2]|0;e=g+-1|0;if(!(e&g))d=d&e;else d=(d>>>0)%(g>>>0)|0;k[(k[b>>2]|0)+(d<<2)>>2]=c}}else{k[c>>2]=k[d>>2];k[d>>2]=c}k[m>>2]=(k[m>>2]|0)+1;b=1;k[a>>2]=c;a=a+4|0;i[a>>0]=b;return}function yf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;if((b|0)!=1){if(b+-1&b)b=Zh(b)|0}else b=2;e=k[a+4>>2]|0;if(b>>>0>e>>>0){zf(a,b);return}if(b>>>0>=e>>>0)return;if(e>>>0>2)d=(e+-1&e|0)==0;else d=0;c=~~+ga(+(+((k[a+12>>2]|0)>>>0)/+o[a+16>>2]))>>>0;if(d)c=1<<32-(ja(c+-1|0)|0);else c=Zh(c)|0;b=b>>>0>>0?c:b;if(b>>>0>=e>>>0)return;zf(a,b);return}function zf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=a+4|0;if(!b){c=k[a>>2]|0;k[a>>2]=0;if(c)rg(c);k[d>>2]=0;return}t=og(b<<2)|0;c=k[a>>2]|0;k[a>>2]=t;if(c)rg(c);k[d>>2]=b;c=0;do{k[(k[a>>2]|0)+(c<<2)>>2]=0;c=c+1|0}while((c|0)!=(b|0));d=a+8|0;f=k[d>>2]|0;if(!f)return;c=k[f+4>>2]|0;s=b+-1|0;t=(s&b|0)==0;if(t)e=c&s;else e=(c>>>0)%(b>>>0)|0;k[(k[a>>2]|0)+(e<<2)>>2]=d;c=k[f>>2]|0;if(!c)return;else{g=f;d=f}a:while(1){r=d;b:while(1){while(1){d=k[c+4>>2]|0;if(t)q=d&s;else q=(d>>>0)%(b>>>0)|0;if((q|0)==(e|0)){d=c;break}d=(k[a>>2]|0)+(q<<2)|0;if(!(k[d>>2]|0)){e=q;f=c;c=r;break b}d=k[c>>2]|0;c:do if(!d)d=c;else{n=c+8|0;p=i[n>>0]|0;m=(p&1)==0;p=m?(p&255)>>>1:k[c+12>>2]|0;l=c+16|0;n=n+1|0;o=(p|0)==0;if(m)m=c;else{j=c;while(1){f=d+8|0;o=i[f>>0]|0;h=(o&1)==0;if((p|0)!=((h?(o&255)>>>1:k[d+12>>2]|0)|0)){d=j;break c}if(mh(k[l>>2]|0,h?f+1|0:k[d+16>>2]|0,p)|0){d=j;break c}f=k[d>>2]|0;if(!f)break c;else{j=d;d=f}}}while(1){f=d+8|0;l=i[f>>0]|0;h=(l&1)==0;if((p|0)!=((h?(l&255)>>>1:k[d+12>>2]|0)|0)){d=m;break c}if(!o){j=p;l=n;f=h?f+1|0:k[d+16>>2]|0;while(1){if((i[l>>0]|0)!=(i[f>>0]|0)){d=m;break c}j=j+-1|0;if(!j)break;else{l=l+1|0;f=f+1|0}}}f=k[d>>2]|0;if(!f)break;else{m=d;d=f}}}while(0);k[r>>2]=k[d>>2];k[d>>2]=k[k[(k[a>>2]|0)+(q<<2)>>2]>>2];k[k[(k[a>>2]|0)+(q<<2)>>2]>>2]=c;c=k[g>>2]|0;if(!c){c=35;break a}}c=k[d>>2]|0;if(!c){c=35;break a}else{g=d;r=d}}k[d>>2]=c;c=k[f>>2]|0;if(!c){c=35;break}else{g=f;d=f}}if((c|0)==35)return}function Af(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=r;r=r+32|0;v=I+16|0;D=I+12|0;F=I;G=F+4|0;w=F+8|0;x=b<<1|1;u=F+8|0;y=x<<3;z=(b|0)>0;A=d+b|0;B=d+1|0;E=b>>>0<2;C=1;a:while(1){k[D>>2]=C;k[F>>2]=0;k[G>>2]=0;k[w>>2]=0;e=og(y)|0;k[F>>2]=e;k[G>>2]=e;k[u>>2]=e+(x<<3);if(z){q=b;do{s=q;q=q+-1|0;e=a+(q<<2)|0;f=k[e>>2]|0;do if(f){n=k[((f|0)<(C|0)?D:e)>>2]|0;e=k[G>>2]|0;f=k[u>>2]|0;if(e>>>0>>0){p=hi(q|0,0,48)|0;t=e;k[t>>2]=p|n;k[t+4>>2]=L|65535;k[G>>2]=(k[G>>2]|0)+8;break}p=k[F>>2]|0;o=p;g=(e-o>>3)+1|0;if(g>>>0>536870911){H=8;break a}h=p;e=f-h|0;if(e>>3>>>0<268435455){e=e>>2;e=e>>>0>>0?g:e;g=(k[G>>2]|0)-h|0;f=g>>3;if(!e){m=0;h=0;e=g}else H=12}else{g=(k[G>>2]|0)-h|0;e=536870911;f=g>>3;H=12}if((H|0)==12){H=0;m=e;h=og(e<<3)|0;e=g}g=hi(q|0,0,48)|0;t=h+(f<<3)|0;k[t>>2]=g|n;k[t+4>>2]=L|65535;ki(h|0,p|0,e|0)|0;k[F>>2]=h;k[G>>2]=h+(f+1<<3);k[u>>2]=h+(m<<3);if(o)rg(o)}while(0)}while((s|0)>1);f=k[G>>2]|0;e=k[F>>2]|0}else f=e;t=f-e|0;p=t>>3;if((p|0)==1){H=17;break}k[v>>2]=1;if((t|0)>1024){g=p;while(1){h=pg(g<<3,320895)|0;if(h){H=23;break}if((g|0)>1)g=(g|0)/2|0;else{h=0;g=0;break}}if((H|0)==23)H=0;m=h}else{m=0;g=0;h=0}Hf(e,f,v,p,m,g);if(h)rg(h);e=k[G>>2]|0;if((e|0)==(k[u>>2]|0)){o=k[F>>2]|0;n=o;f=(e-n>>3)+1|0;if(f>>>0>536870911){H=31;break}g=o;e=e-g|0;if(e>>3>>>0<268435455){e=e>>2;e=e>>>0>>0?f:e;f=(k[G>>2]|0)-g|0;g=f>>3;if(!e){m=0;h=0}else H=35}else{f=(k[G>>2]|0)-g|0;e=536870911;g=f>>3;H=35}if((H|0)==35){H=0;m=e;h=og(e<<3)|0}e=h+(g<<3)|0;k[e>>2]=2147483647;k[e+4>>2]=-1;e=h+(g+1<<3)|0;ki(h|0,o|0,f|0)|0;k[F>>2]=h;k[G>>2]=e;k[u>>2]=h+(m<<3);if(n){rg(n);e=k[G>>2]|0}}else{k[e>>2]=2147483647;k[e+4>>2]=-1;e=(k[G>>2]|0)+8|0;k[G>>2]=e}if((e|0)==(k[u>>2]|0)){o=k[F>>2]|0;n=o;f=(e-n>>3)+1|0;if(f>>>0>536870911){H=41;break}g=o;e=e-g|0;if(e>>3>>>0<268435455){e=e>>2;e=e>>>0>>0?f:e;g=(k[G>>2]|0)-g|0;f=g>>3;if(!e){m=0;h=0;e=g}else H=45}else{g=(k[G>>2]|0)-g|0;e=536870911;f=g>>3;H=45}if((H|0)==45){H=0;m=e;h=og(e<<3)|0;e=g}s=h+(f<<3)|0;k[s>>2]=2147483647;k[s+4>>2]=-1;ki(h|0,o|0,e|0)|0;k[F>>2]=h;k[G>>2]=h+(f+1<<3);k[u>>2]=h+(m<<3);if(n)rg(n)}else{s=e;k[s>>2]=2147483647;k[s+4>>2]=-1;k[G>>2]=(k[G>>2]|0)+8}if((t|0)>8){q=0;s=p+1|0;o=p;do{o=o+-1|0;p=k[F>>2]|0;f=(k[p+(q<<3)>>2]|0)>(k[p+(s<<3)>>2]|0);g=f&1;h=(g^1)+q|0;g=g+s|0;f=f?s:q;n=(k[p+(h<<3)>>2]|0)>(k[p+(g<<3)>>2]|0);e=n&1;q=(e^1)+h|0;s=e+g|0;h=n?g:h;g=k[G>>2]|0;n=p;e=g-n>>3;m=e+-1|0;k[p+(m<<3)>>2]=(k[p+(h<<3)>>2]|0)+(k[p+(f<<3)>>2]|0);j[p+(m<<3)+4>>1]=f;j[p+(m<<3)+6>>1]=h;if((g|0)==(k[u>>2]|0)){f=e+1|0;if(f>>>0>536870911){H=54;break a}h=p;e=g-h|0;if(e>>3>>>0<268435455){e=e>>2;e=e>>>0>>0?f:e;g=(k[G>>2]|0)-h|0;f=g>>3;if(!e){m=0;h=0;e=g}else H=58}else{g=(k[G>>2]|0)-h|0;e=536870911;f=g>>3;H=58}if((H|0)==58){H=0;m=e;h=og(e<<3)|0;e=g}g=h+(f<<3)|0;k[g>>2]=2147483647;k[g+4>>2]=-1;ki(h|0,p|0,e|0)|0;k[F>>2]=h;k[G>>2]=h+(f+1<<3);k[u>>2]=h+(m<<3);if(n)rg(n)}else{p=g;k[p>>2]=2147483647;k[p+4>>2]=-1;k[G>>2]=(k[G>>2]|0)+8}}while((o|0)>1)}s=k[F>>2]|0;If(s+((t>>2)+-1<<3)|0,s,d,0);if(E)e=d;else{e=d;f=B;do{e=(l[e>>0]|0)<(l[f>>0]|0)?f:e;f=f+1|0}while((f|0)!=(A|0))}e=(l[e>>0]|0)>(c|0);f=k[F>>2]|0;g=f;if(f){h=k[G>>2]|0;if((h|0)!=(f|0))k[G>>2]=h+(~((h+-8-g|0)>>>3)<<3);rg(f)}if(e)C=C<<1;else{H=68;break}}if((H|0)==8)mg(F);else if((H|0)==17){i[d+(j[e+6>>1]|0)>>0]=1;if(!e){r=I;return}if((f|0)!=(e|0))k[G>>2]=f+(~((f+-8-e|0)>>>3)<<3);rg(e);r=I;return}else if((H|0)==31)mg(F);else if((H|0)==41)mg(F);else if((H|0)==54)mg(F);else if((H|0)==68){r=I;return}}function Bf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((a|0)!=(b|0)){o=b&255;q=d+4|0;a=k[q>>2]|0;r=d+8|0;j=k[r>>2]|0;if(a>>>0>=j>>>0){s=k[d>>2]|0;p=s;h=a-p+1|0;if((h|0)<0)mg(d);n=s;a=j-n|0;if(a>>>0<1073741823){a=a<<1;a=a>>>0>>0?h:a;j=k[q>>2]|0;h=j-n|0;if(!a){m=0;l=0;a=j}else w=9}else{h=k[q>>2]|0;a=2147483647;j=h;h=h-n|0;w=9}if((w|0)==9){m=a;l=og(a)|0;a=j}i[l+h>>0]=o;t=a-n|0;u=l+(h-t)|0;ki(u|0,s|0,t|0)|0;k[d>>2]=u;k[q>>2]=l+(h+1);k[r>>2]=l+m;if(p)rg(p)}else{i[a>>0]=o;k[q>>2]=(k[q>>2]|0)+1}o=e+4|0;a=k[o>>2]|0;p=e+8|0;h=k[p>>2]|0;if(a>>>0>=h>>>0){q=k[e>>2]|0;r=q;j=a-r+1|0;if((j|0)<0)mg(e);n=q;a=h-n|0;if(a>>>0<1073741823){a=a<<1;a=a>>>0>>0?j:a;j=k[o>>2]|0;h=j-n|0;if(!a){m=0;l=0;a=j}else w=19}else{h=k[o>>2]|0;a=2147483647;j=h;h=h-n|0;w=19}if((w|0)==19){m=a;l=og(a)|0;a=j}i[l+h>>0]=0;t=a-n|0;u=l+(h-t)|0;ki(u|0,q|0,t|0)|0;k[e>>2]=u;k[o>>2]=l+(h+1);k[p>>2]=l+m;if(r)rg(r)}else{i[a>>0]=0;k[o>>2]=(k[o>>2]|0)+1}c=c+-1|0}do if((c|0)==7){o=b&255;p=d+4|0;a=k[p>>2]|0;q=d+8|0;j=k[q>>2]|0;if(a>>>0>=j>>>0){r=k[d>>2]|0;s=r;h=a-s+1|0;if((h|0)<0)mg(d);n=r;a=j-n|0;if(a>>>0<1073741823){a=a<<1;a=a>>>0>>0?h:a;j=k[p>>2]|0;h=j-n|0;if(!a){m=0;l=0;a=j}else w=31}else{h=k[p>>2]|0;a=2147483647;j=h;h=h-n|0;w=31}if((w|0)==31){m=a;l=og(a)|0;a=j}i[l+h>>0]=o;c=a-n|0;v=l+(h-c)|0;ki(v|0,r|0,c|0)|0;k[d>>2]=v;k[p>>2]=l+(h+1);k[q>>2]=l+m;if(s)rg(s)}else{i[a>>0]=o;k[p>>2]=(k[p>>2]|0)+1}o=e+4|0;a=k[o>>2]|0;p=e+8|0;h=k[p>>2]|0;if(a>>>0>>0){i[a>>0]=0;k[o>>2]=(k[o>>2]|0)+1;v=6;break}q=k[e>>2]|0;r=q;j=a-r+1|0;if((j|0)<0)mg(e);n=q;a=h-n|0;if(a>>>0<1073741823){a=a<<1;a=a>>>0>>0?j:a;j=k[o>>2]|0;h=j-n|0;if(!a){m=0;l=0;a=j}else w=41}else{h=k[o>>2]|0;a=2147483647;j=h;h=h-n|0;w=41}if((w|0)==41){m=a;l=og(a)|0;a=j}i[l+h>>0]=0;c=a-n|0;v=l+(h-c)|0;ki(v|0,q|0,c|0)|0;k[e>>2]=v;k[o>>2]=l+(h+1);k[p>>2]=l+m;if(!r)v=6;else{rg(r);v=6}}else if((c|0)<3){if((c|0)<=0)return;q=b&255;r=d+4|0;s=d+8|0;b=e+4|0;t=e+8|0;u=0;while(1){a=k[r>>2]|0;h=k[s>>2]|0;if(a>>>0>=h>>>0){o=k[d>>2]|0;p=o;j=a-p+1|0;if((j|0)<0){w=50;break}n=o;a=h-n|0;if(a>>>0<1073741823){a=a<<1;a=a>>>0>>0?j:a;j=k[r>>2]|0;h=j-n|0;if(!a){m=0;l=0;a=j}else w=54}else{h=k[r>>2]|0;a=2147483647;j=h;h=h-n|0;w=54}if((w|0)==54){w=0;m=a;l=og(a)|0;a=j}i[l+h>>0]=q;j=a-n|0;n=l+(h-j)|0;ki(n|0,o|0,j|0)|0;k[d>>2]=n;k[r>>2]=l+(h+1);k[s>>2]=l+m;if(p)rg(p)}else{i[a>>0]=q;k[r>>2]=(k[r>>2]|0)+1}a=k[b>>2]|0;h=k[t>>2]|0;if(a>>>0>=h>>>0){o=k[e>>2]|0;p=o;j=a-p+1|0;if((j|0)<0){w=60;break}n=o;a=h-n|0;if(a>>>0<1073741823){a=a<<1;a=a>>>0>>0?j:a;j=k[b>>2]|0;h=j-n|0;if(!a){m=0;l=0;a=j}else w=64}else{h=k[b>>2]|0;a=2147483647;j=h;h=h-n|0;w=64}if((w|0)==64){w=0;m=a;l=og(a)|0;a=j}i[l+h>>0]=0;j=a-n|0;n=l+(h-j)|0;ki(n|0,o|0,j|0)|0;k[e>>2]=n;k[b>>2]=l+(h+1);k[t>>2]=l+m;if(p)rg(p)}else{i[a>>0]=0;k[b>>2]=(k[b>>2]|0)+1}u=u+1|0;if((u|0)==(c|0)){w=99;break}}if((w|0)==50)mg(d);else if((w|0)==60)mg(e);else if((w|0)==99)return}else v=c;while(0);j=v+-3|0;c=d+4|0;l=k[c>>2]|0;h=k[d>>2]|0;a=l-h|0;do if((j|0)>-1){b=d+8|0;t=e+4|0;u=e+8|0;while(1){h=k[b>>2]|0;if(l>>>0>=h>>>0){q=k[d>>2]|0;r=q;l=l-r+1|0;if((l|0)<0){w=73;break}p=q;h=h-p|0;if(h>>>0<1073741823){h=h<<1;h=h>>>0>>0?l:h;m=k[c>>2]|0;l=m-p|0;if(!h){o=0;n=0;h=m}else w=77}else{l=k[c>>2]|0;h=2147483647;m=l;l=l-p|0;w=77}if((w|0)==77){w=0;o=h;n=og(h)|0;h=m}i[n+l>>0]=16;s=h-p|0;v=n+(l-s)|0;ki(v|0,q|0,s|0)|0;k[d>>2]=v;k[c>>2]=n+(l+1);k[b>>2]=n+o;if(r)rg(r)}else{i[l>>0]=16;k[c>>2]=(k[c>>2]|0)+1}q=j&3;h=k[t>>2]|0;l=k[u>>2]|0;if(h>>>0>=l>>>0){r=k[e>>2]|0;s=r;m=h-s+1|0;if((m|0)<0){w=83;break}p=r;h=l-p|0;if(h>>>0<1073741823){h=h<<1;h=h>>>0>>0?m:h;m=k[t>>2]|0;l=m-p|0;if(!h){o=0;n=0;h=m}else w=87}else{l=k[t>>2]|0;h=2147483647;m=l;l=l-p|0;w=87}if((w|0)==87){w=0;o=h;n=og(h)|0;h=m}i[n+l>>0]=q;q=h-p|0;v=n+(l-q)|0;ki(v|0,r|0,q|0)|0;k[e>>2]=v;k[t>>2]=n+(l+1);k[u>>2]=n+o;if(s)rg(s)}else{i[h>>0]=q;k[t>>2]=(k[t>>2]|0)+1}h=j>>2;l=k[c>>2]|0;if((h|0)>0)j=h+-1|0;else{f=l;w=91;break}}if((w|0)==73)mg(d);else if((w|0)==83)mg(e);else if((w|0)==91){g=f;f=k[d>>2]|0;break}}else{g=l;f=h}while(0);j=g-f|0;h=j+-1|0;if((h|0)>(a|0)){w=f+a|0;g=i[w>>0]|0;i[w>>0]=i[f+h>>0]|0;i[(k[d>>2]|0)+h>>0]=g;g=a+1|0;f=j+-2|0;if((g|0)<(f|0))do{u=k[d>>2]|0;v=u+g|0;w=i[v>>0]|0;i[v>>0]=i[u+f>>0]|0;i[(k[d>>2]|0)+f>>0]=w;g=g+1|0;f=f+-1|0}while((g|0)<(f|0));g=k[c>>2]|0;f=k[d>>2]|0}f=g-f+-1|0;if((f|0)<=(a|0))return;do{v=k[e>>2]|0;w=v+a|0;d=i[w>>0]|0;i[w>>0]=i[v+f>>0]|0;i[(k[e>>2]|0)+f>>0]=d;a=a+1|0;f=f+-1|0}while((a|0)<(f|0));return}function Cf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;do if((a|0)==11){n=b+4|0;e=k[n>>2]|0;p=b+8|0;h=k[p>>2]|0;if(e>>>0>=h>>>0){q=k[b>>2]|0;o=q;g=e-o+1|0;if((g|0)<0)mg(b);m=q;e=h-m|0;if(e>>>0<1073741823){e=e<<1;e=e>>>0>>0?g:e;h=k[n>>2]|0;g=h-m|0;if(!e){l=0;j=0;e=h}else v=9}else{g=k[n>>2]|0;e=2147483647;h=g;g=g-m|0;v=9}if((v|0)==9){l=e;j=og(e)|0;e=h}i[j+g>>0]=0;u=e-m|0;a=j+(g-u)|0;ki(a|0,q|0,u|0)|0;k[b>>2]=a;k[n>>2]=j+(g+1);k[p>>2]=j+l;if(o)rg(o)}else{i[e>>0]=0;k[n>>2]=(k[n>>2]|0)+1}n=c+4|0;e=k[n>>2]|0;o=c+8|0;g=k[o>>2]|0;if(e>>>0>>0){i[e>>0]=0;k[n>>2]=(k[n>>2]|0)+1;p=10;break}p=k[c>>2]|0;q=p;h=e-q+1|0;if((h|0)<0)mg(c);m=p;e=g-m|0;if(e>>>0<1073741823){e=e<<1;e=e>>>0>>0?h:e;h=k[n>>2]|0;g=h-m|0;if(!e){l=0;j=0;e=h}else v=19}else{g=k[n>>2]|0;e=2147483647;h=g;g=g-m|0;v=19}if((v|0)==19){l=e;j=og(e)|0;e=h}i[j+g>>0]=0;u=e-m|0;a=j+(g-u)|0;ki(a|0,p|0,u|0)|0;k[c>>2]=a;k[n>>2]=j+(g+1);k[o>>2]=j+l;if(!q)p=10;else{rg(q);p=10}}else if((a|0)<3){if((a|0)<=0)return;q=b+4|0;r=b+8|0;s=c+4|0;t=c+8|0;u=0;while(1){e=k[q>>2]|0;h=k[r>>2]|0;if(e>>>0>=h>>>0){n=k[b>>2]|0;o=n;g=e-o+1|0;if((g|0)<0){v=28;break}m=n;e=h-m|0;if(e>>>0<1073741823){e=e<<1;e=e>>>0>>0?g:e;h=k[q>>2]|0;g=h-m|0;if(!e){l=0;j=0;e=h}else v=32}else{g=k[q>>2]|0;e=2147483647;h=g;g=g-m|0;v=32}if((v|0)==32){v=0;l=e;j=og(e)|0;e=h}i[j+g>>0]=0;h=e-m|0;m=j+(g-h)|0;ki(m|0,n|0,h|0)|0;k[b>>2]=m;k[q>>2]=j+(g+1);k[r>>2]=j+l;if(o)rg(o)}else{i[e>>0]=0;k[q>>2]=(k[q>>2]|0)+1}e=k[s>>2]|0;g=k[t>>2]|0;if(e>>>0>=g>>>0){n=k[c>>2]|0;o=n;h=e-o+1|0;if((h|0)<0){v=38;break}m=n;e=g-m|0;if(e>>>0<1073741823){e=e<<1;e=e>>>0>>0?h:e;h=k[s>>2]|0;g=h-m|0;if(!e){l=0;j=0;e=h}else v=42}else{g=k[s>>2]|0;e=2147483647;h=g;g=g-m|0;v=42}if((v|0)==42){v=0;l=e;j=og(e)|0;e=h}i[j+g>>0]=0;h=e-m|0;m=j+(g-h)|0;ki(m|0,n|0,h|0)|0;k[c>>2]=m;k[s>>2]=j+(g+1);k[t>>2]=j+l;if(o)rg(o)}else{i[e>>0]=0;k[s>>2]=(k[s>>2]|0)+1}u=u+1|0;if((u|0)==(a|0)){v=77;break}}if((v|0)==28)mg(b);else if((v|0)==38)mg(c);else if((v|0)==77)return}else p=a;while(0);h=p+-3|0;a=b+4|0;j=k[a>>2]|0;g=k[b>>2]|0;e=j-g|0;do if((h|0)>-1){s=b+8|0;t=c+4|0;u=c+8|0;while(1){g=k[s>>2]|0;if(j>>>0>=g>>>0){p=k[b>>2]|0;q=p;j=j-q+1|0;if((j|0)<0){v=51;break}o=p;g=g-o|0;if(g>>>0<1073741823){g=g<<1;g=g>>>0>>0?j:g;l=k[a>>2]|0;j=l-o|0;if(!g){n=0;m=0;g=l}else v=55}else{j=k[a>>2]|0;g=2147483647;l=j;j=j-o|0;v=55}if((v|0)==55){v=0;n=g;m=og(g)|0;g=l}i[m+j>>0]=17;o=g-o|0;r=m+(j-o)|0;ki(r|0,p|0,o|0)|0;k[b>>2]=r;k[a>>2]=m+(j+1);k[s>>2]=m+n;if(q)rg(q)}else{i[j>>0]=17;k[a>>2]=(k[a>>2]|0)+1}p=h&7;g=k[t>>2]|0;j=k[u>>2]|0;if(g>>>0>=j>>>0){q=k[c>>2]|0;r=q;l=g-r+1|0;if((l|0)<0){v=61;break}o=q;g=j-o|0;if(g>>>0<1073741823){g=g<<1;g=g>>>0>>0?l:g;l=k[t>>2]|0;j=l-o|0;if(!g){n=0;m=0;g=l}else v=65}else{j=k[t>>2]|0;g=2147483647;l=j;j=j-o|0;v=65}if((v|0)==65){v=0;n=g;m=og(g)|0;g=l}i[m+j>>0]=p;o=g-o|0;p=m+(j-o)|0;ki(p|0,q|0,o|0)|0;k[c>>2]=p;k[t>>2]=m+(j+1);k[u>>2]=m+n;if(r)rg(r)}else{i[g>>0]=p;k[t>>2]=(k[t>>2]|0)+1}g=h>>3;j=k[a>>2]|0;if((g|0)>0)h=g+-1|0;else{d=j;v=69;break}}if((v|0)==51)mg(b);else if((v|0)==61)mg(c);else if((v|0)==69){f=d;d=k[b>>2]|0;break}}else{f=j;d=g}while(0);h=f-d|0;g=h+-1|0;if((g|0)>(e|0)){v=d+e|0;f=i[v>>0]|0;i[v>>0]=i[d+g>>0]|0;i[(k[b>>2]|0)+g>>0]=f;f=e+1|0;d=h+-2|0;if((f|0)<(d|0))do{t=k[b>>2]|0;u=t+f|0;v=i[u>>0]|0;i[u>>0]=i[t+d>>0]|0;i[(k[b>>2]|0)+d>>0]=v;f=f+1|0;d=d+-1|0}while((f|0)<(d|0));f=k[a>>2]|0;d=k[b>>2]|0}d=f-d+-1|0;if((d|0)<=(e|0))return;do{a=k[c>>2]|0;v=a+e|0;b=i[v>>0]|0;i[v>>0]=i[a+d>>0]|0;i[(k[c>>2]|0)+d>>0]=b;e=e+1|0;d=d+-1|0}while((e|0)<(d|0));return}function Df(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0;if((a|0)>0){d=0;c=0}else{o=1;return o|0}do{c=((k[b+(d<<2)>>2]|0)!=0&1)+c|0;d=d+1|0}while((d|0)!=(a|0));if((c|0)<16){o=1;return o|0}else c=a;while(1){a=(c|0)>-1;if((c|0)==0|a^1){c=1;o=55;break}d=c+-1|0;if(!(k[b+(d<<2)>>2]|0))c=d;else break}if((o|0)==55)return c|0;if((c|0)>0){g=0;e=0;d=1073741824}else{o=1;return o|0}do{f=k[b+(g<<2)>>2]|0;if(f){e=e+1|0;d=(d|0)>(f|0)?f:d}g=g+1|0}while((g|0)!=(c|0));if((e|0)<5){o=1;return o|0}if((d|0)<4&(c-e|0)<6?(h=c+-1|0,(h|0)>1):0){d=1;do{if(((k[b+(d+-1<<2)>>2]|0)!=0?(j=b+(d<<2)|0,(k[j>>2]|0)==0):0)?(k[b+(d+1<<2)>>2]|0)!=0:0)k[j>>2]=1;d=d+1|0}while((d|0)!=(h|0))}if((e|0)<28){o=1;return o|0}l=Qh(c,1)|0;if(!l){o=0;return o|0}m=c+1|0;if(a){j=0;d=0;e=k[b>>2]|0;do{f=(j|0)==(c|0);if(!f?(k[b+(j<<2)>>2]|0)==(e|0):0)d=d+1|0;else{if((e|0)==0&(d|0)>4){if((d|0)>0)o=27}else if((d|0)>6&(e|0)!=0)o=27;if((o|0)==27){o=0;g=j+-1|0;h=0;do{i[l+(g-h)>>0]=1;h=h+1|0}while((h|0)!=(d|0))}if(f)d=1;else{d=1;e=k[b+(j<<2)>>2]|0}}j=j+1|0}while((j|0)<(m|0));if(a){g=c+-2|0;h=0;d=(((k[b+4>>2]|0)+(k[b>>2]|0)+(k[b+8>>2]|0)<<8|0)/3|0)+420|0;j=0;a=0;do{f=(h|0)==(c|0);do if(!f?(i[l+h>>0]|0)==0:0){if((h|0)!=0?(i[l+(h+-1)>>0]|0)!=0:0){o=40;break}e=(k[b+(h<<2)>>2]<<8)-d|0;if((((e|0)>-1?e:0-e|0)|0)<=1239)e=j;else o=40}else o=40;while(0);do if((o|0)==40){o=0;if(!((j|0)<=3?!((j|0)>2&(a|0)==0):0))o=42;if((o|0)==42?(o=0,n=(((j|0)/2|0)+a|0)/(j|0)|0,n=(a|0)==0?0:(n|0)<1?1:n,(j|0)>0):0){d=h+-1|0;a=0;do{k[b+(d-a<<2)>>2]=n;a=a+1|0}while((a|0)!=(j|0))}if((h|0)<(g|0)){d=(((k[b+(h+1<<2)>>2]|0)+(k[b+(h<<2)>>2]|0)+(k[b+(h+2<<2)>>2]|0)<<8|0)/3|0)+420|0;e=0;a=0;break}if((h|0)<(c|0)){d=k[b+(h<<2)>>2]<<8;e=0;a=0}else{d=0;e=0;a=0}}while(0);j=e+1|0;if(!f){a=(k[b+(h<<2)>>2]|0)+a|0;if((e|0)>2)d=(((j|0)/2|0)+(a<<8)|0)/(j|0)|0;d=(j|0)==4?d+120|0:d}h=h+1|0}while((h|0)<(m|0))}}Ph(l);o=1;return o|0}function Ef(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;if(!b)return;f=b+-1|0;g=0;e=b;do{if(i[a+(f-g)>>0]|0)break;e=e+-1|0;g=g+1|0}while(g>>>0>>0);if(b>>>0>50){if(!e){b=0;h=0;e=0;f=0;g=0}else{b=0;h=0;m=0;f=0;g=0;do{l=i[a+m>>0]|0;j=m+1|0;a:do if(j>>>0>>0){k=1;do{if((i[a+j>>0]|0)!=l<<24>>24)break a;k=k+1|0;j=j+1|0}while(j>>>0>>0)}else k=1;while(0);j=l<<24>>24==0&(k|0)>2;h=(j&1)+h|0;g=(j?k:0)+g|0;l=l<<24>>24!=0&(k|0)>3;f=(l?k:0)+f|0;b=(l&1)+b|0;m=k+m|0}while(m>>>0>>0);b=b<<1;h=h<<1}b=(f-b|0)>2&1;f=(g-h|0)>2&1;m=e}else{b=0;f=0;m=e}if(!m)return;l=f<<24>>24==0;if(!(b<<24>>24)){k=0;j=8;while(1){g=i[a+k>>0]|0;e=g&255;h=g<<24>>24==0;b:do if(!(l|g<<24>>24!=0)?(n=k+1|0,n>>>0>>0):0){b=n;f=1;do{if((i[a+b>>0]|0)!=g<<24>>24)break b;f=f+1|0;b=b+1|0}while(b>>>0>>0)}else f=1;while(0);if(h){Cf(f,c,d);e=j}else Bf(j,e,f,c,d);k=f+k|0;if(k>>>0>=m>>>0)break;else j=e}return}if(l){k=0;j=8}else{k=0;j=8;while(1){b=i[a+k>>0]|0;e=b&255;h=b<<24>>24==0;f=k+1|0;c:do if(f>>>0>>0){g=1;while(1){if((i[a+f>>0]|0)!=b<<24>>24){f=g;break c}g=g+1|0;f=f+1|0;if(f>>>0>=m>>>0){f=g;break}}}else f=1;while(0);if(h){Cf(f,c,d);e=j}else Bf(j,e,f,c,d);k=f+k|0;if(k>>>0>=m>>>0)break;else j=e}return}while(1){b=i[a+k>>0]|0;f=b&255;h=b<<24>>24==0;do if(h){e=1;o=29}else{e=k+1|0;if(e>>>0>>0){g=e;e=1;do{if((i[a+g>>0]|0)!=b<<24>>24)break;e=e+1|0;g=g+1|0}while(g>>>0>>0);if(h){o=29;break}}else e=1;Bf(j,f,e,c,d)}while(0);if((o|0)==29){o=0;Cf(e,c,d);f=j}k=e+k|0;if(k>>>0>=m>>>0)break;else j=f}return}function Ff(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,n=0,o=0;o=r;r=r+64|0;f=o+32|0;n=o;d=f;e=d+32|0;do{j[d>>1]=0;d=d+2|0}while((d|0)<(e|0));d=(b|0)>0;if(d){e=0;do{h=f+((l[a+e>>0]|0)<<1)|0;j[h>>1]=(j[h>>1]|0)+1<<16>>16;e=e+1|0}while((e|0)!=(b|0))}j[f>>1]=0;j[n>>1]=0;j[n+2>>1]=0;h=(m[f+2>>1]|0)<<1;j[n+4>>1]=h;h=(m[f+4>>1]|0)+h<<1;j[n+6>>1]=h;h=(m[f+6>>1]|0)+h<<1;j[n+8>>1]=h;h=(m[f+8>>1]|0)+h<<1;j[n+10>>1]=h;h=(m[f+10>>1]|0)+h<<1;j[n+12>>1]=h;h=(m[f+12>>1]|0)+h<<1;j[n+14>>1]=h;h=(m[f+14>>1]|0)+h<<1;j[n+16>>1]=h;h=(m[f+16>>1]|0)+h<<1;j[n+18>>1]=h;h=(m[f+18>>1]|0)+h<<1;j[n+20>>1]=h;h=(m[f+20>>1]|0)+h<<1;j[n+22>>1]=h;h=(m[f+22>>1]|0)+h<<1;j[n+24>>1]=h;h=(m[f+24>>1]|0)+h<<1;j[n+26>>1]=h;h=(m[f+26>>1]|0)+h<<1;j[n+28>>1]=h;j[n+30>>1]=(m[f+28>>1]|0)+h<<1;if(d)h=0;else{r=o;return}do{e=i[a+h>>0]|0;if(e<<24>>24){g=e&255;d=n+(g<<1)|0;f=j[d>>1]|0;j[d>>1]=f+1<<16>>16;d=k[3972+((f&15)<<2)>>2]|0;if((e&255)>4){e=4;do{f=(f&65535)>>>4;d=k[3972+((f&15)<<2)>>2]|d<<4;e=e+4|0}while((e|0)<(g|0))}j[c+(h<<1)>>1]=d>>>(0-g&3)}h=h+1|0}while((h|0)!=(b|0));r=o;return}function Gf(a,b){a=a|0;b=b|0;return (k[a>>2]|0)<(k[b>>2]|0)|0}function Hf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,l=0,m=0;l=r;r=r+16|0;i=l;switch(d|0){case 2:{g=b+-8|0;if(!(Zb[k[c>>2]&1](g,a)|0)){r=l;return}b=a;j=k[b>>2]|0;b=k[b+4>>2]|0;d=g;i=k[d+4>>2]|0;c=a;k[c>>2]=k[d>>2];k[c+4>>2]=i;c=g;k[c>>2]=j;k[c+4>>2]=b;r=l;return}case 1:case 0:{r=l;return}default:{if((d|0)<129){if((a|0)!=(b|0)?(g=a+8|0,(g|0)!=(b|0)):0){f=g;do{g=f;e=f;h=k[e+4>>2]|0;d=i;k[d>>2]=k[e>>2];k[d+4>>2]=h;a:do if((f|0)==(a|0))j=8;else{h=f;while(1){h=h+-8|0;e=g;if(!(Zb[k[c>>2]&1](i,h)|0)){g=e;break a}m=h;d=k[m+4>>2]|0;k[g>>2]=k[m>>2];k[g+4>>2]=d;g=e+-8|0;if((h|0)==(a|0)){j=8;break}}}while(0);if((j|0)==8)j=0;h=i;d=k[h+4>>2]|0;m=g;k[m>>2]=k[h>>2];k[m+4>>2]=d;f=f+8|0}while((f|0)!=(b|0))}r=l;return}g=(d|0)/2|0;h=a+(g<<3)|0;if((d|0)>(f|0)){Hf(a,h,c,g,e,f);m=d-g|0;Hf(h,b,c,m,e,f);Kf(a,h,b,c,g,m,e,f);r=l;return}Jf(a,h,c,g,e);i=e+(g<<3)|0;Jf(h,b,c,d-g|0,i);f=e+(d<<3)|0;b:do if((d+1|0)>>>0<3){e=i;g=a}else{h=i;g=a;while(1){if((h|0)==(f|0))break;if(Zb[k[c>>2]&1](h,e)|0){b=h;a=k[b+4>>2]|0;m=g;k[m>>2]=k[b>>2];k[m+4>>2]=a;h=h+8|0}else{b=e;a=k[b+4>>2]|0;m=g;k[m>>2]=k[b>>2];k[m+4>>2]=a;e=e+8|0}g=g+8|0;if((e|0)==(i|0)){e=h;break b}}if((e|0)==(i|0)){r=l;return}while(1){a=e;c=k[a+4>>2]|0;m=g;k[m>>2]=k[a>>2];k[m+4>>2]=c;e=e+8|0;if((e|0)==(i|0))break;else g=g+8|0}r=l;return}while(0);if((e|0)==(f|0)){r=l;return}while(1){a=e;c=k[a+4>>2]|0;m=g;k[m>>2]=k[a>>2];k[m+4>>2]=c;e=e+8|0;if((e|0)==(f|0))break;else g=g+8|0}r=l;return}}}function If(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=j[a+4>>1]|0;if(e<<16>>16>-1){do{d=d+1|0;If(b+(e<<16>>16<<3)|0,b,c,d);f=j[a+6>>1]|0;a=b+(f<<3)|0;e=j[b+(f<<3)+4>>1]|0}while(e<<16>>16>-1);e=d}else e=d;i[c+(j[a+6>>1]|0)>>0]=e;return}function Jf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;switch(d|0){case 1:{g=a;c=k[g+4>>2]|0;b=e;k[b>>2]=k[g>>2];k[b+4>>2]=c;return}case 2:{d=b+-8|0;if(Zb[k[c>>2]&1](d,a)|0){b=d;c=k[b+4>>2]|0;g=e;k[g>>2]=k[b>>2];k[g+4>>2]=c;g=a;c=k[g+4>>2]|0;b=e+8|0;k[b>>2]=k[g>>2];k[b+4>>2]=c;return}else{b=a;c=k[b+4>>2]|0;g=e;k[g>>2]=k[b>>2];k[g+4>>2]=c;g=d;c=k[g+4>>2]|0;b=e+8|0;k[b>>2]=k[g>>2];k[b+4>>2]=c;return}}case 0:return;default:{if((d|0)<9){if((a|0)==(b|0))return;d=a;f=k[d+4>>2]|0;g=e;k[g>>2]=k[d>>2];k[g+4>>2]=f;a=a+8|0;if((a|0)==(b|0))return;else g=e;do{d=g;g=g+8|0;if(Zb[k[c>>2]&1](a,d)|0){i=d;h=k[i+4>>2]|0;f=g;k[f>>2]=k[i>>2];k[f+4>>2]=h;a:do if((d|0)==(e|0))d=e;else while(1){f=d;d=d+-8|0;if(!(Zb[k[c>>2]&1](a,d)|0)){d=f;break a}j=d;h=k[j+4>>2]|0;i=f;k[i>>2]=k[j>>2];k[i+4>>2]=h;if((d|0)==(e|0)){d=e;break}}while(0);h=a;i=k[h+4>>2]|0;j=d;k[j>>2]=k[h>>2];k[j+4>>2]=i}else{h=a;i=k[h+4>>2]|0;j=g;k[j>>2]=k[h>>2];k[j+4>>2]=i}a=a+8|0}while((a|0)!=(b|0));return}i=(d|0)/2|0;f=a+(i<<3)|0;Hf(a,f,c,i,e,i);j=d-i|0;Hf(f,b,c,j,e+(i<<3)|0,j);b:do if((d+1|0)>>>0<3)a=f;else{d=f;while(1){if((d|0)==(b|0))break;if(Zb[k[c>>2]&1](d,a)|0){h=d;i=k[h+4>>2]|0;j=e;k[j>>2]=k[h>>2];k[j+4>>2]=i;d=d+8|0}else{h=a;i=k[h+4>>2]|0;j=e;k[j>>2]=k[h>>2];k[j+4>>2]=i;a=a+8|0}e=e+8|0;if((a|0)==(f|0)){a=d;break b}}if((a|0)==(f|0))return;while(1){h=a;i=k[h+4>>2]|0;j=e;k[j>>2]=k[h>>2];k[j+4>>2]=i;a=a+8|0;if((a|0)==(f|0))break;else e=e+8|0}return}while(0);if((a|0)==(b|0))return;while(1){h=a;i=k[h+4>>2]|0;j=e;k[j>>2]=k[h>>2];k[j+4>>2]=i;a=a+8|0;if((a|0)==(b|0))break;else e=e+8|0}return}}} +function pd(a,b,c,d,e,f,g,h,i,m,n,o,q,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;m=m|0;n=n|0;o=o|0;q=q|0;s=s|0;var t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;X=r;r=r+80|0;Q=X+68|0;S=X+64|0;O=X+60|0;U=X+40|0;R=X+56|0;T=X+52|0;P=X+48|0;V=X+32|0;W=X;if(a>>>0>2&b>>>0>2){L=b+-3|0;K=c+(L&d)|0;K=(ha(l[K>>0]|l[K+1>>0]<<8|l[K+2>>0]<<16|l[K+3>>0]<<24,506832829)|0)>>>17;M=m+(K<<1)|0;N=j[M>>1]|0;k[m+65536+(K<<9)+((N&127)<<2)>>2]=L;j[M>>1]=N+1<<16>>16;M=b+-2|0;N=c+(M&d)|0;N=(ha(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24,506832829)|0)>>>17;K=m+(N<<1)|0;L=j[K>>1]|0;k[m+65536+(N<<9)+((L&127)<<2)>>2]=M;j[K>>1]=L+1<<16>>16;K=b+-1|0;L=c+(K&d)|0;L=(ha(l[L>>0]|l[L+1>>0]<<8|l[L+2>>0]<<16|l[L+3>>0]<<24,506832829)|0)>>>17;N=m+(L<<1)|0;M=j[N>>1]|0;k[m+65536+(L<<9)+((M&127)<<2)>>2]=K;j[N>>1]=M+1<<16>>16}t=k[o>>2]|0;u=d&b;E=b-u|0;F=u+a|0;G=(i|0)<9?64:512;if((u+3|0)>>>0>=F>>>0){d=q;c=a;g=t;c=g+c|0;k[o>>2]=c;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}H=G<<2;I=F+-4|0;J=F+-3|0;K=(i|0)<4;L=n+4|0;M=n+8|0;N=n+12|0;D=(i|0)>1;i=q;C=G+u|0;a:while(1){w=C+H|0;while(1){b=u+E|0;k[Q>>2]=0;k[S>>2]=0;k[O>>2]=0;p[U>>3]=h;if(yd(m,c,d,e,f,5.4,n,b,a,b>>>0>g>>>0?g:b,Q,S,O,U)|0){w=0;break}t=t+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<9)+((A&127)<<2)>>2]=b;j[B>>1]=A+1<<16>>16;b=u+1|0;do if(b>>>0>C>>>0)if(b>>>0>w>>>0){a=u+17|0;a=I>>>0>>0?I:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<9)+((A&127)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+4|0;b=b+4|0}while(b>>>0>>0)}else{a=u+9|0;a=J>>>0>>0?J:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<9)+((A&127)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=F-b|0;if((b+3|0)>>>0>>0)u=b;else{b=34;break a}}while(1){a=a+-1|0;if(K){b=(k[Q>>2]|0)+-1|0;b=(a|0)<(b|0)?a:b}else b=0;k[R>>2]=b;k[T>>2]=0;k[P>>2]=0;p[V>>3]=h;y=u+E|0;C=y+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<9)+((A&127)<<2)>>2]=y;j[B>>1]=A+1<<16>>16;if(!(yd(m,c,d,e,f,5.4,n,C,a,C>>>0>g>>>0?g:C,R,T,P,V)|0)){b=u;break}v=+p[V>>3];if(!(v>=+p[U>>3]+7.0)){b=u;break}b=u+1|0;t=t+1|0;k[Q>>2]=k[R>>2];k[S>>2]=k[T>>2];k[O>>2]=k[P>>2];p[U>>3]=v;w=w+1|0;if((w|0)>=4)break;else u=b}A=k[Q>>2]|0;C=b+G+(A<<1)|0;B=b+E|0;x=k[O>>2]|0;a=x+16|0;do if(x>>>0<=(B>>>0>g>>>0?g:B)>>>0){y=k[n>>2]|0;if((x|0)==(y|0))a=1;else{z=k[L>>2]|0;u=k[M>>2]|0;if((x|0)!=(z|0))if((x|0)!=(u|0))if((x|0)!=(k[N>>2]|0)){b:do if(D&(x|0)>5){w=4;while(1){if((x|0)==((k[1044+(w<<2)>>2]|0)+(k[n+(k[980+(w<<2)>>2]<<2)>>2]|0)|0)?(x|0)>=(k[1492+(w<<2)>>2]|0):0){a=w;break}w=w+1|0;if((w|0)>=16)break b}a=a+1|0}while(0);if((a|0)<=1)break}else a=4;else{u=x;a=3}else a=2;k[N>>2]=u;k[M>>2]=z;k[L>>2]=y;k[n>>2]=x}}while(0);ud(W,t,A,k[S>>2]|0,a);w=i+32|0;k[i>>2]=k[W>>2];k[i+4>>2]=k[W+4>>2];k[i+8>>2]=k[W+8>>2];k[i+12>>2]=k[W+12>>2];k[i+16>>2]=k[W+16>>2];k[i+20>>2]=k[W+20>>2];k[i+24>>2]=k[W+24>>2];if((A|0)>1){t=1;do{x=c+(t+b)|0;x=(ha(l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24,506832829)|0)>>>17;z=m+(x<<1)|0;y=j[z>>1]|0;k[m+65536+(x<<9)+((y&127)<<2)>>2]=t+B;j[z>>1]=y+1<<16>>16;t=t+1|0}while((t|0)<(A|0))}u=A+b|0;a=F-u|0;if((u+3|0)>>>0>=F>>>0){i=w;t=0;b=34;break}else{i=w;t=0}}if((b|0)==34){d=t+a|0;k[o>>2]=d;d=i;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}}function qd(a,b,c,d,e,f,g,h,i,m,n,o,q,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;m=m|0;n=n|0;o=o|0;q=q|0;s=s|0;var t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;X=r;r=r+80|0;Q=X+68|0;S=X+64|0;O=X+60|0;U=X+40|0;R=X+56|0;T=X+52|0;P=X+48|0;V=X+32|0;W=X;if(a>>>0>2&b>>>0>2){L=b+-3|0;K=c+(L&d)|0;K=(ha(l[K>>0]|l[K+1>>0]<<8|l[K+2>>0]<<16|l[K+3>>0]<<24,506832829)|0)>>>17;M=m+(K<<1)|0;N=j[M>>1]|0;k[m+65536+(K<<10)+((N&255)<<2)>>2]=L;j[M>>1]=N+1<<16>>16;M=b+-2|0;N=c+(M&d)|0;N=(ha(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24,506832829)|0)>>>17;K=m+(N<<1)|0;L=j[K>>1]|0;k[m+65536+(N<<10)+((L&255)<<2)>>2]=M;j[K>>1]=L+1<<16>>16;K=b+-1|0;L=c+(K&d)|0;L=(ha(l[L>>0]|l[L+1>>0]<<8|l[L+2>>0]<<16|l[L+3>>0]<<24,506832829)|0)>>>17;N=m+(L<<1)|0;M=j[N>>1]|0;k[m+65536+(L<<10)+((M&255)<<2)>>2]=K;j[N>>1]=M+1<<16>>16}t=k[o>>2]|0;u=d&b;E=b-u|0;F=u+a|0;G=(i|0)<9?64:512;if((u+3|0)>>>0>=F>>>0){d=q;c=a;g=t;c=g+c|0;k[o>>2]=c;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}H=G<<2;I=F+-4|0;J=F+-3|0;K=(i|0)<4;L=n+4|0;M=n+8|0;N=n+12|0;D=(i|0)>1;i=q;C=G+u|0;a:while(1){w=C+H|0;while(1){b=u+E|0;k[Q>>2]=0;k[S>>2]=0;k[O>>2]=0;p[U>>3]=h;if(xd(m,c,d,e,f,5.4,n,b,a,b>>>0>g>>>0?g:b,Q,S,O,U)|0){w=0;break}t=t+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<10)+((A&255)<<2)>>2]=b;j[B>>1]=A+1<<16>>16;b=u+1|0;do if(b>>>0>C>>>0)if(b>>>0>w>>>0){a=u+17|0;a=I>>>0>>0?I:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<10)+((A&255)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+4|0;b=b+4|0}while(b>>>0>>0)}else{a=u+9|0;a=J>>>0>>0?J:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<10)+((A&255)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=F-b|0;if((b+3|0)>>>0>>0)u=b;else{b=34;break a}}while(1){a=a+-1|0;if(K){b=(k[Q>>2]|0)+-1|0;b=(a|0)<(b|0)?a:b}else b=0;k[R>>2]=b;k[T>>2]=0;k[P>>2]=0;p[V>>3]=h;y=u+E|0;C=y+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<10)+((A&255)<<2)>>2]=y;j[B>>1]=A+1<<16>>16;if(!(xd(m,c,d,e,f,5.4,n,C,a,C>>>0>g>>>0?g:C,R,T,P,V)|0)){b=u;break}v=+p[V>>3];if(!(v>=+p[U>>3]+7.0)){b=u;break}b=u+1|0;t=t+1|0;k[Q>>2]=k[R>>2];k[S>>2]=k[T>>2];k[O>>2]=k[P>>2];p[U>>3]=v;w=w+1|0;if((w|0)>=4)break;else u=b}A=k[Q>>2]|0;C=b+G+(A<<1)|0;B=b+E|0;x=k[O>>2]|0;a=x+16|0;do if(x>>>0<=(B>>>0>g>>>0?g:B)>>>0){y=k[n>>2]|0;if((x|0)==(y|0))a=1;else{z=k[L>>2]|0;u=k[M>>2]|0;if((x|0)!=(z|0))if((x|0)!=(u|0))if((x|0)!=(k[N>>2]|0)){b:do if(D&(x|0)>5){w=4;while(1){if((x|0)==((k[1044+(w<<2)>>2]|0)+(k[n+(k[980+(w<<2)>>2]<<2)>>2]|0)|0)?(x|0)>=(k[1428+(w<<2)>>2]|0):0){a=w;break}w=w+1|0;if((w|0)>=16)break b}a=a+1|0}while(0);if((a|0)<=1)break}else a=4;else{u=x;a=3}else a=2;k[N>>2]=u;k[M>>2]=z;k[L>>2]=y;k[n>>2]=x}}while(0);ud(W,t,A,k[S>>2]|0,a);w=i+32|0;k[i>>2]=k[W>>2];k[i+4>>2]=k[W+4>>2];k[i+8>>2]=k[W+8>>2];k[i+12>>2]=k[W+12>>2];k[i+16>>2]=k[W+16>>2];k[i+20>>2]=k[W+20>>2];k[i+24>>2]=k[W+24>>2];if((A|0)>1){t=1;do{x=c+(t+b)|0;x=(ha(l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24,506832829)|0)>>>17;z=m+(x<<1)|0;y=j[z>>1]|0;k[m+65536+(x<<10)+((y&255)<<2)>>2]=t+B;j[z>>1]=y+1<<16>>16;t=t+1|0}while((t|0)<(A|0))}u=A+b|0;a=F-u|0;if((u+3|0)>>>0>=F>>>0){i=w;t=0;b=34;break}else{i=w;t=0}}if((b|0)==34){d=t+a|0;k[o>>2]=d;d=i;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}}function rd(a,b,c,d,e,f,g,h,i,m,n,q,s,t){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;m=m|0;n=n|0;q=q|0;s=s|0;t=t|0;var u=0,v=0,w=0.0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ia=0;ga=r;r=r+128|0;_=ga+120|0;ba=ga+116|0;X=ga+112|0;ea=ga+80|0;Y=ga+108|0;$=ga+104|0;V=ga+100|0;ca=ga+72|0;R=ga+40|0;Z=ga+96|0;aa=ga+92|0;W=ga+88|0;da=ga+32|0;fa=ga;if(a>>>0>2&b>>>0>2){S=b+-3|0;P=c+(S&d)|0;P=(ha(l[P>>0]|l[P+1>>0]<<8|l[P+2>>0]<<16|l[P+3>>0]<<24,506832829)|0)>>>17;T=m+(P<<1)|0;U=j[T>>1]|0;k[m+65536+(P<<10)+((U&255)<<2)>>2]=S;j[T>>1]=U+1<<16>>16;T=b+-2|0;U=c+(T&d)|0;U=(ha(l[U>>0]|l[U+1>>0]<<8|l[U+2>>0]<<16|l[U+3>>0]<<24,506832829)|0)>>>17;P=m+(U<<1)|0;S=j[P>>1]|0;k[m+65536+(U<<10)+((S&255)<<2)>>2]=T;j[P>>1]=S+1<<16>>16;P=b+-1|0;S=c+(P&d)|0;S=(ha(l[S>>0]|l[S+1>>0]<<8|l[S+2>>0]<<16|l[S+3>>0]<<24,506832829)|0)>>>17;U=m+(S<<1)|0;T=j[U>>1]|0;k[m+65536+(S<<10)+((T&255)<<2)>>2]=P;j[U>>1]=T+1<<16>>16}u=k[q>>2]|0;y=d&b;S=b-y|0;T=y+a|0;U=(i|0)<9?64:512;x=U+y|0;v=b+a|0;if(v>>>0>b>>>0){w=0.0;do{w=w+ +o[e+((b&f)<<2)>>2];b=b+1|0}while((b|0)!=(v|0))}else w=0.0;Q=(a|0)==0?w:w/+(a>>>0);k[_>>2]=0;k[ba>>2]=0;k[X>>2]=0;p[ea>>3]=0.0;if((y+3|0)>>>0>=T>>>0){d=s;c=a;g=u;c=g+c|0;k[q>>2]=c;q=s;q=d-q|0;q=q>>5;s=k[t>>2]|0;q=s+q|0;k[t>>2]=q;r=ga;return}I=U<<2;J=T+-4|0;K=T+-3|0;L=m+33619976|0;M=n+4|0;N=n+8|0;O=n+12|0;P=(i|0)>1;H=(i|0)<4;v=s;w=0.0;G=x;i=y;b=0;a:while(1){y=G+I|0;while(1){x=i+S|0;if((u|0)<8)z=+p[8+(u<<3)>>3]+h;else z=h;k[Y>>2]=0;k[$>>2]=0;k[V>>2]=0;p[ca>>3]=z;if(vd(m,c,d,e,f,Q,n,x,a,x>>>0>g>>>0?g:x,Y,$,V,ca)|0){B=x;F=z;break}u=u+1|0;D=c+i|0;D=(ha(l[D>>0]|l[D+1>>0]<<8|l[D+2>>0]<<16|l[D+3>>0]<<24,506832829)|0)>>>17;b=m+(D<<1)|0;E=j[b>>1]|0;k[m+65536+(D<<10)+((E&255)<<2)>>2]=x;j[b>>1]=E+1<<16>>16;b=i+1|0;do if(b>>>0>G>>>0)if(b>>>0>y>>>0){a=i+17|0;a=J>>>0>>0?J:a;if(b>>>0>=a>>>0)break;do{C=c+b|0;C=(ha(l[C>>0]|l[C+1>>0]<<8|l[C+2>>0]<<16|l[C+3>>0]<<24,506832829)|0)>>>17;E=m+(C<<1)|0;D=j[E>>1]|0;k[m+65536+(C<<10)+((D&255)<<2)>>2]=b+S;j[E>>1]=D+1<<16>>16;u=u+4|0;b=b+4|0}while(b>>>0>>0)}else{a=i+9|0;a=K>>>0>>0?K:a;if(b>>>0>=a>>>0)break;do{C=c+b|0;C=(ha(l[C>>0]|l[C+1>>0]<<8|l[C+2>>0]<<16|l[C+3>>0]<<24,506832829)|0)>>>17;E=m+(C<<1)|0;D=j[E>>1]|0;k[m+65536+(C<<10)+((D&255)<<2)>>2]=b+S;j[E>>1]=D+1<<16>>16;u=u+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=T-b|0;if((b+3|0)>>>0>>0){i=b;b=0}else{b=56;break a}}if(b&w>+p[ca>>3]){x=v+-32|0;G=j[v+-22>>1]|0;b=k[v+-8>>2]|0;y=(k[v+-28>>2]|0)+-1|0;a=G&65535;if((G&65535)<16)b=a+1|0;else{G=b>>>24;b=(b&16777215)+13+(a+-12-(G<<1)<>2]|0,y,y,b);k[x>>2]=k[R>>2];k[x+4>>2]=k[R+4>>2];k[x+8>>2]=k[R+8>>2];k[x+12>>2]=k[R+12>>2];k[x+16>>2]=k[R+16>>2];k[x+20>>2]=k[R+20>>2];k[x+24>>2]=k[R+24>>2];a=c+i|0;a=(ha(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24,506832829)|0)>>>17;E=m+(a<<1)|0;C=j[E>>1]|0;k[m+65536+(a<<10)+((C&255)<<2)>>2]=B;j[E>>1]=C+1<<16>>16;E=k[_>>2]|0;k[Y>>2]=E;k[$>>2]=k[ba>>2];C=k[X>>2]|0;k[V>>2]=C;p[ca>>3]=w;a=i+-1|0}else{D=0;while(1){a=a+-1|0;C=k[Y>>2]|0;if(H){b=C+-1|0;b=(a|0)<(b|0)?a:b}else b=0;k[Z>>2]=b;k[aa>>2]=0;k[W>>2]=0;p[da>>3]=F;x=i+S|0;B=x+1|0;y=c+i|0;y=(ha(l[y>>0]|l[y+1>>0]<<8|l[y+2>>0]<<16|l[y+3>>0]<<24,506832829)|0)>>>17;G=m+(y<<1)|0;E=j[G>>1]|0;k[m+65536+(y<<10)+((E&255)<<2)>>2]=x;j[G>>1]=E+1<<16>>16;B=vd(m,c,d,e,f,Q,n,B,a,B>>>0>g>>>0?g:B,Z,aa,W,da)|0;if((C|0)>3)z=+o[e+((i+4&f)<<2)>>2]-Q+0.0;else z=0.0;b=k[Z>>2]|0;y=b+1-C|0;if((y|0)>0){x=0;do{z=z-(+o[e+((x+i+C&f)<<2)>>2]-Q);x=x+1|0}while((x|0)!=(y|0))}if(!B){b=C;a=i;break}A=+p[da>>3];if(!(A>=+p[ca>>3]+(+(D|0)*.2+2.0+((u|0)<1?z+.97:z)+ +o[e+((i&f)<<2)>>2]*.04))){b=C;a=i;break}i=i+1|0;u=u+1|0;k[Y>>2]=b;k[$>>2]=k[aa>>2];k[V>>2]=k[W>>2];p[ca>>3]=A;D=D+1|0;if((D|0)>=4){a=i;break}}E=b;C=k[V>>2]|0}G=a+U+(E<<1)|0;D=a+S|0;b=C+16|0;D=C>>>0>(D>>>0>g>>>0?g:D)>>>0;do if(!D){y=k[n>>2]|0;if((C|0)==(y|0))b=1;else{B=k[M>>2]|0;i=k[N>>2]|0;if((C|0)!=(B|0))if((C|0)!=(i|0))if((C|0)!=(k[O>>2]|0)){b:do if(P&(C|0)>5){x=4;while(1){if((C|0)==((k[1044+(x<<2)>>2]|0)+(k[n+(k[980+(x<<2)>>2]<<2)>>2]|0)|0)?(C|0)>=(k[1364+(x<<2)>>2]|0):0){b=x;break}x=x+1|0;if((x|0)>=16)break b}b=b+1|0}while(0);if((b|0)<=1)break}else b=4;else{i=C;b=3}else b=2;k[O>>2]=i;k[N>>2]=B;k[M>>2]=y;k[n>>2]=C}}while(0);ud(fa,u,E,k[$>>2]|0,b);B=v+32|0;k[v>>2]=k[fa>>2];k[v+4>>2]=k[fa+4>>2];k[v+8>>2]=k[fa+8>>2];k[v+12>>2]=k[fa+12>>2];k[v+16>>2]=k[fa+16>>2];k[v+20>>2]=k[fa+20>>2];k[v+24>>2]=k[fa+24>>2];u=a+1|0;v=E+-1|0;if((v|0)>1){y=(v|0)>2?v:2;i=a+-1|0;x=a;b=1;while(1){if((x+4|0)>>>0>>0){ia=c+u|0;ia=(ha(l[ia>>0]|l[ia+1>>0]<<8|l[ia+2>>0]<<16|l[ia+3>>0]<<24,506832829)|0)>>>17;C=m+(ia<<1)|0;x=j[C>>1]|0;k[m+65536+(ia<<10)+((x&255)<<2)>>2]=u+S;j[C>>1]=x+1<<16>>16}b=b+1|0;if((b|0)>=(v|0))break;else{x=u;u=u+1|0}}v=i+y|0;u=a+y|0}else v=a;if(D|(v+21|0)>>>0>>0&((E|0)>3&(k[L>>2]|0)!=0)^1)b=0;else{b=u+S|0;p[ea>>3]=F;b=vd(m,c,d,e,f,Q,n,b,T-u|0,b>>>0>g>>>0?g:b,_,ba,X,ea)|0;w=+p[ea>>3]}w=w-+o[e+((u&f)<<2)>>2]+-3.75;p[ea>>3]=w;if((v+4|0)>>>0>>0){D=c+u|0;D=(ha(l[D>>0]|l[D+1>>0]<<8|l[D+2>>0]<<16|l[D+3>>0]<<24,506832829)|0)>>>17;ia=m+(D<<1)|0;E=j[ia>>1]|0;k[m+65536+(D<<10)+((E&255)<<2)>>2]=u+S;j[ia>>1]=E+1<<16>>16}i=v+2|0;a=T-i|0;if((v+5|0)>>>0>=T>>>0){v=B;u=0;b=56;break}else{v=B;u=0}}if((b|0)==56){ia=u+a|0;k[q>>2]=ia;q=v;ia=s;ia=q-ia|0;ia=ia>>5;q=k[t>>2]|0;ia=q+ia|0;k[t>>2]=ia;r=ga;return}}function sd(a,b,c,d,e,f,g,h,i,m,n,q,s,t){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;m=m|0;n=n|0;q=q|0;s=s|0;t=t|0;var u=0,v=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=r;r=r+80|0;U=$+68|0;W=$+64|0;S=$+60|0;Y=$+40|0;V=$+56|0;X=$+52|0;T=$+48|0;Z=$+32|0;_=$;if(a>>>0>2&b>>>0>2){P=b+-3|0;N=c+(P&d)|0;N=(ha((l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24)&16777215,506832829)|0)>>>17;Q=m+(N<<1)|0;R=j[Q>>1]|0;k[m+65536+(N<<10)+((R&255)<<2)>>2]=P;j[Q>>1]=R+1<<16>>16;Q=b+-2|0;R=c+(Q&d)|0;R=(ha((l[R>>0]|l[R+1>>0]<<8|l[R+2>>0]<<16|l[R+3>>0]<<24)&16777215,506832829)|0)>>>17;N=m+(R<<1)|0;P=j[N>>1]|0;k[m+65536+(R<<10)+((P&255)<<2)>>2]=Q;j[N>>1]=P+1<<16>>16;N=b+-1|0;P=c+(N&d)|0;P=(ha((l[P>>0]|l[P+1>>0]<<8|l[P+2>>0]<<16|l[P+3>>0]<<24)&16777215,506832829)|0)>>>17;R=m+(P<<1)|0;Q=j[R>>1]|0;k[m+65536+(P<<10)+((Q&255)<<2)>>2]=N;j[R>>1]=Q+1<<16>>16}u=k[q>>2]|0;x=d&b;P=b-x|0;Q=x+a|0;R=(i|0)<9?64:512;z=R+x|0;v=b+a|0;if(v>>>0>b>>>0){w=0.0;do{w=w+ +o[e+((b&f)<<2)>>2];b=b+1|0}while((b|0)!=(v|0))}else w=0.0;O=(a|0)==0?w:w/+(a>>>0);if((x+3|0)>>>0>=Q>>>0){d=s;c=a;g=u;c=g+c|0;k[q>>2]=c;q=s;q=d-q|0;q=q>>5;s=k[t>>2]|0;q=s+q|0;k[t>>2]=q;r=$;return}H=R<<2;I=Q+-4|0;J=Q+-3|0;K=(i|0)<4;L=n+4|0;M=n+8|0;N=n+12|0;G=(i|0)>1;v=s;a:while(1){i=z+H|0;while(1){b=x+P|0;if((u|0)<8)w=+p[8+(u<<3)>>3]+h;else w=h;k[U>>2]=0;k[W>>2]=0;k[S>>2]=0;p[Y>>3]=w;if(td(m,c,d,e,f,O,n,b,a,b>>>0>g>>>0?g:b,U,W,S,Y)|0){b=x;E=w;break}u=u+1|0;C=c+x|0;C=(ha((l[C>>0]|l[C+1>>0]<<8|l[C+2>>0]<<16|l[C+3>>0]<<24)&16777215,506832829)|0)>>>17;F=m+(C<<1)|0;D=j[F>>1]|0;k[m+65536+(C<<10)+((D&255)<<2)>>2]=b;j[F>>1]=D+1<<16>>16;b=x+1|0;do if(b>>>0>z>>>0)if(b>>>0>i>>>0){a=x+17|0;a=I>>>0>>0?I:a;if(b>>>0>=a>>>0)break;do{C=c+b|0;C=(ha((l[C>>0]|l[C+1>>0]<<8|l[C+2>>0]<<16|l[C+3>>0]<<24)&16777215,506832829)|0)>>>17;F=m+(C<<1)|0;D=j[F>>1]|0;k[m+65536+(C<<10)+((D&255)<<2)>>2]=b+P;j[F>>1]=D+1<<16>>16;u=u+4|0;b=b+4|0}while(b>>>0>>0)}else{a=x+9|0;a=J>>>0>>0?J:a;if(b>>>0>=a>>>0)break;do{C=c+b|0;C=(ha((l[C>>0]|l[C+1>>0]<<8|l[C+2>>0]<<16|l[C+3>>0]<<24)&16777215,506832829)|0)>>>17;F=m+(C<<1)|0;D=j[F>>1]|0;k[m+65536+(C<<10)+((D&255)<<2)>>2]=b+P;j[F>>1]=D+1<<16>>16;u=u+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=Q-b|0;if((b+3|0)>>>0>>0)x=b;else{b=43;break a}}C=0;B=b;while(1){a=a+-1|0;z=k[U>>2]|0;if(K){b=z+-1|0;b=(a|0)<(b|0)?a:b}else b=0;k[V>>2]=b;k[X>>2]=0;k[T>>2]=0;p[Z>>3]=E;x=B+P|0;i=x+1|0;A=c+B|0;A=(ha((l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24)&16777215,506832829)|0)>>>17;F=m+(A<<1)|0;D=j[F>>1]|0;k[m+65536+(A<<10)+((D&255)<<2)>>2]=x;j[F>>1]=D+1<<16>>16;i=td(m,c,d,e,f,O,n,i,a,i>>>0>g>>>0?g:i,V,X,T,Z)|0;if((z|0)>3)w=+o[e+((B+4&f)<<2)>>2]-O+0.0;else w=0.0;A=k[V>>2]|0;x=A+1-z|0;if((x|0)>0){b=0;do{w=w-(+o[e+((b+B+z&f)<<2)>>2]-O);b=b+1|0}while((b|0)!=(x|0))}if(!i){F=z;D=B;break}y=+p[Z>>3];if(!(y>=+p[Y>>3]+(+(C|0)*.2+2.0+((u|0)<1?w+.97:w)+ +o[e+((B&f)<<2)>>2]*.04))){F=z;D=B;break}b=B+1|0;u=u+1|0;k[U>>2]=A;k[W>>2]=k[X>>2];k[S>>2]=k[T>>2];p[Y>>3]=y;C=C+1|0;if((C|0)>=4){F=A;D=b;break}else B=b}z=D+R+(F<<1)|0;C=D+P|0;i=k[S>>2]|0;b=i+16|0;do if(i>>>0<=(C>>>0>g>>>0?g:C)>>>0){A=k[n>>2]|0;if((i|0)==(A|0))b=1;else{B=k[L>>2]|0;a=k[M>>2]|0;if((i|0)!=(B|0))if((i|0)!=(a|0))if((i|0)!=(k[N>>2]|0)){b:do if(G&(i|0)>5){x=4;while(1){if((i|0)==((k[1044+(x<<2)>>2]|0)+(k[n+(k[980+(x<<2)>>2]<<2)>>2]|0)|0)?(i|0)>=(k[1108+(x<<2)>>2]|0):0){b=x;break}x=x+1|0;if((x|0)>=16)break b}b=b+1|0}while(0);if((b|0)<=1)break}else b=4;else{a=i;b=3}else b=2;k[N>>2]=a;k[M>>2]=B;k[L>>2]=A;k[n>>2]=i}}while(0);ud(_,u,F,k[W>>2]|0,b);b=v+32|0;k[v>>2]=k[_>>2];k[v+4>>2]=k[_+4>>2];k[v+8>>2]=k[_+8>>2];k[v+12>>2]=k[_+12>>2];k[v+16>>2]=k[_+16>>2];k[v+20>>2]=k[_+20>>2];k[v+24>>2]=k[_+24>>2];if((F|0)>1){u=1;do{i=c+(u+D)|0;i=(ha((l[i>>0]|l[i+1>>0]<<8|l[i+2>>0]<<16|l[i+3>>0]<<24)&16777215,506832829)|0)>>>17;B=m+(i<<1)|0;A=j[B>>1]|0;k[m+65536+(i<<10)+((A&255)<<2)>>2]=u+C;j[B>>1]=A+1<<16>>16;u=u+1|0}while((u|0)<(F|0))}x=F+D|0;a=Q-x|0;if((x+3|0)>>>0>=Q>>>0){v=b;u=0;b=43;break}else{v=b;u=0}}if((b|0)==43){d=u+a|0;k[q>>2]=d;d=v;q=s;q=d-q|0;q=q>>5;s=k[t>>2]|0;q=s+q|0;k[t>>2]=q;r=$;return}}function td(a,b,c,d,e,f,g,h,m,n,q,r,s,t){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;m=m|0;n=n|0;q=q|0;r=r|0;s=s|0;t=t|0;var u=0.0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0,O=0,P=0,Q=0,R=0.0,S=0;k[r>>2]=0;Q=h&c;if(!d){M=0.0;R=0.0;D=0.0}else{D=+o[d+((h&e)<<2)>>2]+ +o[d+((h+1&e)<<2)>>2];R=D+ +o[d+((h+2&e)<<2)>>2];M=R-f*3.0+.3;R=R+ +o[d+((h+3&e)<<2)>>2]-f*4.0;D=D-f*2.0+1.2}u=+p[t>>3];w=k[q>>2]|0;k[q>>2]=0;N=b+Q|0;I=b+(Q+m)|0;K=m+-4|0;J=b+(K+Q)|0;K=(K|0)<0;B=0;d=0;do{y=(k[1044+(B<<2)>>2]|0)+(k[g+(k[980+(B<<2)>>2]<<2)>>2]|0)|0;e=h-y|0;do if(((!(y>>>0>n>>>0|e>>>0>=h>>>0)?(C=e&c,E=w+Q|0,E>>>0<=c>>>0):0)?(F=C+w|0,F>>>0<=c>>>0):0)?(i[b+E>>0]|0)==(i[b+F>>0]|0):0){a:do if(K){e=0;x=N}else{e=0;x=N;do{H=b+(e+C)|0;if((l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24|0)!=(l[H>>0]|l[H+1>>0]<<8|l[H+2>>0]<<16|l[H+3>>0]<<24|0))break a;x=x+4|0;e=e+4|0}while(x>>>0<=J>>>0)}while(0);b:do if(x>>>0>>0)do{if((i[b+(e+C)>>0]|0)!=(i[x>>0]|0))break b;x=x+1|0;e=e+1|0}while(x>>>0>>0);while(0);if(e>>>0<3?!((B|0)<2&(e|0)==2):0)break;A=+(e|0)*f-+p[72+(B<<3)>>3];switch(e|0){case 2:{z=D;break}case 3:{z=M;break}default:z=R}z=A+z;if(u>2]=e;k[r>>2]=e;k[s>>2]=y;p[t>>3]=z;w=e;u=z;d=1}}while(0);B=B+1|0}while((B|0)!=16);C=h+-64|0;C=(C|0)<0?0:C;A=D+-1.0;e=h+-1|0;c:do if((e|0)>(C|0)){B=b+(Q+1)|0;D=f*2.0;y=w;z=u;while(1){x=e;while(1){e=h-x|0;if(e>>>0>n>>>0){w=y;u=z;break c}H=x&c;if((i[N>>0]|0)==(i[b+H>>0]|0)?(i[B>>0]|0)==(i[b+(H+1)>>0]|0):0){if((x|0)==(h|0))w=-1;else w=(ja(e|0)|0)^31;u=A+(D-+(w|0)*2.3);if(z>2]=2;k[r>>2]=2;k[s>>2]=e;e=d+-1|0;if((e|0)<=(C|0)){w=2;d=1;break}else{y=2;z=u;d=1}}}while(0);G=(ha((l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24)&16777215,506832829)|0)>>>17;H=j[a+(G<<1)>>1]|0;e=H&65535;H=(H&65535)>256?e+-256|0:0;d:do if((e|0)>(H|0)){g=w;z=u;while(1){F=g+Q|0;E=F>>>0>c>>>0;F=b+F|0;while(1){e=e+-1|0;C=k[a+65536+(G<<10)+((e&255)<<2)>>2]|0;if((C|0)>-1){w=h-C|0;if(w>>>0>n>>>0)break d;B=C&c;if((!E?(L=B+g|0,L>>>0<=c>>>0):0)?(i[F>>0]|0)==(i[b+L>>0]|0):0){e:do if(K){x=0;y=N}else{x=0;y=N;do{S=b+(x+B)|0;if((l[y>>0]|l[y+1>>0]<<8|l[y+2>>0]<<16|l[y+3>>0]<<24|0)!=(l[S>>0]|l[S+1>>0]<<8|l[S+2>>0]<<16|l[S+3>>0]<<24|0))break e;y=y+4|0;x=x+4|0}while(y>>>0<=J>>>0)}while(0);f:do if(y>>>0>>0)do{if((i[b+(x+B)>>0]|0)!=(i[y>>0]|0))break f;y=y+1|0;x=x+1|0}while(y>>>0>>0);while(0);if(x>>>0>=3){if((C|0)==(h|0))u=-1.2;else u=+((ja(w|0)|0)^31|0)*1.2;u=(x>>>0>3?R:M)+(+(x|0)*f-u);if(z>2]=d;k[r>>2]=d;k[s>>2]=w;p[t>>3]=u;if((e|0)>(H|0)){g=d;z=u;d=1}else{d=1;break}}return d|0}else z=u;while(0);if(d){S=1;return S|0}F=a+33619972|0;g=k[F>>2]|0;B=a+33619968|0;C=k[B>>2]|0;if(g>>>0>>7>>>0){S=0;return S|0}y=(ha(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24,506832829)|0)>>>18<<1;E=n+1|0;k[B>>2]=C+1;S=j[6488+(y<<1)>>1]|0;d=S&65535;if(S<<16>>16!=0?(v=d&31,O=d>>>5,v>>>0<=m>>>0):0){w=(k[2420+(v<<2)>>2]|0)+(ha(v,O)|0)|0;e=72438+w|0;x=72438+(w+v)|0;w=72438+(v+-4+w)|0;g:do if(v>>>0<4)d=0;else{d=0;do{S=b+(d+Q)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[S>>0]|l[S+1>>0]<<8|l[S+2>>0]<<16|l[S+3>>0]<<24|0))break g;e=e+4|0;d=d+4|0}while(e>>>0<=w>>>0)}while(0);h:do if(e>>>0>>0)do{if((i[b+(d+Q)>>0]|0)!=(i[e>>0]|0))break h;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)==(v|0)){d=E+O|0;if(!d)u=-1.2;else u=+((ja(d|0)|0)^31|0)*1.2;u=R+(+(v|0)*f-u);if(!(z>2]=C+2;S=j[6488+((y|1)<<1)>>1]|0;d=S&65535;if(!(S<<16>>16)){S=0;return S|0}v=d&31;y=d>>>5;if(v>>>0>m>>>0){S=0;return S|0}w=(k[2420+(v<<2)>>2]|0)+(ha(v,y)|0)|0;e=72438+w|0;x=72438+(w+v)|0;w=72438+(v+-4+w)|0;i:do if(v>>>0<4)d=0;else{d=0;do{S=b+(d+Q)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[S>>0]|l[S+1>>0]<<8|l[S+2>>0]<<16|l[S+3>>0]<<24|0))break i;e=e+4|0;d=d+4|0}while(e>>>0<=w>>>0)}while(0);j:do if(e>>>0>>0)do{if((i[b+(d+Q)>>0]|0)!=(i[e>>0]|0))break j;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)!=(v|0)){S=0;return S|0}d=E+y|0;if(!d)u=-1.2;else u=+((ja(d|0)|0)^31|0)*1.2;u=R+(+(v|0)*f-u);if(!(z>2]=g+1;k[q>>2]=v;k[r>>2]=v;k[s>>2]=d;p[t>>3]=u;S=1;return S|0}function ud(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0;k[a>>2]=b;k[a+4>>2]=c;c=a+10|0;if((e|0)<17){p=e+65535&65535;j[c>>1]=p;c=0}else{m=e+-13|0;o=((ja(m|0)|0)^31)+-1|0;n=m>>o;p=(o<<1)+12+n&65535;j[c>>1]=p;c=m-(n<>2]=c;o=a+8|0;i=a+16|0;do if((b|0)>=6){if((b|0)<130){n=b+-2|0;g=((ja(n|0)|0)^31)+-1|0;g=(n>>g)+2+(g<<1)|0;break}if((b|0)<2114){g=((ja(b+-66|0)|0)^31)+10|0;break}if((b|0)<6210)g=21;else g=(b|0)<22594?22:23}else g=b;while(0);do if((d|0)>=10){if((d|0)<134){n=d+-6|0;h=((ja(n|0)|0)^31)+-1|0;h=(n>>h)+4+(h<<1)|0;break}if((d|0)<2118)h=((ja(d+-70|0)|0)^31)+12|0;else h=23}else h=d+-2|0;while(0);l=k[2092+(g<<2)>>2]|0;m=ii(k[1172+(h<<2)>>2]|0,0,l|0,((l|0)<0)<<31>>31|0)|0;n=L;b=b-(k[2188+(g<<2)>>2]|0)|0;f=((b|0)<0)<<31>>31;c=d-(k[1268+(h<<2)>>2]|0)|0;e=((c|0)<0)<<31>>31;a=h&7|g<<3&56;if(p<<16>>16==0&(g|0)<8&(h|0)<16){d=(h|0)<8?a:a|64;d=d&65535;j[o>>1]=d;o=hi(m|0,n|0,48)|0;d=L;n=hi(c|0,e|0,l|0)|0;p=L;o=b|o;d=f|d;n=o|n;p=d|p;d=i;o=d;k[o>>2]=n;d=d+4|0;k[d>>2]=p;return}else{d=k[2284+((h>>3)+((g>>3)*3|0)<<2)>>2]<<6|a;d=d&65535;j[o>>1]=d;o=hi(m|0,n|0,48)|0;d=L;n=hi(c|0,e|0,l|0)|0;p=L;o=b|o;d=f|d;n=o|n;p=d|p;d=i;o=d;k[o>>2]=n;d=d+4|0;k[d>>2]=p;return}}function vd(a,b,c,d,e,f,g,h,m,n,q,s,t,u){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;m=m|0;n=n|0;q=q|0;s=s|0;t=t|0;u=u|0;var v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0;S=r;r=r+16|0;R=S;k[s>>2]=0;O=h&c;if(!d){K=0.0;Q=0.0}else{Q=+o[d+((h&e)<<2)>>2]+ +o[d+((h+1&e)<<2)>>2]+ +o[d+((h+2&e)<<2)>>2];K=Q-f*3.0+.3;Q=Q+ +o[d+((h+3&e)<<2)>>2]-f*4.0}w=+p[u>>3];z=k[q>>2]|0;k[q>>2]=0;P=b+O|0;H=b+(O+m)|0;J=m+-4|0;I=b+(J+O)|0;J=(J|0)<0;B=0;d=0;do{A=(k[1044+(B<<2)>>2]|0)+(k[g+(k[980+(B<<2)>>2]<<2)>>2]|0)|0;e=h-A|0;if(((!(A>>>0>n>>>0|e>>>0>=h>>>0)?(C=e&c,D=z+O|0,D>>>0<=c>>>0):0)?(E=C+z|0,E>>>0<=c>>>0):0)?(i[b+D>>0]|0)==(i[b+E>>0]|0):0){a:do if(J){e=0;y=P}else{e=0;y=P;do{G=b+(e+C)|0;if((l[y>>0]|l[y+1>>0]<<8|l[y+2>>0]<<16|l[y+3>>0]<<24|0)!=(l[G>>0]|l[G+1>>0]<<8|l[G+2>>0]<<16|l[G+3>>0]<<24|0))break a;y=y+4|0;e=e+4|0}while(y>>>0<=I>>>0)}while(0);b:do if(y>>>0>>0)do{if((i[b+(e+C)>>0]|0)!=(i[y>>0]|0))break b;y=y+1|0;e=e+1|0}while(y>>>0>>0);while(0);if(e>>>0>=4?(x=Q+(+(e|0)*f-+p[72+(B<<3)>>3]),w>2]=e;k[s>>2]=e;k[t>>2]=A;p[u>>3]=x;z=e;w=x;d=1}}B=B+1|0}while((B|0)!=16);F=(ha(l[P>>0]|l[P+1>>0]<<8|l[P+2>>0]<<16|l[P+3>>0]<<24,506832829)|0)>>>17;G=j[a+(F<<1)>>1]|0;e=G&65535;G=(G&65535)>256?e+-256|0:0;c:do if((e|0)>(G|0)){x=w;while(1){g=z+O|0;E=g>>>0>c>>>0;g=b+g|0;while(1){e=e+-1|0;C=k[a+65536+(F<<10)+((e&255)<<2)>>2]|0;if((C|0)>-1){D=h-C|0;if(D>>>0>n>>>0){N=37;break c}B=C&c;if((!E?(L=B+z|0,L>>>0<=c>>>0):0)?(i[g>>0]|0)==(i[b+L>>0]|0):0){d:do if(J){y=0;A=P}else{y=0;A=P;do{T=b+(y+B)|0;if((l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24|0)!=(l[T>>0]|l[T+1>>0]<<8|l[T+2>>0]<<16|l[T+3>>0]<<24|0))break d;A=A+4|0;y=y+4|0}while(A>>>0<=I>>>0)}while(0);e:do if(A>>>0>>0)do{if((i[b+(y+B)>>0]|0)!=(i[A>>0]|0))break e;A=A+1|0;y=y+1|0}while(A>>>0>>0);while(0);if(y>>>0>=4){if((C|0)==(h|0))w=-1.2;else w=+((ja(D|0)|0)^31|0)*1.2;w=(y>>>0>3?Q:K)+(+(y|0)*f-w);if(x>2]=z;k[s>>2]=z;k[t>>2]=d;p[u>>3]=w;if((e|0)>(G|0)){x=w;d=1}else{d=1;break}}}else{x=w;N=37}while(0);do if((N|0)==37)if(!d){g=a+33619972|0;F=k[g>>2]|0;B=a+33619968|0;C=k[B>>2]|0;if(F>>>0>>7>>>0){w=x;d=0}else{D=(ha(l[P>>0]|l[P+1>>0]<<8|l[P+2>>0]<<16|l[P+3>>0]<<24,506832829)|0)>>>18<<1;E=n+1|0;k[B>>2]=C+1;T=j[6488+(D<<1)>>1]|0;d=T&65535;if(T<<16>>16!=0?(v=d&31,M=d>>>5,v>>>0<=m>>>0):0){y=(k[2420+(v<<2)>>2]|0)+(ha(v,M)|0)|0;e=72438+y|0;A=72438+(y+v)|0;y=72438+(v+-4+y)|0;f:do if(v>>>0<4)d=0;else{d=0;do{T=b+(d+O)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[T>>0]|l[T+1>>0]<<8|l[T+2>>0]<<16|l[T+3>>0]<<24|0))break f;e=e+4|0;d=d+4|0}while(e>>>0<=y>>>0)}while(0);g:do if(e>>>0>>0)do{if((i[b+(d+O)>>0]|0)!=(i[e>>0]|0))break g;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)==(v|0)){d=E+M|0;if(!d)w=-1.2;else w=+((ja(d|0)|0)^31|0)*1.2;w=Q+(+(v|0)*f-w);if(!(x>2]=C+2;T=j[6488+((D|1)<<1)>>1]|0;d=T&65535;if(!(T<<16>>16)){w=x;d=0;break}v=d&31;B=d>>>5;if(v>>>0>m>>>0){w=x;d=0;break}y=(k[2420+(v<<2)>>2]|0)+(ha(v,B)|0)|0;e=72438+y|0;A=72438+(y+v)|0;y=72438+(v+-4+y)|0;h:do if(v>>>0<4)d=0;else{d=0;do{T=b+(d+O)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[T>>0]|l[T+1>>0]<<8|l[T+2>>0]<<16|l[T+3>>0]<<24|0))break h;e=e+4|0;d=d+4|0}while(e>>>0<=y>>>0)}while(0);i:do if(e>>>0>>0)do{if((i[b+(d+O)>>0]|0)!=(i[e>>0]|0))break i;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)!=(v|0)){w=x;d=0;break}d=E+B|0;if(!d)w=-1.2;else w=+((ja(d|0)|0)^31|0)*1.2;w=Q+(+(v|0)*f-w);if(!(x>2]=F+1;k[q>>2]=v;k[s>>2]=v;k[t>>2]=d;p[u>>3]=w;z=v;d=1}}else{w=x;d=1}while(0);E=a+33619976|0;v=k[E>>2]|0;if(!v){T=d;r=S;return T|0}y=l[P>>0]|l[P+1>>0]<<8|l[P+2>>0]<<16|l[P+3>>0]<<24;A=k[v+24>>2]|0;j:do if(A){B=A+-1|0;C=(B&A|0)==0;if(C)D=B&y;else D=(y>>>0)%(A>>>0)|0;v=k[(k[v+20>>2]|0)+(D<<2)>>2]|0;if(v){do{v=k[v>>2]|0;if(!v){v=0;break j}e=k[v+4>>2]|0;if(C)e=e&B;else e=(e>>>0)%(A>>>0)|0;if((e|0)!=(D|0)){v=0;break j}}while((k[v+8>>2]|0)!=(y|0));v=k[v+12>>2]|0}else v=0}else v=0;while(0);v=v>>>0>m>>>0?m:v;if(!((v|0)>(z|0)&(v|0)>3)){T=d;r=S;return T|0}A=n+1|0;x=w;y=v;while(1){ai(R,P,y);v=wd(k[E>>2]|0,R)|0;if(v){v=k[v+20>>2]|0;e=A+(v>>6)|0;if(!e)w=-1.2;else w=+((ja(e|0)|0)^31|0)*1.2;w=Q+(+(y|0)*f-w);if(x>2]=y;k[s>>2]=v&63;k[t>>2]=e;p[u>>3]=w;v=y;d=1}else{v=z;w=x}}else{v=z;w=x}bi(R);y=y+-1|0;if(!((y|0)>(v|0)&(y|0)>3))break;else{z=v;x=w}}r=S;return d|0}function wd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0;m=i[b>>0]|0;j=(m&1)==0;n=j?b+1|0:k[b+8>>2]|0;m=j?(m&255)>>>1:k[b+4>>2]|0;if(m>>>0>3){c=m;d=n;b=m;while(1){j=ha(l[d>>0]|l[d+1>>0]<<8|l[d+2>>0]<<16|l[d+3>>0]<<24,1540483477)|0;b=(ha(j>>>24^j,1540483477)|0)^(ha(b,1540483477)|0);c=c+-4|0;if(c>>>0<=3)break;else d=d+4|0}c=m+-4|0;d=c&-4;c=c-d|0;d=n+(d+4)|0}else{c=m;d=n;b=m}switch(c|0){case 3:{b=l[d+2>>0]<<16^b;e=6;break}case 2:{e=6;break}case 1:{e=7;break}default:{}}if((e|0)==6){b=l[d+1>>0]<<8^b;e=7}if((e|0)==7)b=ha(l[d>>0]^b,1540483477)|0;b=ha(b>>>13^b,1540483477)|0;b=b>>>15^b;g=k[a+4>>2]|0;if(!g){n=0;return n|0}h=g+-1|0;j=(h&g|0)==0;if(j)f=b&h;else f=(b>>>0)%(g>>>0)|0;b=k[(k[a>>2]|0)+(f<<2)>>2]|0;if(!b){n=0;return n|0}b=k[b>>2]|0;if(!b){n=0;return n|0}a=(m|0)==0;a:while(1){c=k[b+4>>2]|0;if(j)c=c&h;else c=(c>>>0)%(g>>>0)|0;if((c|0)!=(f|0)){b=0;e=26;break}c=b+8|0;e=i[c>>0]|0;d=(e&1)==0;b:do if(((d?(e&255)>>>1:k[b+12>>2]|0)|0)==(m|0)){c=d?c+1|0:k[b+16>>2]|0;if(!d)if(!(mh(c,n,m)|0)){e=26;break a}else break;if(a){e=26;break a}else{e=m;d=n}while(1){if((i[c>>0]|0)!=(i[d>>0]|0))break b;e=e+-1|0;if(!e){e=26;break a}else{c=c+1|0;d=d+1|0}}}while(0);b=k[b>>2]|0;if(!b){b=0;e=26;break}}if((e|0)==26)return b|0;return 0}function xd(a,b,c,d,e,f,g,h,m,n,o,q,r,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;m=m|0;n=n|0;o=o|0;q=q|0;r=r|0;s=s|0;var t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k[q>>2]=0;M=h&c;t=+p[s>>3];v=k[o>>2]|0;k[o>>2]=0;J=b+M|0;F=b+(M+m)|0;H=m+-4|0;G=b+(H+M)|0;H=(H|0)<0;z=0;d=0;do{x=(k[1044+(z<<2)>>2]|0)+(k[g+(k[980+(z<<2)>>2]<<2)>>2]|0)|0;e=h-x|0;if(((!(x>>>0>n>>>0|e>>>0>=h>>>0)?(A=e&c,B=v+M|0,B>>>0<=c>>>0):0)?(C=A+v|0,C>>>0<=c>>>0):0)?(i[b+B>>0]|0)==(i[b+C>>0]|0):0){a:do if(H){e=0;w=J}else{e=0;w=J;do{E=b+(e+A)|0;if((l[w>>0]|l[w+1>>0]<<8|l[w+2>>0]<<16|l[w+3>>0]<<24|0)!=(l[E>>0]|l[E+1>>0]<<8|l[E+2>>0]<<16|l[E+3>>0]<<24|0))break a;w=w+4|0;e=e+4|0}while(w>>>0<=G>>>0)}while(0);b:do if(w>>>0>>0)do{if((i[b+(e+A)>>0]|0)!=(i[w>>0]|0))break b;w=w+1|0;e=e+1|0}while(w>>>0>>0);while(0);if(e>>>0>=4?(y=+(e|0)*f-+p[72+(z<<3)>>3],t>2]=e;k[q>>2]=e;k[r>>2]=x;p[s>>3]=y;v=e;t=y;d=1}}z=z+1|0}while((z|0)!=16);D=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>17;E=j[a+(D<<1)>>1]|0;e=E&65535;E=(E&65535)>256?e+-256|0:0;c:do if((e|0)>(E|0)){while(1){g=v+M|0;C=g>>>0>c>>>0;g=b+g|0;while(1){e=e+-1|0;A=k[a+65536+(D<<10)+((e&255)<<2)>>2]|0;if((A|0)>-1){B=h-A|0;if(B>>>0>n>>>0){y=t;break c}z=A&c;if((!C?(I=z+v|0,I>>>0<=c>>>0):0)?(i[g>>0]|0)==(i[b+I>>0]|0):0){d:do if(H){w=0;x=J}else{w=0;x=J;do{N=b+(w+z)|0;if((l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break d;x=x+4|0;w=w+4|0}while(x>>>0<=G>>>0)}while(0);e:do if(x>>>0>>0)do{if((i[b+(w+z)>>0]|0)!=(i[x>>0]|0))break e;x=x+1|0;w=w+1|0}while(x>>>0>>0);while(0);if(w>>>0>=4){if((A|0)==(h|0))y=-1.2;else y=+((ja(B|0)|0)^31|0)*1.2;y=+(w|0)*f-y;if(t>2]=d;k[q>>2]=d;k[r>>2]=v;p[s>>3]=t;if((e|0)>(E|0)){v=d;d=1}else{d=1;break}}return d|0}else y=t;while(0);if(d){N=1;return N|0}C=a+33619972|0;g=k[C>>2]|0;z=a+33619968|0;A=k[z>>2]|0;if(g>>>0>>7>>>0){N=0;return N|0}x=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>18<<1;B=n+1|0;k[z>>2]=A+1;N=j[6488+(x<<1)>>1]|0;d=N&65535;if(N<<16>>16!=0?(u=d&31,K=d>>>5,u>>>0<=m>>>0):0){v=(k[2420+(u<<2)>>2]|0)+(ha(u,K)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;f:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break f;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);g:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break g;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)==(u|0)){d=B+K|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=A+2;N=j[6488+((x|1)<<1)>>1]|0;d=N&65535;if(!(N<<16>>16)){N=0;return N|0}u=d&31;x=d>>>5;if(u>>>0>m>>>0){N=0;return N|0}v=(k[2420+(u<<2)>>2]|0)+(ha(u,x)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;h:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break h;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);i:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break i;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)!=(u|0)){N=0;return N|0}d=B+x|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=g+1;k[o>>2]=u;k[q>>2]=u;k[r>>2]=d;p[s>>3]=t;N=1;return N|0}function yd(a,b,c,d,e,f,g,h,m,n,o,q,r,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;m=m|0;n=n|0;o=o|0;q=q|0;r=r|0;s=s|0;var t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k[q>>2]=0;M=h&c;t=+p[s>>3];v=k[o>>2]|0;k[o>>2]=0;J=b+M|0;F=b+(M+m)|0;H=m+-4|0;G=b+(H+M)|0;H=(H|0)<0;z=0;d=0;do{x=(k[1044+(z<<2)>>2]|0)+(k[g+(k[980+(z<<2)>>2]<<2)>>2]|0)|0;e=h-x|0;if(((!(x>>>0>n>>>0|e>>>0>=h>>>0)?(A=e&c,B=v+M|0,B>>>0<=c>>>0):0)?(C=A+v|0,C>>>0<=c>>>0):0)?(i[b+B>>0]|0)==(i[b+C>>0]|0):0){a:do if(H){e=0;w=J}else{e=0;w=J;do{E=b+(e+A)|0;if((l[w>>0]|l[w+1>>0]<<8|l[w+2>>0]<<16|l[w+3>>0]<<24|0)!=(l[E>>0]|l[E+1>>0]<<8|l[E+2>>0]<<16|l[E+3>>0]<<24|0))break a;w=w+4|0;e=e+4|0}while(w>>>0<=G>>>0)}while(0);b:do if(w>>>0>>0)do{if((i[b+(e+A)>>0]|0)!=(i[w>>0]|0))break b;w=w+1|0;e=e+1|0}while(w>>>0>>0);while(0);if(e>>>0>=4?(y=+(e|0)*f-+p[72+(z<<3)>>3],t>2]=e;k[q>>2]=e;k[r>>2]=x;p[s>>3]=y;v=e;t=y;d=1}}z=z+1|0}while((z|0)!=10);D=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>17;E=j[a+(D<<1)>>1]|0;e=E&65535;E=(E&65535)>128?e+-128|0:0;c:do if((e|0)>(E|0)){while(1){g=v+M|0;C=g>>>0>c>>>0;g=b+g|0;while(1){e=e+-1|0;A=k[a+65536+(D<<9)+((e&127)<<2)>>2]|0;if((A|0)>-1){B=h-A|0;if(B>>>0>n>>>0){y=t;break c}z=A&c;if((!C?(I=z+v|0,I>>>0<=c>>>0):0)?(i[g>>0]|0)==(i[b+I>>0]|0):0){d:do if(H){w=0;x=J}else{w=0;x=J;do{N=b+(w+z)|0;if((l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break d;x=x+4|0;w=w+4|0}while(x>>>0<=G>>>0)}while(0);e:do if(x>>>0>>0)do{if((i[b+(w+z)>>0]|0)!=(i[x>>0]|0))break e;x=x+1|0;w=w+1|0}while(x>>>0>>0);while(0);if(w>>>0>=4){if((A|0)==(h|0))y=-1.2;else y=+((ja(B|0)|0)^31|0)*1.2;y=+(w|0)*f-y;if(t>2]=d;k[q>>2]=d;k[r>>2]=v;p[s>>3]=t;if((e|0)>(E|0)){v=d;d=1}else{d=1;break}}return d|0}else y=t;while(0);if(d){N=1;return N|0}C=a+16842756|0;g=k[C>>2]|0;z=a+16842752|0;A=k[z>>2]|0;if(g>>>0>>7>>>0){N=0;return N|0}x=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>18<<1;B=n+1|0;k[z>>2]=A+1;N=j[6488+(x<<1)>>1]|0;d=N&65535;if(N<<16>>16!=0?(u=d&31,K=d>>>5,u>>>0<=m>>>0):0){v=(k[2420+(u<<2)>>2]|0)+(ha(u,K)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;f:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break f;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);g:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break g;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)==(u|0)){d=B+K|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=A+2;N=j[6488+((x|1)<<1)>>1]|0;d=N&65535;if(!(N<<16>>16)){N=0;return N|0}u=d&31;x=d>>>5;if(u>>>0>m>>>0){N=0;return N|0}v=(k[2420+(u<<2)>>2]|0)+(ha(u,x)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;h:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break h;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);i:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break i;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)!=(u|0)){N=0;return N|0}d=B+x|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=g+1;k[o>>2]=u;k[q>>2]=u;k[r>>2]=d;p[s>>3]=t;N=1;return N|0}function zd(a,b,c,d,e,f,g,h,m,n,o,q,r,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;m=m|0;n=n|0;o=o|0;q=q|0;r=r|0;s=s|0;var t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k[q>>2]=0;M=h&c;t=+p[s>>3];v=k[o>>2]|0;k[o>>2]=0;J=b+M|0;F=b+(M+m)|0;H=m+-4|0;G=b+(H+M)|0;H=(H|0)<0;z=0;d=0;do{x=(k[1044+(z<<2)>>2]|0)+(k[g+(k[980+(z<<2)>>2]<<2)>>2]|0)|0;e=h-x|0;if(((!(x>>>0>n>>>0|e>>>0>=h>>>0)?(A=e&c,B=v+M|0,B>>>0<=c>>>0):0)?(C=A+v|0,C>>>0<=c>>>0):0)?(i[b+B>>0]|0)==(i[b+C>>0]|0):0){a:do if(H){e=0;w=J}else{e=0;w=J;do{E=b+(e+A)|0;if((l[w>>0]|l[w+1>>0]<<8|l[w+2>>0]<<16|l[w+3>>0]<<24|0)!=(l[E>>0]|l[E+1>>0]<<8|l[E+2>>0]<<16|l[E+3>>0]<<24|0))break a;w=w+4|0;e=e+4|0}while(w>>>0<=G>>>0)}while(0);b:do if(w>>>0>>0)do{if((i[b+(e+A)>>0]|0)!=(i[w>>0]|0))break b;w=w+1|0;e=e+1|0}while(w>>>0>>0);while(0);if(e>>>0>=4?(y=+(e|0)*f-+p[72+(z<<3)>>3],t>2]=e;k[q>>2]=e;k[r>>2]=x;p[s>>3]=y;v=e;t=y;d=1}}z=z+1|0}while((z|0)!=10);D=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>17;E=j[a+(D<<1)>>1]|0;e=E&65535;E=(E&65535)>64?e+-64|0:0;c:do if((e|0)>(E|0)){while(1){g=v+M|0;C=g>>>0>c>>>0;g=b+g|0;while(1){e=e+-1|0;A=k[a+65536+(D<<8)+((e&63)<<2)>>2]|0;if((A|0)>-1){B=h-A|0;if(B>>>0>n>>>0){y=t;break c}z=A&c;if((!C?(I=z+v|0,I>>>0<=c>>>0):0)?(i[g>>0]|0)==(i[b+I>>0]|0):0){d:do if(H){w=0;x=J}else{w=0;x=J;do{N=b+(w+z)|0;if((l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break d;x=x+4|0;w=w+4|0}while(x>>>0<=G>>>0)}while(0);e:do if(x>>>0>>0)do{if((i[b+(w+z)>>0]|0)!=(i[x>>0]|0))break e;x=x+1|0;w=w+1|0}while(x>>>0>>0);while(0);if(w>>>0>=4){if((A|0)==(h|0))y=-1.2;else y=+((ja(B|0)|0)^31|0)*1.2;y=+(w|0)*f-y;if(t>2]=d;k[q>>2]=d;k[r>>2]=v;p[s>>3]=t;if((e|0)>(E|0)){v=d;d=1}else{d=1;break}}return d|0}else y=t;while(0);if(d){N=1;return N|0}C=a+8454148|0;g=k[C>>2]|0;z=a+8454144|0;A=k[z>>2]|0;if(g>>>0>>7>>>0){N=0;return N|0}x=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>18<<1;B=n+1|0;k[z>>2]=A+1;N=j[6488+(x<<1)>>1]|0;d=N&65535;if(N<<16>>16!=0?(u=d&31,K=d>>>5,u>>>0<=m>>>0):0){v=(k[2420+(u<<2)>>2]|0)+(ha(u,K)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;f:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break f;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);g:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break g;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)==(u|0)){d=B+K|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=A+2;N=j[6488+((x|1)<<1)>>1]|0;d=N&65535;if(!(N<<16>>16)){N=0;return N|0}u=d&31;x=d>>>5;if(u>>>0>m>>>0){N=0;return N|0}v=(k[2420+(u<<2)>>2]|0)+(ha(u,x)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;h:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break h;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);i:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break i;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)!=(u|0)){N=0;return N|0}d=B+x|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=g+1;k[o>>2]=u;k[q>>2]=u;k[r>>2]=d;p[s>>3]=t;N=1;return N|0}function Ad(a,b,c,d,e,f,g,h,m,n,o,q,r,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;m=m|0;n=n|0;o=o|0;q=q|0;r=r|0;s=s|0;var t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k[q>>2]=0;M=h&c;t=+p[s>>3];v=k[o>>2]|0;k[o>>2]=0;J=b+M|0;F=b+(M+m)|0;H=m+-4|0;G=b+(H+M)|0;H=(H|0)<0;z=0;d=0;do{x=(k[1044+(z<<2)>>2]|0)+(k[g+(k[980+(z<<2)>>2]<<2)>>2]|0)|0;e=h-x|0;if(((!(x>>>0>n>>>0|e>>>0>=h>>>0)?(A=e&c,B=v+M|0,B>>>0<=c>>>0):0)?(C=A+v|0,C>>>0<=c>>>0):0)?(i[b+B>>0]|0)==(i[b+C>>0]|0):0){a:do if(H){e=0;w=J}else{e=0;w=J;do{E=b+(e+A)|0;if((l[w>>0]|l[w+1>>0]<<8|l[w+2>>0]<<16|l[w+3>>0]<<24|0)!=(l[E>>0]|l[E+1>>0]<<8|l[E+2>>0]<<16|l[E+3>>0]<<24|0))break a;w=w+4|0;e=e+4|0}while(w>>>0<=G>>>0)}while(0);b:do if(w>>>0>>0)do{if((i[b+(e+A)>>0]|0)!=(i[w>>0]|0))break b;w=w+1|0;e=e+1|0}while(w>>>0>>0);while(0);if(e>>>0>=4?(y=+(e|0)*f-+p[72+(z<<3)>>3],t>2]=e;k[q>>2]=e;k[r>>2]=x;p[s>>3]=y;v=e;t=y;d=1}}z=z+1|0}while((z|0)!=4);D=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>18;E=j[a+(D<<1)>>1]|0;e=E&65535;E=(E&65535)>32?e+-32|0:0;c:do if((e|0)>(E|0)){while(1){g=v+M|0;C=g>>>0>c>>>0;g=b+g|0;while(1){e=e+-1|0;A=k[a+32768+(D<<7)+((e&31)<<2)>>2]|0;if((A|0)>-1){B=h-A|0;if(B>>>0>n>>>0){y=t;break c}z=A&c;if((!C?(I=z+v|0,I>>>0<=c>>>0):0)?(i[g>>0]|0)==(i[b+I>>0]|0):0){d:do if(H){w=0;x=J}else{w=0;x=J;do{N=b+(w+z)|0;if((l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break d;x=x+4|0;w=w+4|0}while(x>>>0<=G>>>0)}while(0);e:do if(x>>>0>>0)do{if((i[b+(w+z)>>0]|0)!=(i[x>>0]|0))break e;x=x+1|0;w=w+1|0}while(x>>>0>>0);while(0);if(w>>>0>=4){if((A|0)==(h|0))y=-1.2;else y=+((ja(B|0)|0)^31|0)*1.2;y=+(w|0)*f-y;if(t>2]=d;k[q>>2]=d;k[r>>2]=v;p[s>>3]=t;if((e|0)>(E|0)){v=d;d=1}else{d=1;break}}return d|0}else y=t;while(0);if(d){N=1;return N|0}C=a+2129924|0;g=k[C>>2]|0;z=a+2129920|0;A=k[z>>2]|0;if(g>>>0>>7>>>0){N=0;return N|0}x=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>18<<1;B=n+1|0;k[z>>2]=A+1;N=j[6488+(x<<1)>>1]|0;d=N&65535;if(N<<16>>16!=0?(u=d&31,K=d>>>5,u>>>0<=m>>>0):0){v=(k[2420+(u<<2)>>2]|0)+(ha(u,K)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;f:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break f;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);g:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break g;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)==(u|0)){d=B+K|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=A+2;N=j[6488+((x|1)<<1)>>1]|0;d=N&65535;if(!(N<<16>>16)){N=0;return N|0}u=d&31;x=d>>>5;if(u>>>0>m>>>0){N=0;return N|0}v=(k[2420+(u<<2)>>2]|0)+(ha(u,x)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;h:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break h;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);i:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break i;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)!=(u|0)){N=0;return N|0}d=B+x|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=g+1;k[o>>2]=u;k[q>>2]=u;k[r>>2]=d;p[s>>3]=t;N=1;return N|0}function Bd(a,b,c,d,e,f,g,h,m,n,o,q,r,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;m=m|0;n=n|0;o=o|0;q=q|0;r=r|0;s=s|0;var t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k[q>>2]=0;M=h&c;t=+p[s>>3];v=k[o>>2]|0;k[o>>2]=0;J=b+M|0;F=b+(M+m)|0;H=m+-4|0;G=b+(H+M)|0;H=(H|0)<0;z=0;d=0;do{x=(k[1044+(z<<2)>>2]|0)+(k[g+(k[980+(z<<2)>>2]<<2)>>2]|0)|0;e=h-x|0;if(((!(x>>>0>n>>>0|e>>>0>=h>>>0)?(A=e&c,B=v+M|0,B>>>0<=c>>>0):0)?(C=A+v|0,C>>>0<=c>>>0):0)?(i[b+B>>0]|0)==(i[b+C>>0]|0):0){a:do if(H){e=0;w=J}else{e=0;w=J;do{E=b+(e+A)|0;if((l[w>>0]|l[w+1>>0]<<8|l[w+2>>0]<<16|l[w+3>>0]<<24|0)!=(l[E>>0]|l[E+1>>0]<<8|l[E+2>>0]<<16|l[E+3>>0]<<24|0))break a;w=w+4|0;e=e+4|0}while(w>>>0<=G>>>0)}while(0);b:do if(w>>>0>>0)do{if((i[b+(e+A)>>0]|0)!=(i[w>>0]|0))break b;w=w+1|0;e=e+1|0}while(w>>>0>>0);while(0);if(e>>>0>=4?(y=+(e|0)*f-+p[72+(z<<3)>>3],t>2]=e;k[q>>2]=e;k[r>>2]=x;p[s>>3]=y;v=e;t=y;d=1}}z=z+1|0}while((z|0)!=4);D=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>18;E=j[a+(D<<1)>>1]|0;e=E&65535;E=(E&65535)>16?e+-16|0:0;c:do if((e|0)>(E|0)){while(1){g=v+M|0;C=g>>>0>c>>>0;g=b+g|0;while(1){e=e+-1|0;A=k[a+32768+(D<<6)+((e&15)<<2)>>2]|0;if((A|0)>-1){B=h-A|0;if(B>>>0>n>>>0){y=t;break c}z=A&c;if((!C?(I=z+v|0,I>>>0<=c>>>0):0)?(i[g>>0]|0)==(i[b+I>>0]|0):0){d:do if(H){w=0;x=J}else{w=0;x=J;do{N=b+(w+z)|0;if((l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break d;x=x+4|0;w=w+4|0}while(x>>>0<=G>>>0)}while(0);e:do if(x>>>0>>0)do{if((i[b+(w+z)>>0]|0)!=(i[x>>0]|0))break e;x=x+1|0;w=w+1|0}while(x>>>0>>0);while(0);if(w>>>0>=4){if((A|0)==(h|0))y=-1.2;else y=+((ja(B|0)|0)^31|0)*1.2;y=+(w|0)*f-y;if(t>2]=d;k[q>>2]=d;k[r>>2]=v;p[s>>3]=t;if((e|0)>(E|0)){v=d;d=1}else{d=1;break}}return d|0}else y=t;while(0);if(d){N=1;return N|0}C=a+1081348|0;g=k[C>>2]|0;z=a+1081344|0;A=k[z>>2]|0;if(g>>>0>>7>>>0){N=0;return N|0}x=(ha(l[J>>0]|l[J+1>>0]<<8|l[J+2>>0]<<16|l[J+3>>0]<<24,506832829)|0)>>>18<<1;B=n+1|0;k[z>>2]=A+1;N=j[6488+(x<<1)>>1]|0;d=N&65535;if(N<<16>>16!=0?(u=d&31,K=d>>>5,u>>>0<=m>>>0):0){v=(k[2420+(u<<2)>>2]|0)+(ha(u,K)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;f:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break f;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);g:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break g;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)==(u|0)){d=B+K|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=A+2;N=j[6488+((x|1)<<1)>>1]|0;d=N&65535;if(!(N<<16>>16)){N=0;return N|0}u=d&31;x=d>>>5;if(u>>>0>m>>>0){N=0;return N|0}v=(k[2420+(u<<2)>>2]|0)+(ha(u,x)|0)|0;e=72438+v|0;w=72438+(v+u)|0;v=72438+(u+-4+v)|0;h:do if(u>>>0<4)d=0;else{d=0;do{N=b+(d+M)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24|0))break h;e=e+4|0;d=d+4|0}while(e>>>0<=v>>>0)}while(0);i:do if(e>>>0>>0)do{if((i[b+(d+M)>>0]|0)!=(i[e>>0]|0))break i;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)!=(u|0)){N=0;return N|0}d=B+x|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(u|0)*f-t;if(!(y>2]=g+1;k[o>>2]=u;k[q>>2]=u;k[r>>2]=d;p[s>>3]=t;N=1;return N|0}function Cd(a,b,c,d,e,f,g,h,m,n,o,q,r,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;m=m|0;n=n|0;o=o|0;q=q|0;r=r|0;s=s|0;var t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0.0,E=0,F=0,G=0;x=k[o>>2]|0;F=h&c;e=i[b+(x+F)>>0]|0;v=e&255;t=+p[s>>3];w=k[g>>2]|0;d=h-w|0;if(d>>>0>>0?(y=d&c,e<<24>>24==(i[b+(y+x)>>0]|0)):0){e=b+F|0;u=b+(F+m)|0;E=m+-4|0;g=b+(E+F)|0;a:do if((E|0)<0)d=0;else{d=0;do{E=b+(d+y)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[E>>0]|l[E+1>>0]<<8|l[E+2>>0]<<16|l[E+3>>0]<<24|0))break a;e=e+4|0;d=d+4|0}while(e>>>0<=g>>>0)}while(0);b:do if(e>>>0>>0)do{if((i[b+(d+y)>>0]|0)!=(i[e>>0]|0))break b;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)>3){t=+(d|0)*f+.6;k[o>>2]=d;k[q>>2]=d;k[r>>2]=w;p[s>>3]=t;g=d;v=l[b+(d+F)>>0]|0;d=1}else{g=x;d=0}}else{g=x;d=0}E=b+F|0;w=(ha(l[E>>0]|l[E+1>>0]<<8|l[E+2>>0]<<16|l[E+3>>0]<<24,506832829)|0)>>>15;u=a+(w+1<<2)|0;w=k[a+(w<<2)>>2]|0;e=F+m|0;C=b+e|0;z=m+-4|0;B=b+(z+F)|0;if((z|0)<0){B=(F|0)<(e|0);z=u;x=v;y=0;u=w;while(1){w=h-u|0;v=u&c;if(!(w>>>0>n>>>0|((u|0)==(h|0)?1:(x|0)!=(l[b+(v+g)>>0]|0)))?B:0){e=0;u=E;do{if((i[b+(e+v)>>0]|0)!=(i[u>>0]|0))break;u=u+1|0;e=e+1|0}while(u>>>0>>0);if((e|0)>3?(A=+(e|0)*f-+((ja(w|0)|0)^31|0)*1.2,t>2]=e;k[q>>2]=e;k[r>>2]=w;p[s>>3]=A;g=e;t=A;e=l[b+(e+F)>>0]|0;d=1}else e=x}else e=x;y=y+1|0;u=k[z>>2]|0;if((y|0)==4){A=t;break}else{z=z+4|0;x=e}}}else{z=u;y=0;u=w;while(1){x=h-u|0;w=u&c;if(!(x>>>0>n>>>0|((u|0)==(h|0)?1:(v|0)!=(l[b+(w+g)>>0]|0)))){e=0;u=E;do{G=b+(e+w)|0;if((l[u>>0]|l[u+1>>0]<<8|l[u+2>>0]<<16|l[u+3>>0]<<24|0)!=(l[G>>0]|l[G+1>>0]<<8|l[G+2>>0]<<16|l[G+3>>0]<<24|0))break;u=u+4|0;e=e+4|0}while(u>>>0<=B>>>0);c:do if(u>>>0>>0)do{if((i[b+(e+w)>>0]|0)!=(i[u>>0]|0))break c;u=u+1|0;e=e+1|0}while(u>>>0>>0);while(0);if((e|0)>3?(D=+(e|0)*f-+((ja(x|0)|0)^31|0)*1.2,t>2]=e;k[q>>2]=e;k[r>>2]=x;p[s>>3]=D;g=e;t=D;e=l[b+(e+F)>>0]|0;d=1}else e=v}else e=v;y=y+1|0;u=k[z>>2]|0;if((y|0)==4){A=t;break}else{z=z+4|0;v=e}}}if(d){G=1;return G|0}x=a+524308|0;y=k[x>>2]|0;d=a+524304|0;e=k[d>>2]|0;if(y>>>0>>7>>>0){G=0;return G|0}k[d>>2]=e+1;G=6488+((ha(l[E>>0]|l[E+1>>0]<<8|l[E+2>>0]<<16|l[E+3>>0]<<24,506832829)|0)>>>18<<1<<1)|0;G=j[G>>1]|0;d=G&65535;if(!(G<<16>>16)){G=0;return G|0}w=d&31;v=d>>>5;if(w>>>0>m>>>0){G=0;return G|0}g=(k[2420+(w<<2)>>2]|0)+(ha(w,v)|0)|0;e=72438+g|0;u=72438+(g+w)|0;g=72438+(w+-4+g)|0;d:do if(w>>>0<4)d=0;else{d=0;do{G=b+(d+F)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[G>>0]|l[G+1>>0]<<8|l[G+2>>0]<<16|l[G+3>>0]<<24|0))break d;e=e+4|0;d=d+4|0}while(e>>>0<=g>>>0)}while(0);e:do if(e>>>0>>0)do{if((i[b+(d+F)>>0]|0)!=(i[e>>0]|0))break e;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)!=(w|0)){G=0;return G|0}d=n+1+v|0;if(!d)t=-1.2;else t=+((ja(d|0)|0)^31|0)*1.2;t=+(w|0)*f-t;if(!(A>2]=y+1;k[o>>2]=w;k[q>>2]=w;k[r>>2]=d;p[s>>3]=t;G=1;return G|0}function Dd(a,b,c,d,e,f,g,h,j,m,n,o,q,r){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;j=j|0;m=m|0;n=n|0;o=o|0;q=q|0;r=r|0;var s=0,t=0,u=0,v=0,w=0,x=0,y=0;v=k[n>>2]|0;x=h&c;w=i[b+(v+x)>>0]|0;t=k[g>>2]|0;d=h-t|0;if(d>>>0>>0?(u=d&c,w<<24>>24==(i[b+(u+v)>>0]|0)):0){e=b+x|0;s=b+(x+j)|0;d=j+-4|0;g=b+(d+x)|0;a:do if((d|0)<0)d=0;else{d=0;do{y=b+(d+u)|0;if((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)!=(l[y>>0]|l[y+1>>0]<<8|l[y+2>>0]<<16|l[y+3>>0]<<24|0))break a;e=e+4|0;d=d+4|0}while(e>>>0<=g>>>0)}while(0);b:do if(e>>>0>>0)do{if((i[b+(d+u)>>0]|0)!=(i[e>>0]|0))break b;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)>3){k[n>>2]=d;k[o>>2]=d;k[q>>2]=t;p[r>>3]=+(d|0)*f+.6;y=1;return y|0}}e=b+x|0;s=l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24;d=a+((ha(s,506832829)|0)>>>16<<2)|0;d=k[d>>2]|0;a=h-d|0;u=d&c;if(w<<24>>24!=(i[b+(u+v)>>0]|0)){y=0;return y|0}if((d|0)==(h|0)|a>>>0>m>>>0){y=0;return y|0}t=b+(x+j)|0;y=j+-4|0;g=b+(y+x)|0;c:do if((y|0)>=0?(y=b+u|0,(s|0)==(l[y>>0]|l[y+1>>0]<<8|l[y+2>>0]<<16|l[y+3>>0]<<24|0)):0){d=0;do{e=e+4|0;d=d+4|0;if(e>>>0>g>>>0)break c;y=b+(d+u)|0}while((l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24|0)==(l[y>>0]|l[y+1>>0]<<8|l[y+2>>0]<<16|l[y+3>>0]<<24|0))}else d=0;while(0);d:do if(e>>>0>>0)do{if((i[b+(d+u)>>0]|0)!=(i[e>>0]|0))break d;e=e+1|0;d=d+1|0}while(e>>>0>>0);while(0);if((d|0)<=3){y=0;return y|0}k[n>>2]=d;k[o>>2]=d;k[q>>2]=a;f=+(d|0)*f-+((ja(a|0)|0)^31|0)*1.2;p[r>>3]=f;y=1;return y|0}function Ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if(!b)return;r=c+4|0;s=c+8|0;t=d+4|0;u=d+8|0;v=0;a:while(1){o=a+(v<<5)+8|0;f=k[r>>2]|0;if((f|0)==(k[s>>2]|0)){l=k[c>>2]|0;n=l;q=f-n|0;e=(q>>1)+1|0;if((q|0)<-2){w=6;break}q=l;h=f-q|0;h=h>>1>>>0<1073741823?(h>>>0>>0?e:h):2147483647;e=f-q|0;f=e>>1;if(!h)g=0;else g=og(h<<1)|0;j[g+(f<<1)>>1]=j[o>>1]|0;ki(g|0,l|0,e|0)|0;k[c>>2]=g;k[r>>2]=g+(f+1<<1);k[s>>2]=g+(h<<1);if(n)rg(n)}else{j[f>>1]=j[o>>1]|0;k[r>>2]=f+2}do if((k[a+(v<<5)+4>>2]|0)>0?(m[o>>1]|0)>127:0){o=j[a+(v<<5)+10>>1]&255;e=k[t>>2]|0;f=k[u>>2]|0;if(e>>>0>>0){i[e>>0]=o;k[t>>2]=(k[t>>2]|0)+1;break}p=k[d>>2]|0;q=p;g=e-q+1|0;if((g|0)<0){w=16;break a}n=p;e=f-n|0;if(e>>>0<1073741823){e=e<<1;e=e>>>0>>0?g:e;g=k[t>>2]|0;f=g-n|0;if(!e){l=0;h=0;e=g}else w=20}else{f=k[t>>2]|0;e=2147483647;g=f;f=f-n|0;w=20}if((w|0)==20){w=0;l=e;h=og(e)|0;e=g}i[h+f>>0]=o;n=e-n|0;o=h+(f-n)|0;ki(o|0,p|0,n|0)|0;k[d>>2]=o;k[t>>2]=h+(f+1);k[u>>2]=h+l;if(q)rg(q)}while(0);v=v+1|0;if((v|0)==(b|0)){w=24;break}}if((w|0)==6)mg(c);else if((w|0)==16)mg(d);else if((w|0)==24)return}function Fd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0;v=r;r=r+16|0;t=v+12|0;u=v;q=u+4|0;k[q>>2]=0;s=u+8|0;k[s>>2]=0;d=u+4|0;k[u>>2]=d;o=(b|0)==0;if(!o){n=d;f=0;e=0;c=0;while(1){m=a+e|0;if(f){j=i[m>>0]|0;g=d;h=f;a:do{while(1){if((l[h+13>>0]|0)>=(j&255)){g=h;break}h=k[h+4>>2]|0;if(!h)break a}h=k[g>>2]|0}while((h|0)!=0);if(!((g|0)!=(d|0)?(j&255)>=(l[g+13>>0]|0):0))p=14}else p=14;if((p|0)==14){do if(f){j=i[m>>0]|0;while(1){g=i[f+13>>0]|0;if((j&255)<(g&255)){g=k[f>>2]|0;if(!g){g=f;p=18;break}else f=g}else{if((g&255)>=(j&255)){p=24;break}g=f+4|0;h=k[g>>2]|0;if(!h){p=22;break}else f=h}}if((p|0)==18){k[t>>2]=f;h=g;g=f;p=25;break}else if((p|0)==22){k[t>>2]=f;h=g;g=f;p=25;break}else if((p|0)==24){p=0;k[t>>2]=f;if(!f){h=t;g=f;p=25;break}else break}}else{k[t>>2]=d;h=d;g=n;p=25}while(0);if((p|0)==25){p=0;f=og(16)|0;i[f+13>>0]=i[m>>0]|0;i[f+14>>0]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=g;k[h>>2]=f;g=k[k[u>>2]>>2]|0;if(!g)g=f;else{k[u>>2]=g;g=k[h>>2]|0}Hc(k[q>>2]|0,g);k[s>>2]=(k[s>>2]|0)+1}i[f+14>>0]=c;c=c+1|0}e=e+1|0;if(e>>>0>=b>>>0)break;f=k[d>>2]|0}if(!o){j=d;n=0;do{m=a+n|0;e=k[d>>2]|0;do if(e){h=i[m>>0]|0;while(1){f=i[e+13>>0]|0;if((h&255)<(f&255)){f=k[e>>2]|0;if(!f){f=e;p=35;break}else e=f}else{if((f&255)>=(h&255)){p=41;break}f=e+4|0;g=k[f>>2]|0;if(!g){p=39;break}else e=g}}if((p|0)==35){k[t>>2]=e;p=42;break}else if((p|0)==39){k[t>>2]=e;p=42;break}else if((p|0)==41){p=0;k[t>>2]=e;if(!e){f=t;p=42;break}else break}}else{k[t>>2]=d;f=d;e=j;p=42}while(0);if((p|0)==42){g=og(16)|0;i[g+13>>0]=i[m>>0]|0;i[g+14>>0]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=e;k[f>>2]=g;e=k[k[u>>2]>>2]|0;if(!e)e=g;else{k[u>>2]=e;e=k[f>>2]|0}Hc(k[q>>2]|0,e);k[s>>2]=(k[s>>2]|0)+1;e=g}i[m>>0]=i[e+14>>0]|0;n=n+1|0}while(n>>>0>>0);b=k[d>>2]|0;Id(u,b);r=v;return c|0}}else c=0;a=d;b=c;a=k[a>>2]|0;Id(u,a);r=v;return b|0}function Gd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0;u=r;r=r+16|0;s=u+4|0;t=u;c=k[a>>2]|0;f=l[c>>0]|0;k[s>>2]=f;k[t>>2]=1;k[b>>2]=-1;o=a+4|0;d=k[o>>2]|0;q=b+8|0;p=b+12|0;if((d-c|0)>>>0>1){i=b+4|0;j=b+20|0;m=b+24|0;n=b+16|0;g=f;e=1;h=1;do{if((l[c+h>>0]|0|0)!=(g|0)){c=k[q>>2]|0;if((c|0)==(k[p>>2]|0))Jd(i,s);else{k[c>>2]=g;k[q>>2]=c+4}c=k[j>>2]|0;if((c|0)==(k[m>>2]|0))Jd(n,t);else{k[c>>2]=e;k[j>>2]=c+4}c=k[b>>2]|0;k[b>>2]=(c|0)<(f|0)?f:c;c=k[a>>2]|0;g=l[c+h>>0]|0;k[s>>2]=g;k[t>>2]=0;e=0;d=k[o>>2]|0;f=g}e=e+1|0;k[t>>2]=e;h=h+1|0}while(h>>>0<(d-c|0)>>>0)}else e=1;c=k[q>>2]|0;if((c|0)==(k[p>>2]|0))Jd(b+4|0,s);else{k[c>>2]=f;k[q>>2]=c+4}c=b+20|0;d=k[c>>2]|0;if((d|0)==(k[b+24>>2]|0)){Jd(b+16|0,t);t=k[b>>2]|0;s=(t|0)<(f|0);t=s?f:t;t=t+1|0;k[b>>2]=t;r=u;return}else{k[d>>2]=e;k[c>>2]=d+4;t=k[b>>2]|0;s=(t|0)<(f|0);t=s?f:t;t=t+1|0;k[b>>2]=t;r=u;return}}function Hd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+48|0;p=s+24|0;o=s+12|0;n=s;k[p>>2]=0;q=p+4|0;k[q>>2]=0;k[p+8>>2]=0;if(b){h=0;g=0;do{g=(k[a+(h<<5)>>2]|0)+g|0;h=h+1|0}while((h|0)!=(b|0));if(g){uc(p,g);j=0;l=0;m=0;while(1){h=a+(l<<5)|0;ki((k[p>>2]|0)+m|0,c+j|0,k[h>>2]|0)|0;h=k[h>>2]|0;m=h+m|0;i=l+1|0;if(!(i>>>0>>0&m>>>0>>0))break;else{j=h+j+(k[a+(l<<5)+4>>2]|0)|0;l=i}}}}k[o>>2]=0;j=o+4|0;k[j>>2]=0;k[o+8>>2]=0;k[n>>2]=0;h=n+4|0;k[h>>2]=0;k[n+8>>2]=0;Ed(a,b,o,n);Kd(p,544,100,70,28.1,d);Ld(o,530,50,40,13.5,e);Md(n,544,50,40,14.6,f);g=k[n>>2]|0;if(g){if((k[h>>2]|0)!=(g|0))k[h>>2]=g;rg(g)}g=k[o>>2]|0;h=g;if(g){i=k[j>>2]|0;if((i|0)!=(g|0))k[j>>2]=i+(~((i+-2-h|0)>>>1)<<1);rg(g)}g=k[p>>2]|0;if(!g){r=s;return}if((k[q>>2]|0)!=(g|0))k[q>>2]=g;rg(g);r=s;return}function Id(a,b){a=a|0;b=b|0;if(!b)return;else{Id(a,k[b>>2]|0);Id(a,k[b+4>>2]|0);rg(b);return}}function Jd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;h=a+4|0;i=k[a>>2]|0;j=i;d=((k[h>>2]|0)-j>>2)+1|0;if(d>>>0>1073741823)mg(a);l=a+8|0;e=i;c=(k[l>>2]|0)-e|0;if(c>>2>>>0<536870911){c=c>>1;c=c>>>0>>0?d:c;e=(k[h>>2]|0)-e|0;d=e>>2;if(!c){g=0;f=0;c=e}else m=6}else{e=(k[h>>2]|0)-e|0;c=1073741823;d=e>>2;m=6}if((m|0)==6){g=c;f=og(c<<2)|0;c=e}k[f+(d<<2)>>2]=k[b>>2];ki(f|0,i|0,c|0)|0;k[a>>2]=f;k[h>>2]=f+(d+1<<2);k[l>>2]=f+(g<<2);if(!j)return;rg(j);return}function Kd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;var g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+32|0;l=q+28|0;m=q+24|0;p=q+12|0;o=q;g=k[a>>2]|0;n=a+4|0;h=k[n>>2]|0;if((g|0)==(h|0)){k[f>>2]=1;r=q;return}j=h-g|0;if(j>>>0<128){k[f>>2]=1;k[l>>2]=0;j=f+8|0;b=k[j>>2]|0;if(b>>>0<(k[f+12>>2]|0)>>>0){k[b>>2]=0;k[j>>2]=b+4}else{Nd(f+4|0,l);h=k[n>>2]|0;g=k[a>>2]|0}g=h-g|0;k[m>>2]=g;h=f+20|0;j=k[h>>2]|0;if(j>>>0<(k[f+24>>2]|0)>>>0){k[j>>2]=g;k[h>>2]=j+4;r=q;return}else{Nd(f+16|0,m);r=q;return}}k[p>>2]=0;l=p+4|0;k[l>>2]=0;k[p+8>>2]=0;pe(g,j,b,c,d,p);h=k[a>>2]|0;qe(h,(k[n>>2]|0)-h|0,d,p);h=k[n>>2]|0;m=k[a>>2]|0;g=h-m|0;k[o>>2]=0;c=o+4|0;k[c>>2]=0;k[o+8>>2]=0;if((h|0)==(m|0)){b=h;g=0}else{if((g|0)<0)mg(o);h=og(g)|0;k[c>>2]=h;k[o>>2]=h;k[o+8>>2]=h+g;do{i[h>>0]=0;h=(k[c>>2]|0)+1|0;k[c>>2]=h;g=g+-1|0}while((g|0)!=0);b=k[n>>2]|0;h=k[a>>2]|0;g=k[o>>2]|0}j=h;h=b-h|0;b=0;do{re(j,h,e,p,g);j=k[a>>2]|0;se(j,(k[n>>2]|0)-j|0,k[o>>2]|0,p);b=b+1|0;j=k[a>>2]|0;h=(k[n>>2]|0)-j|0;g=k[o>>2]|0}while((b|0)<10);te(j,h,g);Gd(o,f);g=k[o>>2]|0;if(g){if((k[c>>2]|0)!=(g|0))k[c>>2]=g;rg(g)}g=k[p>>2]|0;if(!g){r=q;return}h=k[l>>2]|0;if((h|0)!=(g|0))k[l>>2]=h+(~(((h+-1040-g|0)>>>0)/1040|0)*1040|0);rg(g);r=q;return}function Ld(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;var g=0,h=0,j=0,l=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;B=r;r=r+2864|0;w=B;j=B+2860|0;l=B+2856|0;A=B+2844|0;y=B+2832|0;g=k[a>>2]|0;x=a+4|0;h=k[x>>2]|0;if((g|0)==(h|0)){k[f>>2]=1;r=B;return}u=h-g>>1;if(u>>>0<128){k[f>>2]=1;k[j>>2]=0;b=f+8|0;c=k[b>>2]|0;if(c>>>0<(k[f+12>>2]|0)>>>0){k[c>>2]=0;k[b>>2]=c+4}else{Nd(f+4|0,j);h=k[x>>2]|0;g=k[a>>2]|0}g=h-g>>1;k[l>>2]=g;h=f+20|0;b=k[h>>2]|0;if(b>>>0<(k[f+24>>2]|0)>>>0){k[b>>2]=g;k[h>>2]=b+4;r=B;return}else{Nd(f+16|0,l);r=B;return}}k[A>>2]=0;z=A+4|0;k[z>>2]=0;k[A+8>>2]=0;b=((u>>>0)/(b>>>0)|0)+1|0;t=(b|0)>(c|0)?c:b;s=(u>>>0)/(t>>>0)|0;if((t|0)>0){n=u+~d|0;o=w+2816|0;p=(d|0)==0;q=A+8|0;j=(b|0)<(c|0)?b:c;h=7;l=0;do{b=((ha(l,u)|0)>>>0)/(t>>>0)|0;if(l){v=h*16807|0;v=(v|0)==0?1:v;h=v;b=((v>>>0)%(s>>>0)|0)+b|0}gi(w|0,0,2816)|0;k[o>>2]=d;if(!p){b=g+(((b+d|0)>>>0>>0?b:n)<<1)|0;c=d;while(1){v=w+((m[b>>1]|0)<<2)|0;k[v>>2]=(k[v>>2]|0)+1;c=c+-1|0;if(!c)break;else b=b+2|0}}b=k[z>>2]|0;if((b|0)==(k[q>>2]|0))ee(A,w);else{ki(b|0,w|0,2832)|0;k[z>>2]=b+2832}l=l+1|0}while((l|0)!=(j|0));h=k[x>>2]|0;g=k[a>>2]|0;b=k[z>>2]|0;t=k[A>>2]|0}else{b=0;t=0}u=h-g|0;v=u>>1;l=(b-t|0)/2832|0;n=((u>>>0)/(d>>>0)|0)+99+l|0;n=n-((n>>>0)%(l>>>0)|0)|0;if((n|0)>0){o=v>>>0>d>>>0;p=1-d+v|0;q=w+2816|0;b=7;s=0;do{gi(w|0,0,2820)|0;if(o){j=b*16807|0;j=(j|0)==0?1:j;c=d;b=j;j=(j>>>0)%(p>>>0)|0}else{c=v;j=0}k[q>>2]=c;if(!c)c=0;else{j=g+(j<<1)|0;while(1){C=w+((m[j>>1]|0)<<2)|0;k[C>>2]=(k[C>>2]|0)+1;c=c+-1|0;if(!c)break;else j=j+2|0}c=k[q>>2]|0}j=(s>>>0)%(l>>>0)|0;C=t+(j*2832|0)+2816|0;k[C>>2]=(k[C>>2]|0)+c;c=0;do{C=t+(j*2832|0)+(c<<2)|0;k[C>>2]=(k[C>>2]|0)+(k[w+(c<<2)>>2]|0);c=c+1|0}while((c|0)!=704);s=s+1|0}while((s|0)<(n|0))}k[y>>2]=0;j=y+4|0;k[j>>2]=0;k[y+8>>2]=0;if(!v)c=0;else{if((u|0)<0)mg(y);h=og(v)|0;k[j>>2]=h;k[y>>2]=h;k[y+8>>2]=h+v;g=v;do{i[h>>0]=0;h=(k[j>>2]|0)+1|0;k[j>>2]=h;g=g+-1|0}while((g|0)!=0);h=k[x>>2]|0;g=k[a>>2]|0;c=k[y>>2]|0}b=g;h=h-g>>1;g=c;c=0;do{fe(b,h,e,A,g);b=k[a>>2]|0;ge(b,(k[x>>2]|0)-b>>1,k[y>>2]|0,A);c=c+1|0;b=k[a>>2]|0;h=(k[x>>2]|0)-b>>1;g=k[y>>2]|0}while((c|0)<10);he(b,h,g);Gd(y,f);g=k[y>>2]|0;if(g){if((k[j>>2]|0)!=(g|0))k[j>>2]=g;rg(g)}g=k[A>>2]|0;if(!g){r=B;return}h=k[z>>2]|0;if((h|0)!=(g|0))k[z>>2]=h+(~(((h+-2832-g|0)>>>0)/2832|0)*2832|0);rg(g);r=B;return}function Md(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=f|0;var g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;A=r;r=r+2128|0;v=A;j=A+2124|0;m=A+2120|0;z=A+2108|0;x=A+2096|0;g=k[a>>2]|0;w=a+4|0;h=k[w>>2]|0;if((g|0)==(h|0)){k[f>>2]=1;r=A;return}u=h-g|0;if(u>>>0<128){k[f>>2]=1;k[j>>2]=0;b=f+8|0;c=k[b>>2]|0;if(c>>>0<(k[f+12>>2]|0)>>>0){k[c>>2]=0;k[b>>2]=c+4}else{Nd(f+4|0,j);h=k[w>>2]|0;g=k[a>>2]|0}g=h-g|0;k[m>>2]=g;h=f+20|0;b=k[h>>2]|0;if(b>>>0<(k[f+24>>2]|0)>>>0){k[b>>2]=g;k[h>>2]=b+4;r=A;return}else{Nd(f+16|0,m);r=A;return}}k[z>>2]=0;y=z+4|0;k[y>>2]=0;k[z+8>>2]=0;b=((u>>>0)/(b>>>0)|0)+1|0;t=(b|0)>(c|0)?c:b;s=(u>>>0)/(t>>>0)|0;if((t|0)>0){n=u+~d|0;o=v+2080|0;p=(d|0)==0;q=z+8|0;j=(b|0)<(c|0)?b:c;h=7;m=0;do{b=((ha(m,u)|0)>>>0)/(t>>>0)|0;if(m){c=h*16807|0;c=(c|0)==0?1:c;h=c;b=((c>>>0)%(s>>>0)|0)+b|0}gi(v|0,0,2080)|0;k[o>>2]=d;if(!p){b=g+((b+d|0)>>>0>>0?b:n)|0;c=d;while(1){B=v+((l[b>>0]|0)<<2)|0;k[B>>2]=(k[B>>2]|0)+1;c=c+-1|0;if(!c)break;else b=b+1|0}}b=k[y>>2]|0;if((b|0)==(k[q>>2]|0))Od(z,v);else{ki(b|0,v|0,2096)|0;k[y>>2]=b+2096}m=m+1|0}while((m|0)!=(j|0));h=k[w>>2]|0;g=k[a>>2]|0;b=k[y>>2]|0;t=k[z>>2]|0}else{b=0;t=0}u=h-g|0;m=(b-t|0)/2096|0;n=((u<<1>>>0)/(d>>>0)|0)+99+m|0;n=n-((n>>>0)%(m>>>0)|0)|0;if((n|0)>0){o=u>>>0>d>>>0;p=1-d+u|0;q=v+2080|0;b=7;s=0;do{gi(v|0,0,2084)|0;if(o){j=b*16807|0;j=(j|0)==0?1:j;c=d;b=j;j=(j>>>0)%(p>>>0)|0}else{c=u;j=0}k[q>>2]=c;if(!c)c=0;else{j=g+j|0;while(1){B=v+((l[j>>0]|0)<<2)|0;k[B>>2]=(k[B>>2]|0)+1;c=c+-1|0;if(!c)break;else j=j+1|0}c=k[q>>2]|0}j=(s>>>0)%(m>>>0)|0;B=t+(j*2096|0)+2080|0;k[B>>2]=(k[B>>2]|0)+c;c=0;do{B=t+(j*2096|0)+(c<<2)|0;k[B>>2]=(k[B>>2]|0)+(k[v+(c<<2)>>2]|0);c=c+1|0}while((c|0)!=520);s=s+1|0}while((s|0)<(n|0))}k[x>>2]=0;j=x+4|0;k[j>>2]=0;k[x+8>>2]=0;if((h|0)==(g|0)){c=h;g=0}else{if((u|0)<0)mg(x);h=og(u)|0;k[j>>2]=h;k[x>>2]=h;k[x+8>>2]=h+u;g=u;do{i[h>>0]=0;h=(k[j>>2]|0)+1|0;k[j>>2]=h;g=g+-1|0}while((g|0)!=0);c=k[w>>2]|0;h=k[a>>2]|0;g=k[x>>2]|0}b=h;h=c-h|0;c=0;do{Pd(b,h,e,z,g);b=k[a>>2]|0;Qd(b,(k[w>>2]|0)-b|0,k[x>>2]|0,z);c=c+1|0;b=k[a>>2]|0;h=(k[w>>2]|0)-b|0;g=k[x>>2]|0}while((c|0)<10);Rd(b,h,g);Gd(x,f);g=k[x>>2]|0;if(g){if((k[j>>2]|0)!=(g|0))k[j>>2]=g;rg(g)}g=k[z>>2]|0;if(!g){r=A;return}h=k[y>>2]|0;if((h|0)!=(g|0))k[y>>2]=h+(~(((h+-2096-g|0)>>>0)/2096|0)*2096|0);rg(g);r=A;return}function Nd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;h=a+4|0;i=k[a>>2]|0;j=i;d=((k[h>>2]|0)-j>>2)+1|0;if(d>>>0>1073741823)mg(a);l=a+8|0;e=i;c=(k[l>>2]|0)-e|0;if(c>>2>>>0<536870911){c=c>>1;c=c>>>0>>0?d:c;e=(k[h>>2]|0)-e|0;d=e>>2;if(!c){g=0;f=0;c=e}else m=6}else{e=(k[h>>2]|0)-e|0;c=1073741823;d=e>>2;m=6}if((m|0)==6){g=c;f=og(c<<2)|0;c=e}k[f+(d<<2)>>2]=k[b>>2];ki(f|0,i|0,c|0)|0;k[a>>2]=f;k[h>>2]=f+(d+1<<2);k[l>>2]=f+(g<<2);if(!j)return;rg(j);return}function Od(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;h=a+4|0;i=k[a>>2]|0;j=i;d=(((k[h>>2]|0)-j|0)/2096|0)+1|0;if(d>>>0>2049125)mg(a);l=a+8|0;e=i;c=((k[l>>2]|0)-e|0)/2096|0;if(c>>>0<1024562){c=c<<1;c=c>>>0>>0?d:c;e=(k[h>>2]|0)-e|0;d=(e|0)/2096|0;if(!c){g=0;f=0;c=e}else m=6}else{e=(k[h>>2]|0)-e|0;c=2049125;d=(e|0)/2096|0;m=6}if((m|0)==6){g=c;f=og(c*2096|0)|0;c=e}ki(f+(d*2096|0)|0,b|0,2096)|0;m=f+((((c|0)/-2096|0)+d|0)*2096|0)|0;ki(m|0,i|0,c|0)|0;k[a>>2]=m;k[h>>2]=f+((d+1|0)*2096|0);k[l>>2]=f+(g*2096|0);if(!j)return;rg(j);return}function Pd(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,m=0.0,n=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0.0;n=k[d>>2]|0;d=(k[d+4>>2]|0)-n|0;v=(d|0)/2096|0;if(v>>>0<2){if(!b)return;gi(e|0,0,b|0)|0;return}u=v*520|0;u=qg(u>>>0>536870911?-1:u<<3)|0;gi(u|0,0,v*4160|0)|0;t=(d|0)>0;h=0;do{if(t){g=ha(h,v)|0;j=0;do{d=k[n+(j*2096|0)+2080>>2]|0;f=k[n+(j*2096|0)+(h<<2)>>2]|0;if((d|0)<256)q=+o[4036+(d<<2)>>2];else q=+oh(+(d|0));if(!f)m=q+2.0;else{if((f|0)<256)m=+o[4036+(f<<2)>>2];else m=+oh(+(f|0));m=q-m}p[u+(j+g<<3)>>3]=m;j=j+1|0}while((j|0)<(v|0))}h=h+1|0}while((h|0)!=520);r=qg(v>>>0>536870911?-1:v<<3)|0;gi(r|0,0,v<<3|0)|0;n=ha(v,b)|0;s=qg(n)|0;gi(s|0,0,n|0)|0;if(b){j=0;do{h=ha(j,v)|0;d=ha(l[a+j>>0]|0,v)|0;if(t){f=e+j|0;g=0;m=1.e+99;while(1){n=r+(g<<3)|0;q=+p[u+(g+d<<3)>>3]+ +p[n>>3];p[n>>3]=q;if(q>0]=g;else q=m;g=g+1|0;if((g|0)>=(v|0))break;else m=q}}else q=1.e+99;if(j>>>0<2e3)m=(+(j>>>0)*.07/2.0e3+.77)*c;else m=c;if(t){f=0;do{d=r+(f<<3)|0;w=+p[d>>3]-q;p[d>>3]=w;if(w>=m){p[d>>3]=m;i[s+(f+h)>>0]=1}f=f+1|0}while((f|0)<(v|0))}j=j+1|0}while((j|0)!=(b|0));d=b+-1|0;if((d|0)>0){n=d;h=l[e+d>>0]|0;j=ha(v,d)|0;while(1){g=n;n=n+-1|0;j=j-v|0;f=e+n|0;if(!(i[s+(j+h)>>0]|0))d=h;else d=l[f>>0]|0;i[f>>0]=d;if((g|0)<=1)break;else h=d}}}sg(u);sg(r);sg(s);return}function Qd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,m=0;h=Fd(c,b)|0;i=k[d>>2]|0;m=d+4|0;e=k[m>>2]|0;f=i;if((e|0)==(i|0))g=i;else{g=e+(~(((e+-2096-f|0)>>>0)/2096|0)*2096|0)|0;k[m>>2]=g}e=(g-f|0)/2096|0;if(h>>>0<=e>>>0){if(h>>>0>>0?(j=i+(h*2096|0)|0,(g|0)!=(j|0)):0)k[m>>2]=g+(~(((g+-2096-j|0)>>>0)/2096|0)*2096|0)}else Td(d,h-e|0);if(!b)return;e=k[d>>2]|0;f=0;do{d=l[c+f>>0]|0;m=e+(d*2096|0)+((l[a+f>>0]|0)<<2)|0;k[m>>2]=(k[m>>2]|0)+1;d=e+(d*2096|0)+2080|0;k[d>>2]=(k[d>>2]|0)+1;f=f+1|0}while((f|0)!=(b|0));return}function Rd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0;w=r;r=r+2144|0;u=w+2132|0;s=w+2120|0;m=w;q=w+2108|0;o=w+2096|0;k[u>>2]=0;v=u+4|0;k[v>>2]=0;k[u+8>>2]=0;k[s>>2]=0;t=s+4|0;k[t>>2]=0;k[s+8>>2]=0;n=(b|0)==0;do if(!n)if(b>>>0>1073741823)mg(s);else{h=b<<2;d=og(h)|0;k[s>>2]=d;j=d+(b<<2)|0;k[s+8>>2]=j;gi(d|0,0,h|0)|0;k[t>>2]=j;break}else d=0;while(0);gi(m|0,0,2084)|0;h=m+2080|0;j=u+8|0;g=0;e=0;a:while(1){while(1){if(e>>>0>=b>>>0)break a;f=e+1|0;if((f|0)==(b|0)){p=10;break}x=(i[c+e>>0]|0)==(i[c+f>>0]|0);k[d+(e<<2)>>2]=g;e=m+(l[a+e>>0]<<2)|0;k[e>>2]=(k[e>>2]|0)+1;k[h>>2]=(k[h>>2]|0)+1;if(x)e=f;else{e=f;break}}if((p|0)==10){p=0;k[d+(e<<2)>>2]=g;e=m+(l[a+e>>0]<<2)|0;k[e>>2]=(k[e>>2]|0)+1;k[h>>2]=(k[h>>2]|0)+1;e=b}f=k[v>>2]|0;if((f|0)==(k[j>>2]|0)){Od(u,m);d=k[s>>2]|0}else{ki(f|0,m|0,2096)|0;k[v>>2]=f+2096}gi(m|0,0,2084)|0;g=g+1|0}k[q>>2]=0;h=q+4|0;k[h>>2]=0;k[q+8>>2]=0;k[o>>2]=0;g=o+4|0;k[g>>2]=0;k[o+8>>2]=0;Sd(u,1,((k[v>>2]|0)-(k[u>>2]|0)|0)/2096|0,256,q,o);if(n){d=k[o>>2]|0;if(d)p=19}else{f=k[s>>2]|0;d=k[o>>2]|0;e=0;do{i[c+e>>0]=k[d+(k[f+(e<<2)>>2]<<2)>>2];e=e+1|0}while((e|0)!=(b|0));p=19}if((p|0)==19){e=k[g>>2]|0;if((e|0)!=(d|0))k[g>>2]=e+(~((e+-4-d|0)>>>2)<<2);rg(d)}d=k[q>>2]|0;e=d;if(d){f=k[h>>2]|0;if((f|0)!=(d|0))k[h>>2]=f+(~(((f+-2096-e|0)>>>0)/2096|0)*2096|0);rg(d)}d=k[s>>2]|0;e=d;if(d){f=k[t>>2]|0;if((f|0)!=(d|0))k[t>>2]=f+(~((f+-4-e|0)>>>2)<<2);rg(d)}d=k[u>>2]|0;if(!d){r=w;return}e=k[v>>2]|0;if((e|0)!=(d|0))k[v>>2]=e+(~(((e+-2096-d|0)>>>0)/2096|0)*2096|0);rg(d);r=w;return}function Sd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0.0,j=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0,v=0;v=r;r=r+544|0;q=v+16|0;t=v;s=ha(c,b)|0;k[t>>2]=0;u=t+4|0;k[u>>2]=0;k[t+8>>2]=0;if(s){if(s>>>0>1073741823)mg(t);j=og(s<<2)|0;k[u>>2]=j;k[t>>2]=j;h=j+(s<<2)|0;k[t+8>>2]=h;g=s;while(1){k[j>>2]=1;g=g+-1|0;if(!g)break;else j=j+4|0}k[u>>2]=h}g=e+4|0;h=k[g>>2]|0;j=k[e>>2]|0;m=(h-j|0)/2096|0;if(s>>>0<=m>>>0){if(s>>>0>>0?(n=j+(s*2096|0)|0,(h|0)!=(n|0)):0)k[g>>2]=h+(~(((h+-2096-n|0)>>>0)/2096|0)*2096|0)}else Td(e,s-m|0);g=f+4|0;h=k[g>>2]|0;j=k[f>>2]|0;m=h-j>>2;if(s>>>0<=m>>>0){if(s>>>0>>0?(o=j+(s<<2)|0,(h|0)!=(o|0)):0)k[g>>2]=h+(~((h+-4-o|0)>>>2)<<2)}else Ud(f,s-m|0);if((s|0)>0){g=k[e>>2]|0;o=0;do{ki(g+(o*2096|0)|0,(k[a>>2]|0)+(o*2096|0)|0,2096)|0;n=k[a>>2]|0;j=k[n+(o*2096|0)+2080>>2]|0;a:do if(!j)i=12.0;else{g=0;h=0;do{g=((k[n+(o*2096|0)+(h<<2)>>2]|0)>0&1)+g|0;h=h+1|0}while((h|0)<520&(g|0)<5);m=g;switch(m|0){case 1:{i=12.0;break a}case 2:{i=+(j+20|0);break a}default:{}}gi(q|0,0,520)|0;Af(n+(o*2096|0)|0,520,15,q);g=0;h=0;do{g=(ha(l[q+h>>0]|0,k[n+(o*2096|0)+(h<<2)>>2]|0)|0)+g|0;h=h+1|0}while((h|0)!=520);switch(m|0){case 3:{g=g+28|0;break}case 4:{g=g+37|0;break}default:g=(Vd(q,520)|0)+g|0}i=+(g|0)}while(0);g=k[e>>2]|0;p[g+(o*2096|0)+2088>>3]=i;k[(k[f>>2]|0)+(o<<2)>>2]=o;o=o+1|0}while((o|0)<(s|0))}if((b|0)>1&(c|0)>0){g=0;do{q=ha(g,b)|0;Wd(k[e>>2]|0,k[t>>2]|0,(k[f>>2]|0)+(q<<2)|0,b,d);g=g+1|0}while((g|0)<(c|0))}Wd(k[e>>2]|0,k[t>>2]|0,k[f>>2]|0,s,d);Xd(k[a>>2]|0,s,k[e>>2]|0,k[f>>2]|0);Yd(e,f);h=k[t>>2]|0;if(!h){r=v;return}g=k[u>>2]|0;if((g|0)!=(h|0))k[u>>2]=g+(~((g+-4-h|0)>>>2)<<2);rg(h);r=v;return}function Td(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=a+8|0;e=k[i>>2]|0;j=a+4|0;c=k[j>>2]|0;d=c;if(((e-d|0)/2096|0)>>>0>=b>>>0){do{gi(c|0,0,2084)|0;c=(k[j>>2]|0)+2096|0;k[j>>2]=c;b=b+-1|0}while((b|0)!=0);return}c=k[a>>2]|0;d=((d-c|0)/2096|0)+b|0;if(d>>>0>2049125)mg(a);f=c;c=(e-f|0)/2096|0;if(c>>>0<1024562){c=c<<1;c=c>>>0>>0?d:c;d=((k[j>>2]|0)-f|0)/2096|0;if(!c){e=0;g=0}else h=8}else{c=2049125;d=((k[j>>2]|0)-f|0)/2096|0;h=8}if((h|0)==8){e=c;g=og(c*2096|0)|0}c=g+(d*2096|0)|0;f=g+(e*2096|0)|0;e=c;do{gi(e|0,0,2084)|0;e=c+2096|0;c=e;b=b+-1|0}while((b|0)!=0);b=k[a>>2]|0;e=(k[j>>2]|0)-b|0;h=g+((((e|0)/-2096|0)+d|0)*2096|0)|0;ki(h|0,b|0,e|0)|0;k[a>>2]=h;k[j>>2]=c;k[i>>2]=f;if(!b)return;rg(b);return}function Ud(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;j=a+8|0;e=k[j>>2]|0;l=a+4|0;c=k[l>>2]|0;d=c;if(e-d>>2>>>0>=b>>>0){gi(c|0,0,b<<2|0)|0;k[l>>2]=c+(b<<2);return}h=k[a>>2]|0;i=h;d=(d-i>>2)+b|0;if(d>>>0>1073741823)mg(a);f=h;c=e-f|0;if(c>>2>>>0<536870911){c=c>>1;c=c>>>0>>0?d:c;e=(k[l>>2]|0)-f|0;d=e>>2;if(!c){g=0;f=0;c=e}else m=8}else{e=(k[l>>2]|0)-f|0;c=1073741823;d=e>>2;m=8}if((m|0)==8){g=c;f=og(c<<2)|0;c=e}gi(f+(d<<2)|0,0,b<<2|0)|0;ki(f|0,h|0,c|0)|0;k[a>>2]=f;k[l>>2]=f+(d+b<<2);k[j>>2]=f+(g<<2);if(!i)return;rg(i);return}function Vd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+96|0;p=q;o=q+72|0;e=p;f=e+72|0;do{k[e>>2]=0;e=e+4|0}while((e|0)<(f|0));a:do if((b|0)>0){d=p+68|0;g=p+64|0;e=0;c=1;n=8;while(1){m=e;while(1){h=i[a+m>>0]|0;j=h&255;c=(j|0)>(c|0)?j:c;e=m+1|0;b:do if((e|0)<(b|0)){f=1;do{if((i[a+e>>0]|0)!=h<<24>>24)break b;f=f+1|0;e=e+1|0}while((e|0)<(b|0))}else f=1;while(0);m=f+m|0;e=h<<24>>24==0;if(e&(m|0)==(b|0))break a;if(!e){h=m;e=f;break}if((f|0)<3)k[p>>2]=(k[p>>2]|0)+f;else{e=k[d>>2]|0;f=f+-2|0;do{e=e+1|0;f=f>>3}while((f|0)>0);k[d>>2]=e}if((m|0)>=(b|0))break a}if((j|0)==(n|0))f=e;else{f=p+(j<<2)|0;k[f>>2]=(k[f>>2]|0)+1;f=e+-1|0}if((f|0)<3){n=p+(j<<2)|0;k[n>>2]=(k[n>>2]|0)+f}else{e=k[g>>2]|0;f=f+-2|0;do{e=e+1|0;f=f>>2}while((f|0)>0);k[g>>2]=e}if((h|0)<(b|0)){e=h;n=j}else break}}else{g=p+64|0;d=p+68|0;c=1}while(0);e=o;f=e+18|0;do{i[e>>0]=0;e=e+1|0}while((e|0)<(f|0));Af(p,18,7,o);a=o+16|0;i[a>>0]=(l[a>>0]|0)+2;b=o+17|0;i[b>>0]=(l[b>>0]|0)+3;n=(ha(l[o>>0]|0,k[p>>2]|0)|0)+((c<<1)+18)|0;n=(ha(l[o+1>>0]|0,k[p+4>>2]|0)|0)+n|0;n=(ha(l[o+2>>0]|0,k[p+8>>2]|0)|0)+n|0;n=(ha(l[o+3>>0]|0,k[p+12>>2]|0)|0)+n|0;n=(ha(l[o+4>>0]|0,k[p+16>>2]|0)|0)+n|0;n=(ha(l[o+5>>0]|0,k[p+20>>2]|0)|0)+n|0;n=(ha(l[o+6>>0]|0,k[p+24>>2]|0)|0)+n|0;n=(ha(l[o+7>>0]|0,k[p+28>>2]|0)|0)+n|0;n=(ha(l[o+8>>0]|0,k[p+32>>2]|0)|0)+n|0;n=(ha(l[o+9>>0]|0,k[p+36>>2]|0)|0)+n|0;n=(ha(l[o+10>>0]|0,k[p+40>>2]|0)|0)+n|0;n=(ha(l[o+11>>0]|0,k[p+44>>2]|0)|0)+n|0;n=(ha(l[o+12>>0]|0,k[p+48>>2]|0)|0)+n|0;n=(ha(l[o+13>>0]|0,k[p+52>>2]|0)|0)+n|0;n=(ha(l[o+14>>0]|0,k[p+56>>2]|0)|0)+n|0;p=(ha(l[o+15>>0]|0,k[p+60>>2]|0)|0)+n|0;p=(ha(l[a>>0]|0,k[g>>2]|0)|0)+p|0;p=(ha(l[b>>0]|0,k[d>>2]|0)|0)+p|0;r=q;return p|0}function Wd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=r;r=r+96|0;x=I+8|0;w=I+92|0;v=I+88|0;y=I+84|0;z=I+80|0;A=I+76|0;B=I;H=I+64|0;E=I+52|0;D=I+40|0;s=H+4|0;k[s>>2]=0;t=H+8|0;k[t>>2]=0;F=H+4|0;k[H>>2]=F;k[E>>2]=0;G=E+4|0;k[G>>2]=0;k[E+8>>2]=0;C=(d|0)>0;if(C){o=F;q=E+8|0;l=0;f=0;while(1){n=c+(f<<2)|0;if(l){j=k[n>>2]|0;g=F;h=l;a:do{while(1){if((k[h+16>>2]|0)>=(j|0)){g=h;break}h=k[h+4>>2]|0;if(!h)break a}h=k[g>>2]|0}while((h|0)!=0);if(!((g|0)!=(F|0)?(j|0)>=(k[g+16>>2]|0):0))m=11}else m=11;do if((m|0)==11){m=0;do if(l){j=k[n>>2]|0;while(1){g=k[l+16>>2]|0;if((j|0)<(g|0)){g=k[l>>2]|0;if(!g){g=l;h=l;m=15;break}}else{if((g|0)>=(j|0)){g=l;m=20;break}h=l+4|0;g=k[h>>2]|0;if(!g){g=h;h=l;m=19;break}}l=g}if((m|0)==15){m=0;k[x>>2]=h;j=g;break}else if((m|0)==19){m=0;k[x>>2]=h;j=g;break}else if((m|0)==20){m=0;k[x>>2]=g;j=x;h=g;break}}else{k[x>>2]=F;j=F;h=o}while(0);if(!(k[j>>2]|0)){g=og(20)|0;k[g+16>>2]=k[n>>2];k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=h;k[j>>2]=g;h=k[k[H>>2]>>2]|0;if(h){k[H>>2]=h;g=k[j>>2]|0}Hc(k[s>>2]|0,g);k[t>>2]=(k[t>>2]|0)+1}g=k[G>>2]|0;if((g|0)==(k[q>>2]|0)){Jd(E,n);break}else{k[g>>2]=k[n>>2];k[G>>2]=g+4;break}}while(0);f=f+1|0;if((f|0)>=(d|0))break;l=k[F>>2]|0}g=k[G>>2]|0;f=k[E>>2]|0}else{g=0;f=0}k[D>>2]=0;s=D+4|0;k[s>>2]=0;k[D+8>>2]=0;if((g|0)==(f|0))g=f;else{l=0;do{j=l;l=l+1|0;if(l>>>0>2>>>0){h=l;do{ae(a,b,k[f+(j<<2)>>2]|0,k[f+(h<<2)>>2]|0,D);h=h+1|0;g=k[G>>2]|0;f=k[E>>2]|0}while(h>>>0>2>>>0)}}while(l>>>0>2>>>0)}b:do if(g-f>>2>>>0>1){u=0.0;q=1;while(1){while(1){m=k[D>>2]|0;if(+p[m+24>>3]>=u)break;o=k[m>>2]|0;n=k[m+4>>2]|0;h=a+(o*2096|0)+2080|0;k[h>>2]=(k[h>>2]|0)+(k[a+(n*2096|0)+2080>>2]|0);h=0;do{t=a+(o*2096|0)+(h<<2)|0;k[t>>2]=(k[t>>2]|0)+(k[a+(n*2096|0)+(h<<2)>>2]|0);h=h+1|0}while((h|0)!=520);p[a+(o*2096|0)+2088>>3]=+p[m+16>>3];t=b+(o<<2)|0;k[t>>2]=(k[t>>2]|0)+(k[b+(n<<2)>>2]|0);if(C){j=0;do{h=c+(j<<2)|0;if((k[h>>2]|0)==(n|0))k[h>>2]=o;j=j+1|0}while((j|0)!=(d|0))}j=g-f>>2;if(j>>>0>1){l=1;h=0;while(1){h=f+(h<<2)|0;if((k[h>>2]|0)>=(n|0))k[h>>2]=k[f+(l<<2)>>2];h=l+1|0;if(h>>>0>>0){t=l;l=h;h=t}else break}}k[G>>2]=g+-4;f=k[s>>2]|0;g=(f|0)==(m|0);c:do if(!g){h=f-m>>5;l=0;do{j=k[m+(l<<5)>>2]|0;if(!((j|0)!=(o|0)?(t=k[m+(l<<5)+4>>2]|0,!((t|0)==(n|0)|((j|0)==(n|0)|(t|0)==(o|0)))):0))i[m+(l<<5)+8>>0]=0;l=l+1|0}while(l>>>0>>0);if(!g){g=m;do{if(i[g+8>>0]|0)break c;h=g;j=f-h|0;if((j|0)>32){f=f+-32|0;k[x>>2]=k[g>>2];k[x+4>>2]=k[g+4>>2];k[x+8>>2]=k[g+8>>2];k[x+12>>2]=k[g+12>>2];k[x+16>>2]=k[g+16>>2];k[x+20>>2]=k[g+20>>2];k[x+24>>2]=k[g+24>>2];k[x+28>>2]=k[g+28>>2];k[g>>2]=k[f>>2];k[g+4>>2]=k[f+4>>2];k[g+8>>2]=k[f+8>>2];k[g+12>>2]=k[f+12>>2];k[g+16>>2]=k[f+16>>2];k[g+20>>2]=k[f+20>>2];k[g+24>>2]=k[f+24>>2];k[g+28>>2]=k[f+28>>2];k[f>>2]=k[x>>2];k[f+4>>2]=k[x+4>>2];k[f+8>>2]=k[x+8>>2];k[f+12>>2]=k[x+12>>2];k[f+16>>2]=k[x+16>>2];k[f+20>>2]=k[x+20>>2];k[f+24>>2]=k[x+24>>2];k[f+28>>2]=k[x+28>>2];k[y>>2]=h;k[z>>2]=f;k[A>>2]=h;k[v>>2]=k[y>>2];k[w>>2]=k[z>>2];k[x>>2]=k[A>>2];be(v,w,B,(j>>5)+-1|0,x);f=k[s>>2]|0;g=k[D>>2]|0}f=f+-32|0;k[s>>2]=f}while((g|0)!=(f|0))}}while(0);h=k[G>>2]|0;f=k[E>>2]|0;if((h|0)==(f|0)){g=h;f=h}else{h=0;do{ae(a,b,o,k[f+(h<<2)>>2]|0,D);h=h+1|0;g=k[G>>2]|0;f=k[E>>2]|0}while(h>>>0>2>>>0)}if(g-f>>2>>>0<=q>>>0)break b}if(g-f>>2>>>0>e>>>0){u=1.e+99;q=e}else break}}while(0);g=k[D>>2]|0;h=g;if(g){f=k[s>>2]|0;if((f|0)!=(g|0))k[s>>2]=f+(~((f+-32-h|0)>>>5)<<5);rg(g);f=k[E>>2]|0}if(!f){G=k[F>>2]|0;$d(H,G);r=I;return}g=k[G>>2]|0;if((g|0)!=(f|0))k[G>>2]=g+(~((g+-4-f|0)>>>2)<<2);rg(f);G=k[F>>2]|0;$d(H,G);r=I;return}function Xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0.0,i=0.0,j=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=r;r=r+2640|0;y=D+2112|0;z=D;C=D+2096|0;o=C+4|0;k[o>>2]=0;q=C+8|0;k[q>>2]=0;B=C+4|0;k[C>>2]=B;A=(b|0)>0;if(A){s=B;f=0;n=0;while(1){m=d+(n<<2)|0;do if(f){g=k[m>>2]|0;j=f;while(1){e=k[j+16>>2]|0;if((g|0)<(e|0)){e=k[j>>2]|0;if(!e){e=j;f=j;x=10;break}}else{if((e|0)>=(g|0)){e=j;x=15;break}f=j+4|0;e=k[f>>2]|0;if(!e){e=f;f=j;x=14;break}}j=e}if((x|0)==10){x=0;k[y>>2]=f;g=e;break}else if((x|0)==14){x=0;k[y>>2]=f;g=e;break}else if((x|0)==15){x=0;k[y>>2]=e;g=y;f=e;break}}else{k[y>>2]=B;g=B;f=s}while(0);if(!(k[g>>2]|0)){e=og(20)|0;k[e+16>>2]=k[m>>2];k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=f;k[g>>2]=e;f=k[k[C>>2]>>2]|0;if(f){k[C>>2]=f;e=k[g>>2]|0}Hc(k[o>>2]|0,e);k[q>>2]=(k[q>>2]|0)+1}e=n+1|0;if((e|0)>=(b|0))break;f=k[B>>2]|0;n=e}if(A){u=z+2080|0;v=z+2080|0;w=0;while(1){e=k[((w|0)==0?d:d+(w+-1<<2)|0)>>2]|0;s=a+(w*2096|0)|0;t=a+(w*2096|0)+2080|0;if(!(k[t>>2]|0))h=0.0;else{ki(z|0,s|0,2096)|0;k[v>>2]=(k[v>>2]|0)+(k[c+(e*2096|0)+2080>>2]|0);f=0;do{q=z+(f<<2)|0;k[q>>2]=(k[q>>2]|0)+(k[c+(e*2096|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=520);j=k[v>>2]|0;a:do if(!j)h=12.0;else{f=0;g=0;do{f=((k[z+(g<<2)>>2]|0)>0&1)+f|0;g=g+1|0}while((g|0)<520&(f|0)<5);m=f;switch(m|0){case 1:{h=12.0;break a}case 2:{h=+(j+20|0);break a}default:{}}gi(y|0,0,520)|0;Af(z,520,15,y);f=0;g=0;do{f=(ha(l[y+g>>0]|0,k[z+(g<<2)>>2]|0)|0)+f|0;g=g+1|0}while((g|0)!=520);switch(m|0){case 3:{f=f+28|0;break}case 4:{f=f+37|0;break}default:f=(Vd(y,520)|0)+f|0}h=+(f|0)}while(0);h=h-+p[c+(e*2096|0)+2088>>3]}f=k[C>>2]|0;if((f|0)!=(B|0)){g=f;while(1){q=g+16|0;o=k[q>>2]|0;if(!(k[t>>2]|0))i=0.0;else{ki(z|0,s|0,2096)|0;k[u>>2]=(k[u>>2]|0)+(k[c+(o*2096|0)+2080>>2]|0);f=0;do{n=z+(f<<2)|0;k[n>>2]=(k[n>>2]|0)+(k[c+(o*2096|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=520);m=k[u>>2]|0;b:do if(!m)i=12.0;else{f=0;j=0;do{f=((k[z+(j<<2)>>2]|0)>0&1)+f|0;j=j+1|0}while((j|0)<520&(f|0)<5);n=f;switch(n|0){case 1:{i=12.0;break b}case 2:{i=+(m+20|0);break b}default:{}}gi(y|0,0,520)|0;Af(z,520,15,y);f=0;j=0;do{f=(ha(l[y+j>>0]|0,k[z+(j<<2)>>2]|0)|0)+f|0;j=j+1|0}while((j|0)!=520);switch(n|0){case 3:{f=f+28|0;break}case 4:{f=f+37|0;break}default:f=(Vd(y,520)|0)+f|0}i=+(f|0)}while(0);i=i-+p[c+(o*2096|0)+2088>>3]}if(i>2]|0}f=k[g+4>>2]|0;if(!f)while(1){f=k[g+8>>2]|0;if((k[f>>2]|0)==(g|0))break;else g=f}else while(1){g=k[f>>2]|0;if(!g)break;else f=g}if((f|0)==(B|0))break;else g=f}}k[d+(w<<2)>>2]=e;w=w+1|0;if((w|0)>=(b|0)){g=B;e=C;break}}}else x=4}else x=4;if((x|0)==4){g=B;e=C}f=k[e>>2]|0;if((f|0)!=(g|0))while(1){gi(c+((k[f+16>>2]|0)*2096|0)|0,0,2084)|0;e=k[f+4>>2]|0;if(!e)while(1){e=k[f+8>>2]|0;if((k[e>>2]|0)==(f|0))break;else f=e}else while(1){f=k[e>>2]|0;if(!f)break;else e=f}if((e|0)==(B|0))break;else f=e}if(A)g=0;else{d=k[B>>2]|0;$d(C,d);r=D;return}do{e=k[d+(g<<2)>>2]|0;f=c+(e*2096|0)+2080|0;k[f>>2]=(k[f>>2]|0)+(k[a+(g*2096|0)+2080>>2]|0);f=0;do{A=c+(e*2096|0)+(f<<2)|0;k[A>>2]=(k[A>>2]|0)+(k[a+(g*2096|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=520);g=g+1|0}while((g|0)!=(b|0));d=k[B>>2]|0;$d(C,d);r=D;return}function Yd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0;x=r;r=r+32|0;u=x+24|0;w=x+12|0;v=x;Zd(w,a);q=v+4|0;k[q>>2]=0;s=v+8|0;k[s>>2]=0;c=v+4|0;k[v>>2]=c;t=b+4|0;d=k[t>>2]|0;e=k[b>>2]|0;a:do if((d|0)==(e|0)){f=a;e=d;j=0}else{n=c;i=0;m=0;j=0;while(1){l=e+(m<<2)|0;if(i){h=k[l>>2]|0;f=c;g=i;b:do{while(1){if((k[g+16>>2]|0)>=(h|0)){f=g;break}g=k[g+4>>2]|0;if(!g)break b}g=k[f>>2]|0}while((g|0)!=0);if(!((f|0)!=(c|0)?(h|0)>=(k[f+16>>2]|0):0))p=12}else p=12;if((p|0)==12){do if(i){h=k[l>>2]|0;d=i;while(1){f=k[d+16>>2]|0;if((h|0)<(f|0)){f=k[d>>2]|0;if(!f){e=d;p=16;break}else d=f}else{if((f|0)>=(h|0)){p=22;break}f=d+4|0;g=k[f>>2]|0;if(!g){e=f;p=20;break}else d=g}}if((p|0)==16){k[u>>2]=d;p=23;break}else if((p|0)==20){k[u>>2]=d;p=23;break}else if((p|0)==22){p=0;k[u>>2]=d;if(!d){e=u;p=23;break}else break}}else{k[u>>2]=c;e=c;d=n;p=23}while(0);if((p|0)==23){p=0;f=og(24)|0;k[f+16>>2]=k[l>>2];k[f+20>>2]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=d;k[e>>2]=f;d=k[k[v>>2]>>2]|0;if(!d)d=f;else{k[v>>2]=d;d=k[e>>2]|0}Hc(k[q>>2]|0,d);k[s>>2]=(k[s>>2]|0)+1;e=k[b>>2]|0;d=f}k[d+20>>2]=j;ki((k[a>>2]|0)+(j*2096|0)|0,(k[w>>2]|0)+((k[e+(m<<2)>>2]|0)*2096|0)|0,2096)|0;d=k[t>>2]|0;e=k[b>>2]|0;j=j+1|0}f=m+1|0;if(f>>>0>=d-e>>2>>>0){f=a;break a}i=k[c>>2]|0;m=f}}while(0);h=a+4|0;i=k[h>>2]|0;f=k[f>>2]|0;g=(i-f|0)/2096|0;if(j>>>0<=g>>>0){if(j>>>0>>0?(o=f+(j*2096|0)|0,(i|0)!=(o|0)):0)k[h>>2]=i+(~(((i+-2096-o|0)>>>0)/2096|0)*2096|0)}else{Td(a,j-g|0);d=k[t>>2]|0;e=k[b>>2]|0}if((d|0)!=(e|0)){m=c;l=0;do{j=e+(l<<2)|0;f=k[c>>2]|0;do if(f){i=k[j>>2]|0;while(1){g=k[f+16>>2]|0;if((i|0)<(g|0)){g=k[f>>2]|0;if(!g){d=f;e=f;p=41;break}else f=g}else{if((g|0)>=(i|0)){p=47;break}g=f+4|0;h=k[g>>2]|0;if(!h){d=g;p=45;break}else f=h}}if((p|0)==41){k[u>>2]=e;g=d;d=e;p=48;break}else if((p|0)==45){k[u>>2]=f;g=d;d=f;p=48;break}else if((p|0)==47){p=0;k[u>>2]=f;if(!f){g=u;d=f;p=48;break}else break}}else{k[u>>2]=c;g=c;d=m;p=48}while(0);if((p|0)==48){f=og(24)|0;k[f+16>>2]=k[j>>2];k[f+20>>2]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=d;k[g>>2]=f;d=k[k[v>>2]>>2]|0;if(!d)d=f;else{k[v>>2]=d;d=k[g>>2]|0}Hc(k[q>>2]|0,d);k[s>>2]=(k[s>>2]|0)+1;e=k[b>>2]|0;d=k[t>>2]|0}k[e+(l<<2)>>2]=k[f+20>>2];l=l+1|0}while(l>>>0>2>>>0)}_d(v,k[c>>2]|0);e=k[w>>2]|0;if(!e){r=x;return}c=w+4|0;d=k[c>>2]|0;if((d|0)!=(e|0))k[c>>2]=d+(~(((d+-2096-e|0)>>>0)/2096|0)*2096|0);rg(e);r=x;return}function Zd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;k[a>>2]=0;f=a+4|0;k[f>>2]=0;k[a+8>>2]=0;e=b+4|0;h=k[e>>2]|0;g=k[b>>2]|0;c=h-g|0;d=(c|0)/2096|0;if((h|0)==(g|0))return;if(d>>>0>2049125)mg(a);c=og(c)|0;k[f>>2]=c;k[a>>2]=c;k[a+8>>2]=c+(d*2096|0);d=k[b>>2]|0;b=k[e>>2]|0;if((d|0)==(b|0))return;do{ki(c|0,d|0,2096)|0;c=(k[f>>2]|0)+2096|0;k[f>>2]=c;d=d+2096|0}while((d|0)!=(b|0));return}function _d(a,b){a=a|0;b=b|0;if(!b)return;else{_d(a,k[b>>2]|0);_d(a,k[b+4>>2]|0);rg(b);return}}function $d(a,b){a=a|0;b=b|0;if(!b)return;else{$d(a,k[b>>2]|0);$d(a,k[b+4>>2]|0);rg(b);return}}function ae(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0,h=0.0,j=0.0,m=0.0,n=0.0,q=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=r;r=r+2672|0;y=C+2144|0;x=C+40|0;z=C+2140|0;A=C+2136|0;B=C;w=C+8|0;if((c|0)==(d|0)){r=C;return}g=(d|0)<(c|0);u=g?c:d;g=g?d:c;k[w>>2]=g;k[w+4>>2]=u;i[w+8>>0]=1;c=k[b+(g<<2)>>2]|0;d=k[b+(u<<2)>>2]|0;b=d+c|0;t=+(c|0);if((c|0)<256)q=+o[4036+(c<<2)>>2];else q=+oh(t);s=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(s);m=+(b|0);if((b|0)<256)h=+o[4036+(b<<2)>>2];else h=+oh(m);v=w+24|0;d=a+(g*2096|0)|0;f=+p[a+(g*2096|0)+2088>>3];n=+p[a+(u*2096|0)+2088>>3];j=(t*q+s*j-m*h)*.5-f-n;p[v>>3]=j;do if(!(k[a+(g*2096|0)+2080>>2]|0)){p[w+16>>3]=n;f=n}else{b=k[a+(u*2096|0)+2080>>2]|0;if(!b){p[w+16>>3]=f;break}c=k[e>>2]|0;if((c|0)==(k[e+4>>2]|0))h=1.e+99;else{h=+p[c+24>>3];h=h>0.0?h:0.0}ki(x|0,d|0,2096)|0;d=x+2080|0;k[d>>2]=(k[d>>2]|0)+b;c=0;do{g=x+(c<<2)|0;k[g>>2]=(k[g>>2]|0)+(k[a+(u*2096|0)+(c<<2)>>2]|0);c=c+1|0}while((c|0)!=520);b=k[d>>2]|0;a:do if(!b)f=12.0;else{c=0;d=0;do{c=((k[x+(d<<2)>>2]|0)>0&1)+c|0;d=d+1|0}while((d|0)<520&(c|0)<5);g=c;switch(g|0){case 1:{f=12.0;break a}case 2:{f=+(b+20|0);break a}default:{}}gi(y|0,0,520)|0;Af(x,520,15,y);c=0;d=0;do{c=(ha(l[y+d>>0]|0,k[x+(d<<2)>>2]|0)|0)+c|0;d=d+1|0}while((d|0)!=520);switch(g|0){case 3:{c=c+28|0;break}case 4:{c=c+37|0;break}default:c=(Vd(y,520)|0)+c|0}f=+(c|0)}while(0);if(f>3]=f;break}r=C;return}while(0);p[v>>3]=f+j;c=e+4|0;d=k[c>>2]|0;if((d|0)==(k[e+8>>2]|0)){ce(e,w);c=k[c>>2]|0}else{k[d>>2]=k[w>>2];k[d+4>>2]=k[w+4>>2];k[d+8>>2]=k[w+8>>2];k[d+12>>2]=k[w+12>>2];k[d+16>>2]=k[w+16>>2];k[d+20>>2]=k[w+20>>2];k[d+24>>2]=k[w+24>>2];k[d+28>>2]=k[w+28>>2];w=(k[c>>2]|0)+32|0;k[c>>2]=w;c=w}w=c;e=k[e>>2]|0;k[z>>2]=e;k[A>>2]=w;k[x>>2]=k[z>>2];k[y>>2]=k[A>>2];de(x,y,B,w-e>>5);r=C;return}function be(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,g=0,h=0.0,i=0,j=0,l=0,m=0,n=0,o=0,q=0.0,s=0,t=0,u=0,v=0,w=0;v=r;r=r+16|0;u=v;l=k[e>>2]|0;s=k[a>>2]|0;c=l-s|0;if((d|0)<2){r=v;return}t=(d+-2|0)/2|0;if((t|0)<(c>>5|0)){r=v;return}a=c>>4|1;c=s+(a<<5)|0;b=c;i=a+1|0;do if((i|0)<(d|0)){g=s+(i<<5)|0;f=+p[s+(a<<5)+24>>3];h=+p[s+(i<<5)+24>>3];if(f!=h){if(!(f>h)){g=b;break}}else{n=(k[c>>2]|0)-(k[s+(a<<5)+4>>2]|0)|0;o=(k[g>>2]|0)-(k[s+(i<<5)+4>>2]|0)|0;if((((n|0)>-1?n:0-n|0)|0)<=(((o|0)>-1?o:0-o|0)|0)){g=b;break}}a=i}else g=b;while(0);c=g;f=+p[c+24>>3];q=+p[l+24>>3];do if(f!=q)if(f>q){r=v;return}else{b=k[l+4>>2]|0;i=k[l>>2]|0;break}else{n=(k[c>>2]|0)-(k[c+4>>2]|0)|0;i=k[l>>2]|0;b=k[l+4>>2]|0;o=i-b|0;if((((n|0)>-1?n:0-n|0)|0)>(((o|0)>-1?o:0-o|0)|0)){r=v;return}}while(0);j=l+8|0;k[u>>2]=k[j>>2];k[u+4>>2]=k[j+4>>2];k[u+8>>2]=k[j+8>>2];k[u+12>>2]=k[j+12>>2];j=g;k[l>>2]=k[j>>2];k[l+4>>2]=k[j+4>>2];k[l+8>>2]=k[j+8>>2];k[l+12>>2]=k[j+12>>2];k[l+16>>2]=k[j+16>>2];k[l+20>>2]=k[j+20>>2];k[l+24>>2]=k[j+24>>2];k[l+28>>2]=k[j+28>>2];k[e>>2]=g;a:do if((t|0)>=(a|0)){o=i-b|0;o=(o|0)>-1?o:0-o|0;while(1){a=a<<1|1;g=s+(a<<5)|0;l=g;n=a+1|0;do if((n|0)<(d|0)){m=s+(n<<5)|0;f=+p[s+(a<<5)+24>>3];h=+p[s+(n<<5)+24>>3];if(f!=h){if(!(f>h))break}else{w=(k[g>>2]|0)-(k[s+(a<<5)+4>>2]|0)|0;g=(k[m>>2]|0)-(k[s+(n<<5)+4>>2]|0)|0;if((((w|0)>-1?w:0-w|0)|0)<=(((g|0)>-1?g:0-g|0)|0))break}l=m;a=n}while(0);g=l;f=+p[g+24>>3];if(f!=q){if(f>q)break a}else{w=(k[g>>2]|0)-(k[g+4>>2]|0)|0;if((((w|0)>-1?w:0-w|0)|0)>(o|0))break a}w=j;j=l;k[w>>2]=k[j>>2];k[w+4>>2]=k[j+4>>2];k[w+8>>2]=k[j+8>>2];k[w+12>>2]=k[j+12>>2];k[w+16>>2]=k[j+16>>2];k[w+20>>2]=k[j+20>>2];k[w+24>>2]=k[j+24>>2];k[w+28>>2]=k[j+28>>2];k[e>>2]=l;if((t|0)<(a|0)){c=g;break}else c=g}}while(0);k[c>>2]=i;k[c+4>>2]=b;w=c+8|0;k[w>>2]=k[u>>2];k[w+4>>2]=k[u+4>>2];k[w+8>>2]=k[u+8>>2];k[w+12>>2]=k[u+12>>2];p[c+24>>3]=q;r=v;return}function ce(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;h=a+4|0;i=k[a>>2]|0;j=i;d=((k[h>>2]|0)-j>>5)+1|0;if(d>>>0>134217727)mg(a);l=a+8|0;e=i;c=(k[l>>2]|0)-e|0;if(c>>5>>>0<67108863){c=c>>4;c=c>>>0>>0?d:c;e=(k[h>>2]|0)-e|0;d=e>>5;if(!c){g=0;f=0;c=e}else m=6}else{e=(k[h>>2]|0)-e|0;c=134217727;d=e>>5;m=6}if((m|0)==6){g=c;f=og(c<<5)|0;c=e}m=f+(d<<5)|0;k[m>>2]=k[b>>2];k[m+4>>2]=k[b+4>>2];k[m+8>>2]=k[b+8>>2];k[m+12>>2]=k[b+12>>2];k[m+16>>2]=k[b+16>>2];k[m+20>>2]=k[b+20>>2];k[m+24>>2]=k[b+24>>2];k[m+28>>2]=k[b+28>>2];ki(f|0,i|0,c|0)|0;k[a>>2]=f;k[h>>2]=f+(d+1<<5);k[l>>2]=f+(g<<5);if(!j)return;rg(j);return}function de(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0.0,o=0,q=0,s=0;q=r;r=r+16|0;o=q;if((d|0)<=1){r=q;return}i=(d+-2|0)/2|0;m=k[a>>2]|0;c=m+(i<<5)|0;g=c;h=k[b>>2]|0;j=h+-32|0;k[b>>2]=j;e=+p[m+(i<<5)+24>>3];n=+p[h+-8>>3];do if(e!=n)if(e>n){a=k[h+-28>>2]|0;l=k[j>>2]|0;break}else{r=q;return}else{s=(k[c>>2]|0)-(k[m+(i<<5)+4>>2]|0)|0;f=k[j>>2]|0;a=k[h+-28>>2]|0;l=f-a|0;if((((s|0)>-1?s:0-s|0)|0)>(((l|0)>-1?l:0-l|0)|0))l=f;else{r=q;return}}while(0);s=h+-24|0;k[o>>2]=k[s>>2];k[o+4>>2]=k[s+4>>2];k[o+8>>2]=k[s+8>>2];k[o+12>>2]=k[s+12>>2];k[j>>2]=k[c>>2];k[j+4>>2]=k[c+4>>2];k[j+8>>2]=k[c+8>>2];k[j+12>>2]=k[c+12>>2];k[j+16>>2]=k[c+16>>2];k[j+20>>2]=k[c+20>>2];k[j+24>>2]=k[c+24>>2];k[j+28>>2]=k[c+28>>2];k[b>>2]=g;a:do if((d+-1|0)>>>0>=3){j=l-a|0;j=(j|0)>-1?j:0-j|0;h=c;while(1){f=i;i=(i+-1|0)/2|0;c=m+(i<<5)|0;g=c;e=+p[m+(i<<5)+24>>3];if(e!=n){if(!(e>n)){c=h;break a}}else{s=(k[c>>2]|0)-(k[m+(i<<5)+4>>2]|0)|0;if((((s|0)>-1?s:0-s|0)|0)<=(j|0)){c=h;break a}};k[h>>2]=k[c>>2];k[h+4>>2]=k[c+4>>2];k[h+8>>2]=k[c+8>>2];k[h+12>>2]=k[c+12>>2];k[h+16>>2]=k[c+16>>2];k[h+20>>2]=k[c+20>>2];k[h+24>>2]=k[c+24>>2];k[h+28>>2]=k[c+28>>2];k[b>>2]=g;if(f>>>0<3)break;else h=c}}while(0);k[c>>2]=l;k[c+4>>2]=a;s=c+8|0;k[s>>2]=k[o>>2];k[s+4>>2]=k[o+4>>2];k[s+8>>2]=k[o+8>>2];k[s+12>>2]=k[o+12>>2];p[c+24>>3]=n;r=q;return}function ee(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;h=a+4|0;i=k[a>>2]|0;j=i;d=(((k[h>>2]|0)-j|0)/2832|0)+1|0;if(d>>>0>1516584)mg(a);l=a+8|0;e=i;c=((k[l>>2]|0)-e|0)/2832|0;if(c>>>0<758292){c=c<<1;c=c>>>0>>0?d:c;e=(k[h>>2]|0)-e|0;d=(e|0)/2832|0;if(!c){g=0;f=0;c=e}else m=6}else{e=(k[h>>2]|0)-e|0;c=1516584;d=(e|0)/2832|0;m=6}if((m|0)==6){g=c;f=og(c*2832|0)|0;c=e}ki(f+(d*2832|0)|0,b|0,2832)|0;m=f+((((c|0)/-2832|0)+d|0)*2832|0)|0;ki(m|0,i|0,c|0)|0;k[a>>2]=m;k[h>>2]=f+((d+1|0)*2832|0);k[l>>2]=f+(g*2832|0);if(!j)return;rg(j);return}function fe(a,b,c,d,e){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,n=0.0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0.0;q=k[d>>2]|0;d=(k[d+4>>2]|0)-q|0;w=(d|0)/2832|0;if(w>>>0<2){if(!b)return;gi(e|0,0,b|0)|0;return}v=w*704|0;v=qg(v>>>0>536870911?-1:v<<3)|0;gi(v|0,0,w*5632|0)|0;u=(d|0)>0;h=0;do{if(u){g=ha(h,w)|0;j=0;do{d=k[q+(j*2832|0)+2816>>2]|0;f=k[q+(j*2832|0)+(h<<2)>>2]|0;if((d|0)<256)r=+o[4036+(d<<2)>>2];else r=+oh(+(d|0));if(!f)n=r+2.0;else{if((f|0)<256)n=+o[4036+(f<<2)>>2];else n=+oh(+(f|0));n=r-n}p[v+(j+g<<3)>>3]=n;j=j+1|0}while((j|0)<(w|0))}h=h+1|0}while((h|0)!=704);s=qg(w>>>0>536870911?-1:w<<3)|0;gi(s|0,0,w<<3|0)|0;q=ha(w,b)|0;t=qg(q)|0;gi(t|0,0,q|0)|0;if(b){j=0;do{h=ha(j,w)|0;d=ha(m[a+(j<<1)>>1]|0,w)|0;if(u){f=e+j|0;g=0;n=1.e+99;while(1){q=s+(g<<3)|0;r=+p[v+(g+d<<3)>>3]+ +p[q>>3];p[q>>3]=r;if(r>0]=g;else r=n;g=g+1|0;if((g|0)>=(w|0))break;else n=r}}else r=1.e+99;if(j>>>0<2e3)n=(+(j>>>0)*.07/2.0e3+.77)*c;else n=c;if(u){f=0;do{d=s+(f<<3)|0;x=+p[d>>3]-r;p[d>>3]=x;if(x>=n){p[d>>3]=n;i[t+(f+h)>>0]=1}f=f+1|0}while((f|0)<(w|0))}j=j+1|0}while((j|0)!=(b|0));d=b+-1|0;if((d|0)>0){q=d;h=l[e+d>>0]|0;j=ha(w,d)|0;while(1){g=q;q=q+-1|0;j=j-w|0;f=e+q|0;if(!(i[t+(j+h)>>0]|0))d=h;else d=l[f>>0]|0;i[f>>0]=d;if((g|0)<=1)break;else h=d}}}sg(v);sg(s);sg(t);return}function ge(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,n=0;h=Fd(c,b)|0;i=k[d>>2]|0;n=d+4|0;e=k[n>>2]|0;f=i;if((e|0)==(i|0))g=i;else{g=e+(~(((e+-2832-f|0)>>>0)/2832|0)*2832|0)|0;k[n>>2]=g}e=(g-f|0)/2832|0;if(h>>>0<=e>>>0){if(h>>>0>>0?(j=i+(h*2832|0)|0,(g|0)!=(j|0)):0)k[n>>2]=g+(~(((g+-2832-j|0)>>>0)/2832|0)*2832|0)}else je(d,h-e|0);if(!b)return;e=k[d>>2]|0;f=0;do{d=l[c+f>>0]|0;n=e+(d*2832|0)+((m[a+(f<<1)>>1]|0)<<2)|0;k[n>>2]=(k[n>>2]|0)+1;d=e+(d*2832|0)+2816|0;k[d>>2]=(k[d>>2]|0)+1;f=f+1|0}while((f|0)!=(b|0));return}function he(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0;w=r;r=r+2880|0;u=w+2868|0;s=w+2856|0;l=w;q=w+2844|0;o=w+2832|0;k[u>>2]=0;v=u+4|0;k[v>>2]=0;k[u+8>>2]=0;k[s>>2]=0;t=s+4|0;k[t>>2]=0;k[s+8>>2]=0;n=(b|0)==0;do if(!n)if(b>>>0>1073741823)mg(s);else{h=b<<2;d=og(h)|0;k[s>>2]=d;j=d+(b<<2)|0;k[s+8>>2]=j;gi(d|0,0,h|0)|0;k[t>>2]=j;break}else d=0;while(0);gi(l|0,0,2820)|0;h=l+2816|0;j=u+8|0;g=0;e=0;a:while(1){while(1){if(e>>>0>=b>>>0)break a;f=e+1|0;if((f|0)==(b|0)){p=10;break}x=(i[c+e>>0]|0)==(i[c+f>>0]|0);k[d+(e<<2)>>2]=g;e=l+(m[a+(e<<1)>>1]<<2)|0;k[e>>2]=(k[e>>2]|0)+1;k[h>>2]=(k[h>>2]|0)+1;if(x)e=f;else{e=f;break}}if((p|0)==10){p=0;k[d+(e<<2)>>2]=g;e=l+(m[a+(e<<1)>>1]<<2)|0;k[e>>2]=(k[e>>2]|0)+1;k[h>>2]=(k[h>>2]|0)+1;e=b}f=k[v>>2]|0;if((f|0)==(k[j>>2]|0)){ee(u,l);d=k[s>>2]|0}else{ki(f|0,l|0,2832)|0;k[v>>2]=f+2832}gi(l|0,0,2820)|0;g=g+1|0}k[q>>2]=0;h=q+4|0;k[h>>2]=0;k[q+8>>2]=0;k[o>>2]=0;g=o+4|0;k[g>>2]=0;k[o+8>>2]=0;ie(u,1,((k[v>>2]|0)-(k[u>>2]|0)|0)/2832|0,256,q,o);if(n){d=k[o>>2]|0;if(d)p=19}else{f=k[s>>2]|0;d=k[o>>2]|0;e=0;do{i[c+e>>0]=k[d+(k[f+(e<<2)>>2]<<2)>>2];e=e+1|0}while((e|0)!=(b|0));p=19}if((p|0)==19){e=k[g>>2]|0;if((e|0)!=(d|0))k[g>>2]=e+(~((e+-4-d|0)>>>2)<<2);rg(d)}d=k[q>>2]|0;e=d;if(d){f=k[h>>2]|0;if((f|0)!=(d|0))k[h>>2]=f+(~(((f+-2832-e|0)>>>0)/2832|0)*2832|0);rg(d)}d=k[s>>2]|0;e=d;if(d){f=k[t>>2]|0;if((f|0)!=(d|0))k[t>>2]=f+(~((f+-4-e|0)>>>2)<<2);rg(d)}d=k[u>>2]|0;if(!d){r=w;return}e=k[v>>2]|0;if((e|0)!=(d|0))k[v>>2]=e+(~(((e+-2832-d|0)>>>0)/2832|0)*2832|0);rg(d);r=w;return}function ie(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0.0,j=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0,v=0;v=r;r=r+720|0;q=v+16|0;t=v;s=ha(c,b)|0;k[t>>2]=0;u=t+4|0;k[u>>2]=0;k[t+8>>2]=0;if(s){if(s>>>0>1073741823)mg(t);j=og(s<<2)|0;k[u>>2]=j;k[t>>2]=j;h=j+(s<<2)|0;k[t+8>>2]=h;g=s;while(1){k[j>>2]=1;g=g+-1|0;if(!g)break;else j=j+4|0}k[u>>2]=h}g=e+4|0;h=k[g>>2]|0;j=k[e>>2]|0;m=(h-j|0)/2832|0;if(s>>>0<=m>>>0){if(s>>>0>>0?(n=j+(s*2832|0)|0,(h|0)!=(n|0)):0)k[g>>2]=h+(~(((h+-2832-n|0)>>>0)/2832|0)*2832|0)}else je(e,s-m|0);g=f+4|0;h=k[g>>2]|0;j=k[f>>2]|0;m=h-j>>2;if(s>>>0<=m>>>0){if(s>>>0>>0?(o=j+(s<<2)|0,(h|0)!=(o|0)):0)k[g>>2]=h+(~((h+-4-o|0)>>>2)<<2)}else Ud(f,s-m|0);if((s|0)>0){g=k[e>>2]|0;o=0;do{ki(g+(o*2832|0)|0,(k[a>>2]|0)+(o*2832|0)|0,2832)|0;n=k[a>>2]|0;j=k[n+(o*2832|0)+2816>>2]|0;a:do if(!j)i=12.0;else{g=0;h=0;do{g=((k[n+(o*2832|0)+(h<<2)>>2]|0)>0&1)+g|0;h=h+1|0}while((h|0)<704&(g|0)<5);m=g;switch(m|0){case 1:{i=12.0;break a}case 2:{i=+(j+20|0);break a}default:{}}gi(q|0,0,704)|0;Af(n+(o*2832|0)|0,704,15,q);g=0;h=0;do{g=(ha(l[q+h>>0]|0,k[n+(o*2832|0)+(h<<2)>>2]|0)|0)+g|0;h=h+1|0}while((h|0)!=704);switch(m|0){case 3:{g=g+28|0;break}case 4:{g=g+37|0;break}default:g=(Vd(q,704)|0)+g|0}i=+(g|0)}while(0);g=k[e>>2]|0;p[g+(o*2832|0)+2824>>3]=i;k[(k[f>>2]|0)+(o<<2)>>2]=o;o=o+1|0}while((o|0)<(s|0))}if((b|0)>1&(c|0)>0){g=0;do{q=ha(g,b)|0;ke(k[e>>2]|0,k[t>>2]|0,(k[f>>2]|0)+(q<<2)|0,b,d);g=g+1|0}while((g|0)<(c|0))}ke(k[e>>2]|0,k[t>>2]|0,k[f>>2]|0,s,d);le(k[a>>2]|0,s,k[e>>2]|0,k[f>>2]|0);me(e,f);h=k[t>>2]|0;if(!h){r=v;return}g=k[u>>2]|0;if((g|0)!=(h|0))k[u>>2]=g+(~((g+-4-h|0)>>>2)<<2);rg(h);r=v;return}function je(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=a+8|0;e=k[i>>2]|0;j=a+4|0;c=k[j>>2]|0;d=c;if(((e-d|0)/2832|0)>>>0>=b>>>0){do{gi(c|0,0,2820)|0;c=(k[j>>2]|0)+2832|0;k[j>>2]=c;b=b+-1|0}while((b|0)!=0);return}c=k[a>>2]|0;d=((d-c|0)/2832|0)+b|0;if(d>>>0>1516584)mg(a);f=c;c=(e-f|0)/2832|0;if(c>>>0<758292){c=c<<1;c=c>>>0>>0?d:c;d=((k[j>>2]|0)-f|0)/2832|0;if(!c){e=0;g=0}else h=8}else{c=1516584;d=((k[j>>2]|0)-f|0)/2832|0;h=8}if((h|0)==8){e=c;g=og(c*2832|0)|0}c=g+(d*2832|0)|0;f=g+(e*2832|0)|0;e=c;do{gi(e|0,0,2820)|0;e=c+2832|0;c=e;b=b+-1|0}while((b|0)!=0);b=k[a>>2]|0;e=(k[j>>2]|0)-b|0;h=g+((((e|0)/-2832|0)+d|0)*2832|0)|0;ki(h|0,b|0,e|0)|0;k[a>>2]=h;k[j>>2]=c;k[i>>2]=f;if(!b)return;rg(b);return}function ke(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=r;r=r+96|0;x=I+8|0;w=I+92|0;v=I+88|0;y=I+84|0;z=I+80|0;A=I+76|0;B=I;H=I+64|0;E=I+52|0;D=I+40|0;s=H+4|0;k[s>>2]=0;t=H+8|0;k[t>>2]=0;F=H+4|0;k[H>>2]=F;k[E>>2]=0;G=E+4|0;k[G>>2]=0;k[E+8>>2]=0;C=(d|0)>0;if(C){o=F;q=E+8|0;l=0;f=0;while(1){n=c+(f<<2)|0;if(l){j=k[n>>2]|0;g=F;h=l;a:do{while(1){if((k[h+16>>2]|0)>=(j|0)){g=h;break}h=k[h+4>>2]|0;if(!h)break a}h=k[g>>2]|0}while((h|0)!=0);if(!((g|0)!=(F|0)?(j|0)>=(k[g+16>>2]|0):0))m=11}else m=11;do if((m|0)==11){m=0;do if(l){j=k[n>>2]|0;while(1){g=k[l+16>>2]|0;if((j|0)<(g|0)){g=k[l>>2]|0;if(!g){g=l;h=l;m=15;break}}else{if((g|0)>=(j|0)){g=l;m=20;break}h=l+4|0;g=k[h>>2]|0;if(!g){g=h;h=l;m=19;break}}l=g}if((m|0)==15){m=0;k[x>>2]=h;j=g;break}else if((m|0)==19){m=0;k[x>>2]=h;j=g;break}else if((m|0)==20){m=0;k[x>>2]=g;j=x;h=g;break}}else{k[x>>2]=F;j=F;h=o}while(0);if(!(k[j>>2]|0)){g=og(20)|0;k[g+16>>2]=k[n>>2];k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=h;k[j>>2]=g;h=k[k[H>>2]>>2]|0;if(h){k[H>>2]=h;g=k[j>>2]|0}Hc(k[s>>2]|0,g);k[t>>2]=(k[t>>2]|0)+1}g=k[G>>2]|0;if((g|0)==(k[q>>2]|0)){Jd(E,n);break}else{k[g>>2]=k[n>>2];k[G>>2]=g+4;break}}while(0);f=f+1|0;if((f|0)>=(d|0))break;l=k[F>>2]|0}g=k[G>>2]|0;f=k[E>>2]|0}else{g=0;f=0}k[D>>2]=0;s=D+4|0;k[s>>2]=0;k[D+8>>2]=0;if((g|0)==(f|0))g=f;else{l=0;do{j=l;l=l+1|0;if(l>>>0>2>>>0){h=l;do{oe(a,b,k[f+(j<<2)>>2]|0,k[f+(h<<2)>>2]|0,D);h=h+1|0;g=k[G>>2]|0;f=k[E>>2]|0}while(h>>>0>2>>>0)}}while(l>>>0>2>>>0)}b:do if(g-f>>2>>>0>1){u=0.0;q=1;while(1){while(1){m=k[D>>2]|0;if(+p[m+24>>3]>=u)break;o=k[m>>2]|0;n=k[m+4>>2]|0;h=a+(o*2832|0)+2816|0;k[h>>2]=(k[h>>2]|0)+(k[a+(n*2832|0)+2816>>2]|0);h=0;do{t=a+(o*2832|0)+(h<<2)|0;k[t>>2]=(k[t>>2]|0)+(k[a+(n*2832|0)+(h<<2)>>2]|0);h=h+1|0}while((h|0)!=704);p[a+(o*2832|0)+2824>>3]=+p[m+16>>3];t=b+(o<<2)|0;k[t>>2]=(k[t>>2]|0)+(k[b+(n<<2)>>2]|0);if(C){j=0;do{h=c+(j<<2)|0;if((k[h>>2]|0)==(n|0))k[h>>2]=o;j=j+1|0}while((j|0)!=(d|0))}j=g-f>>2;if(j>>>0>1){l=1;h=0;while(1){h=f+(h<<2)|0;if((k[h>>2]|0)>=(n|0))k[h>>2]=k[f+(l<<2)>>2];h=l+1|0;if(h>>>0>>0){t=l;l=h;h=t}else break}}k[G>>2]=g+-4;f=k[s>>2]|0;g=(f|0)==(m|0);c:do if(!g){h=f-m>>5;l=0;do{j=k[m+(l<<5)>>2]|0;if(!((j|0)!=(o|0)?(t=k[m+(l<<5)+4>>2]|0,!((t|0)==(n|0)|((j|0)==(n|0)|(t|0)==(o|0)))):0))i[m+(l<<5)+8>>0]=0;l=l+1|0}while(l>>>0>>0);if(!g){g=m;do{if(i[g+8>>0]|0)break c;h=g;j=f-h|0;if((j|0)>32){f=f+-32|0;k[x>>2]=k[g>>2];k[x+4>>2]=k[g+4>>2];k[x+8>>2]=k[g+8>>2];k[x+12>>2]=k[g+12>>2];k[x+16>>2]=k[g+16>>2];k[x+20>>2]=k[g+20>>2];k[x+24>>2]=k[g+24>>2];k[x+28>>2]=k[g+28>>2];k[g>>2]=k[f>>2];k[g+4>>2]=k[f+4>>2];k[g+8>>2]=k[f+8>>2];k[g+12>>2]=k[f+12>>2];k[g+16>>2]=k[f+16>>2];k[g+20>>2]=k[f+20>>2];k[g+24>>2]=k[f+24>>2];k[g+28>>2]=k[f+28>>2];k[f>>2]=k[x>>2];k[f+4>>2]=k[x+4>>2];k[f+8>>2]=k[x+8>>2];k[f+12>>2]=k[x+12>>2];k[f+16>>2]=k[x+16>>2];k[f+20>>2]=k[x+20>>2];k[f+24>>2]=k[x+24>>2];k[f+28>>2]=k[x+28>>2];k[y>>2]=h;k[z>>2]=f;k[A>>2]=h;k[v>>2]=k[y>>2];k[w>>2]=k[z>>2];k[x>>2]=k[A>>2];be(v,w,B,(j>>5)+-1|0,x);f=k[s>>2]|0;g=k[D>>2]|0}f=f+-32|0;k[s>>2]=f}while((g|0)!=(f|0))}}while(0);h=k[G>>2]|0;f=k[E>>2]|0;if((h|0)==(f|0)){g=h;f=h}else{h=0;do{oe(a,b,o,k[f+(h<<2)>>2]|0,D);h=h+1|0;g=k[G>>2]|0;f=k[E>>2]|0}while(h>>>0>2>>>0)}if(g-f>>2>>>0<=q>>>0)break b}if(g-f>>2>>>0>e>>>0){u=1.e+99;q=e}else break}}while(0);g=k[D>>2]|0;h=g;if(g){f=k[s>>2]|0;if((f|0)!=(g|0))k[s>>2]=f+(~((f+-32-h|0)>>>5)<<5);rg(g);f=k[E>>2]|0}if(!f){G=k[F>>2]|0;$d(H,G);r=I;return}g=k[G>>2]|0;if((g|0)!=(f|0))k[G>>2]=g+(~((g+-4-f|0)>>>2)<<2);rg(f);G=k[F>>2]|0;$d(H,G);r=I;return}function le(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0.0,i=0.0,j=0,m=0,n=0,o=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=r;r=r+3552|0;y=D+2848|0;z=D;C=D+2832|0;o=C+4|0;k[o>>2]=0;q=C+8|0;k[q>>2]=0;B=C+4|0;k[C>>2]=B;A=(b|0)>0;if(A){s=B;f=0;n=0;while(1){m=d+(n<<2)|0;do if(f){g=k[m>>2]|0;j=f;while(1){e=k[j+16>>2]|0;if((g|0)<(e|0)){e=k[j>>2]|0;if(!e){e=j;f=j;x=10;break}}else{if((e|0)>=(g|0)){e=j;x=15;break}f=j+4|0;e=k[f>>2]|0;if(!e){e=f;f=j;x=14;break}}j=e}if((x|0)==10){x=0;k[y>>2]=f;g=e;break}else if((x|0)==14){x=0;k[y>>2]=f;g=e;break}else if((x|0)==15){x=0;k[y>>2]=e;g=y;f=e;break}}else{k[y>>2]=B;g=B;f=s}while(0);if(!(k[g>>2]|0)){e=og(20)|0;k[e+16>>2]=k[m>>2];k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=f;k[g>>2]=e;f=k[k[C>>2]>>2]|0;if(f){k[C>>2]=f;e=k[g>>2]|0}Hc(k[o>>2]|0,e);k[q>>2]=(k[q>>2]|0)+1}e=n+1|0;if((e|0)>=(b|0))break;f=k[B>>2]|0;n=e}if(A){u=z+2816|0;v=z+2816|0;w=0;while(1){e=k[((w|0)==0?d:d+(w+-1<<2)|0)>>2]|0;s=a+(w*2832|0)|0;t=a+(w*2832|0)+2816|0;if(!(k[t>>2]|0))h=0.0;else{ki(z|0,s|0,2832)|0;k[v>>2]=(k[v>>2]|0)+(k[c+(e*2832|0)+2816>>2]|0);f=0;do{q=z+(f<<2)|0;k[q>>2]=(k[q>>2]|0)+(k[c+(e*2832|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=704);j=k[v>>2]|0;a:do if(!j)h=12.0;else{f=0;g=0;do{f=((k[z+(g<<2)>>2]|0)>0&1)+f|0;g=g+1|0}while((g|0)<704&(f|0)<5);m=f;switch(m|0){case 1:{h=12.0;break a}case 2:{h=+(j+20|0);break a}default:{}}gi(y|0,0,704)|0;Af(z,704,15,y);f=0;g=0;do{f=(ha(l[y+g>>0]|0,k[z+(g<<2)>>2]|0)|0)+f|0;g=g+1|0}while((g|0)!=704);switch(m|0){case 3:{f=f+28|0;break}case 4:{f=f+37|0;break}default:f=(Vd(y,704)|0)+f|0}h=+(f|0)}while(0);h=h-+p[c+(e*2832|0)+2824>>3]}f=k[C>>2]|0;if((f|0)!=(B|0)){g=f;while(1){q=g+16|0;o=k[q>>2]|0;if(!(k[t>>2]|0))i=0.0;else{ki(z|0,s|0,2832)|0;k[u>>2]=(k[u>>2]|0)+(k[c+(o*2832|0)+2816>>2]|0);f=0;do{n=z+(f<<2)|0;k[n>>2]=(k[n>>2]|0)+(k[c+(o*2832|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=704);m=k[u>>2]|0;b:do if(!m)i=12.0;else{f=0;j=0;do{f=((k[z+(j<<2)>>2]|0)>0&1)+f|0;j=j+1|0}while((j|0)<704&(f|0)<5);n=f;switch(n|0){case 1:{i=12.0;break b}case 2:{i=+(m+20|0);break b}default:{}}gi(y|0,0,704)|0;Af(z,704,15,y);f=0;j=0;do{f=(ha(l[y+j>>0]|0,k[z+(j<<2)>>2]|0)|0)+f|0;j=j+1|0}while((j|0)!=704);switch(n|0){case 3:{f=f+28|0;break}case 4:{f=f+37|0;break}default:f=(Vd(y,704)|0)+f|0}i=+(f|0)}while(0);i=i-+p[c+(o*2832|0)+2824>>3]}if(i>2]|0}f=k[g+4>>2]|0;if(!f)while(1){f=k[g+8>>2]|0;if((k[f>>2]|0)==(g|0))break;else g=f}else while(1){g=k[f>>2]|0;if(!g)break;else f=g}if((f|0)==(B|0))break;else g=f}}k[d+(w<<2)>>2]=e;w=w+1|0;if((w|0)>=(b|0)){g=B;e=C;break}}}else x=4}else x=4;if((x|0)==4){g=B;e=C}f=k[e>>2]|0;if((f|0)!=(g|0))while(1){gi(c+((k[f+16>>2]|0)*2832|0)|0,0,2820)|0;e=k[f+4>>2]|0;if(!e)while(1){e=k[f+8>>2]|0;if((k[e>>2]|0)==(f|0))break;else f=e}else while(1){f=k[e>>2]|0;if(!f)break;else e=f}if((e|0)==(B|0))break;else f=e}if(A)g=0;else{d=k[B>>2]|0;$d(C,d);r=D;return}do{e=k[d+(g<<2)>>2]|0;f=c+(e*2832|0)+2816|0;k[f>>2]=(k[f>>2]|0)+(k[a+(g*2832|0)+2816>>2]|0);f=0;do{A=c+(e*2832|0)+(f<<2)|0;k[A>>2]=(k[A>>2]|0)+(k[a+(g*2832|0)+(f<<2)>>2]|0);f=f+1|0}while((f|0)!=704);g=g+1|0}while((g|0)!=(b|0));d=k[B>>2]|0;$d(C,d);r=D;return} +function $b(a){a=a|0;var b=0;b=r;r=r+a|0;r=r+15&-16;return b|0}function ac(){return r|0}function bc(a){a=a|0;r=a}function cc(a,b){a=a|0;b=b|0;r=a;s=b}function dc(a,b){a=a|0;b=b|0;if(!w){w=a;x=b}}function ec(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0]}function fc(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0];i[t+4>>0]=i[a+4>>0];i[t+5>>0]=i[a+5>>0];i[t+6>>0]=i[a+6>>0];i[t+7>>0]=i[a+7>>0]}function gc(a){a=a|0;L=a}function hc(){return L|0}function ic(){return Qh(1,4)|0}function jc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=r;r=r+16|0;e=d;f=a;a=dd(f,b)|0;k[e>>2]=a;a=Qh(a,1)|0;ed(f,b,a,e)|0;k[c>>2]=k[e>>2];r=d;return a|0}function kc(a,b){a=a|0;b=b|0;Ph(a);Ph(b);return}function lc(a){a=a|0;return Rb[a&1]()|0}function mc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Pb[a&15](b,c,d)|0}function nc(a,b,c){a=a|0;b=b|0;c=c|0;Tb[a&1](b,c);return}function oc(){Pa(72024,1,696,72052,4,1);Pa(72035,4,700,72055,1,8);Pa(72043,3,716,72061,1,1);return}function pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;J=r;r=r+16|0;I=J;if(b>>>0<2){I=0;r=J;return I|0}t=qh(l[a>>0]|l[a+1>>0]<<8)|0;if(!(t<<16>>16)){I=1;r=J;return I|0}if(b>>>0<4){I=0;r=J;return I|0}F=a+2|0;F=qh(l[F>>0]|l[F+1>>0]<<8)|0;j[c>>1]=F;if(b>>>0<6){I=0;r=J;return I|0}F=a+4|0;F=qh(l[F>>0]|l[F+1>>0]<<8)|0;j[c+4>>1]=F;if(b>>>0<8){I=0;r=J;return I|0}F=a+6|0;F=qh(l[F>>0]|l[F+1>>0]<<8)|0;j[c+2>>1]=F;if(b>>>0<10){I=0;r=J;return I|0}F=a+8|0;F=qh(l[F>>0]|l[F+1>>0]<<8)|0;j[c+6>>1]=F;if(t<<16>>16<=0){if(t<<16>>16!=-1){I=0;r=J;return I|0}p=c+36|0;i[p>>0]=0;k[c+28>>2]=a+10;f=10;s=0;while(1){q=f+2|0;if(q>>>0>b>>>0){y=0;w=143;break}n=a+f|0;n=qh(l[n>>0]|l[n+1>>0]<<8)|0;s=(n&65535)>>>8&1|s&255;o=s&255;i[p>>0]=o;f=(n&1)<<1;h=f|4;m=n&65535;do if(!(m&8))if(!(m&64)){h=(m&128|0)==0?h:f|12;break}else{h=h+4|0;break}else h=h+2|0;while(0);if(h>>>0>1073741824){y=0;w=143;break}f=h+q|0;if(f>>>0>b>>>0|q>>>0>(b-h|0)>>>0){y=0;w=143;break}if(!(n&32)){u=o;v=f;w=85;break}}if((w|0)==85){k[c+32>>2]=v+-10;e=c+8|0;if(!(u<<24>>24)){j[e>>1]=0;I=1;r=J;return I|0}d=v+2|0;if(d>>>0>b>>>0){I=0;r=J;return I|0}else{I=a+v|0;I=qh(l[I>>0]|l[I+1>>0]<<8)|0;j[e>>1]=I;k[c+12>>2]=a+d;I=I&65535;r=J;return d>>>0<=(b-I|0)>>>0&(I+d|0)>>>0<=b>>>0|0}}else if((w|0)==143){r=J;return y|0}}F=t<<16>>16;D=c+16|0;o=c+20|0;f=k[o>>2]|0;h=k[D>>2]|0;m=(f-h|0)/12|0;if(F>>>0<=m>>>0)if(F>>>0>>0?(x=h+(F*12|0)|0,(f|0)!=(x|0)):0){h=f;while(1){f=h+-12|0;k[o>>2]=f;m=k[f>>2]|0;n=m;if(m){f=h+-8|0;h=k[f>>2]|0;if((h|0)!=(m|0))k[f>>2]=h+(~(((h+-12-n|0)>>>0)/12|0)*12|0);rg(m);f=k[o>>2]|0}if((f|0)==(x|0)){h=10;t=0;u=0;break}else h=f}}else{h=10;t=0;u=0}else{rc(D,F-m|0);h=10;t=0;u=0}while(1){f=h+2|0;if(f>>>0>b>>>0){y=0;w=143;break}o=a+h|0;n=u;u=qh(l[o>>0]|l[o+1>>0]<<8)|0;o=k[D>>2]|0;m=o+(t*12|0)|0;n=((t|0)==0&1)-(n&65535)+(u&65535)&65535;o=o+(t*12|0)+4|0;p=k[o>>2]|0;q=k[m>>2]|0;s=(p-q|0)/12|0;if(n>>>0<=s>>>0){if(n>>>0>>0?(A=q+(n*12|0)|0,(p|0)!=(A|0)):0)k[o>>2]=p+(~(((p+-12-A|0)>>>0)/12|0)*12|0)}else sc(m,n-s|0);t=t+1|0;if((t|0)>=(F|0)){z=h;B=f;break}else h=f}if((w|0)==143){r=J;return y|0}f=z+4|0;if(f>>>0>b>>>0){I=0;r=J;return I|0}h=a+B|0;h=qh(l[h>>0]|l[h+1>>0]<<8)|0;j[c+8>>1]=h;k[c+12>>2]=a+f;c=h&65535;h=c+f|0;if(h>>>0>b>>>0|f>>>0>(b-c|0)>>>0){I=0;r=J;return I|0}tc(I,F);f=k[D>>2]|0;m=0;w=0;x=0;a:while(1){q=k[I>>2]|0;v=q+(x*12|0)|0;o=k[f+(x*12|0)+4>>2]|0;n=k[f+(x*12|0)>>2]|0;p=(o-n|0)/12|0;q=q+(x*12|0)+4|0;s=k[q>>2]|0;t=k[v>>2]|0;u=s-t|0;if(p>>>0<=u>>>0){if(p>>>0>>0?(C=t+p|0,(s|0)!=(C|0)):0)k[q>>2]=C}else{uc(v,p-u|0);f=k[D>>2]|0;o=k[f+(x*12|0)+4>>2]|0;n=k[f+(x*12|0)>>2]|0}if((o|0)==(n|0))n=w;else{f=w;o=0;while(1){if(!(m<<24>>24)){m=h+1|0;if(m>>>0>b>>>0){w=89;break a}f=i[a+h>>0]|0;if(!(f&8)){n=f;h=m;m=0}else{h=h+2|0;if(h>>>0>b>>>0){w=98;break a}n=f;m=i[a+m>>0]|0}}else{n=f;m=m+-1<<24>>24}i[(k[(k[I>>2]|0)+(x*12|0)>>2]|0)+o>>0]=n;f=k[D>>2]|0;c=k[f+(x*12|0)>>2]|0;i[c+(o*12|0)+8>>0]=n&1;o=o+1|0;if(o>>>0>=(((k[f+(x*12|0)+4>>2]|0)-c|0)/12|0)>>>0)break;else f=n}}x=x+1|0;if((x|0)>=(F|0)){g=h;w=27;break}else w=n}if((w|0)==27){u=k[D>>2]|0;t=0;f=0;b:while(1){h=k[u+(t*12|0)+4>>2]|0;s=k[u+(t*12|0)>>2]|0;if((h|0)!=(s|0)){p=k[I>>2]|0;q=k[p+(t*12|0)>>2]|0;o=(h-s|0)/12|0;n=0;do{h=l[q+n>>0]|0;if(!(h&2)){if(!(h&16)){h=g+2|0;if(h>>>0>b>>>0){E=p;w=116;break b}m=a+g|0;m=qh(l[m>>0]|l[m+1>>0]<<8)|0;g=h}else m=0;f=(m<<16>>16)+f|0;k[s+(n*12|0)>>2]=f}else{m=g+1|0;if(m>>>0>b>>>0){d=p;w=107;break b}f=(ha(l[a+g>>0]|0,(h>>>3&2)+-1|0)|0)+f|0;k[s+(n*12|0)>>2]=f;g=m}n=n+1|0}while(n>>>0>>0)}t=t+1|0;if((t|0)>=(F|0)){e=g;w=44;break}}if((w|0)==44){s=k[D>>2]|0;q=0;d=0;c:while(1){f=k[s+(q*12|0)+4>>2]|0;p=k[s+(q*12|0)>>2]|0;if((f|0)!=(p|0)){n=k[I>>2]|0;o=k[n+(q*12|0)>>2]|0;m=(f-p|0)/12|0;h=0;do{f=l[o+h>>0]|0;if(!(f&4)){if(!(f&32)){f=e+2|0;if(f>>>0>b>>>0){H=n;w=134;break c}g=a+e|0;g=qh(l[g>>0]|l[g+1>>0]<<8)|0;e=f}else g=0;d=(g<<16>>16)+d|0;k[p+(h*12|0)+4>>2]=d}else{g=e+1|0;if(g>>>0>b>>>0){G=n;w=125;break c}d=(ha(l[a+e>>0]|0,(f>>>4&2)+-1|0)|0)+d|0;k[p+(h*12|0)+4>>2]=d;e=g}h=h+1|0}while(h>>>0>>0)}q=q+1|0;if((q|0)>=(F|0)){w=65;break}}if((w|0)==65){d=k[I>>2]|0;if(!d){I=1;r=J;return I|0}h=I+4|0;e=k[h>>2]|0;if((e|0)!=(d|0)){do{f=e+-12|0;k[h>>2]=f;g=k[f>>2]|0;if(!g)e=f;else{e=e+-8|0;if((k[e>>2]|0)!=(g|0))k[e>>2]=g;rg(g);e=k[h>>2]|0}}while((e|0)!=(d|0));d=k[I>>2]|0}rg(d);I=1;r=J;return I|0}else if((w|0)==125){if(!G){I=0;r=J;return I|0}g=I+4|0;d=k[g>>2]|0;if((d|0)==(G|0))d=G;else{do{e=d+-12|0;k[g>>2]=e;f=k[e>>2]|0;if(!f)d=e;else{d=d+-8|0;if((k[d>>2]|0)!=(f|0))k[d>>2]=f;rg(f);d=k[g>>2]|0}}while((d|0)!=(G|0));d=k[I>>2]|0}rg(d);I=0;r=J;return I|0}else if((w|0)==134){if(!H){I=0;r=J;return I|0}g=I+4|0;d=k[g>>2]|0;if((d|0)==(H|0))d=H;else{do{e=d+-12|0;k[g>>2]=e;f=k[e>>2]|0;if(!f)d=e;else{d=d+-8|0;if((k[d>>2]|0)!=(f|0))k[d>>2]=f;rg(f);d=k[g>>2]|0}}while((d|0)!=(H|0));d=k[I>>2]|0}rg(d);I=0;r=J;return I|0}}else if((w|0)==107){if(!d){I=0;r=J;return I|0}h=I+4|0;e=k[h>>2]|0;if((e|0)!=(d|0)){do{f=e+-12|0;k[h>>2]=f;g=k[f>>2]|0;if(!g)e=f;else{e=e+-8|0;if((k[e>>2]|0)!=(g|0))k[e>>2]=g;rg(g);e=k[h>>2]|0}}while((e|0)!=(d|0));d=k[I>>2]|0}rg(d);I=0;r=J;return I|0}else if((w|0)==116){if(!E){I=0;r=J;return I|0}g=I+4|0;d=k[g>>2]|0;if((d|0)==(E|0))d=E;else{do{e=d+-12|0;k[g>>2]=e;f=k[e>>2]|0;if(!f)d=e;else{d=d+-8|0;if((k[d>>2]|0)!=(f|0))k[d>>2]=f;rg(f);d=k[g>>2]|0}}while((d|0)!=(E|0));d=k[I>>2]|0}rg(d);I=0;r=J;return I|0}}else if((w|0)==89){d=k[I>>2]|0;if(!d){I=0;r=J;return I|0}h=I+4|0;e=k[h>>2]|0;if((e|0)!=(d|0)){do{f=e+-12|0;k[h>>2]=f;g=k[f>>2]|0;if(!g)e=f;else{e=e+-8|0;if((k[e>>2]|0)!=(g|0))k[e>>2]=g;rg(g);e=k[h>>2]|0}}while((e|0)!=(d|0));d=k[I>>2]|0}rg(d);I=0;r=J;return I|0}else if((w|0)==98){d=k[I>>2]|0;if(!d){I=0;r=J;return I|0}h=I+4|0;e=k[h>>2]|0;if((e|0)!=(d|0)){do{f=e+-12|0;k[h>>2]=f;g=k[f>>2]|0;if(!g)e=f;else{e=e+-8|0;if((k[e>>2]|0)!=(g|0))k[e>>2]=g;rg(g);e=k[h>>2]|0}}while((e|0)!=(d|0));d=k[I>>2]|0}rg(d);I=0;r=J;return I|0}return 0}function qc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+32|0;e=k[d>>2]|0;if(!e){z=a+20|0;w=k[z>>2]|0;y=a+16|0;x=k[y>>2]|0;d=(w-x|0)/12|0;if((w|0)!=(x|0)){if(d>>>0>32767){c=0;return c|0}w=k[c>>2]|0;x=ii(d<<1|0,0,12,0)|0;n=a+8|0;x=ii(x|0,L|0,m[n>>1]|0,0)|0;v=L;if(0>>0|0==(v|0)&w>>>0>>0){c=0;return c|0}i[b>>0]=d>>>8;i[b+1>>0]=d;d=j[a>>1]|0;i[b+2>>0]=(d&65535)>>>8;i[b+3>>0]=d;d=j[a+4>>1]|0;i[b+4>>0]=(d&65535)>>>8;i[b+5>>0]=d;d=j[a+2>>1]|0;i[b+6>>0]=(d&65535)>>>8;i[b+7>>0]=d;d=j[a+6>>1]|0;i[b+8>>0]=(d&65535)>>>8;i[b+9>>0]=d;d=k[y>>2]|0;h=k[z>>2]|0;a:do if((d|0)==(h|0))d=10;else{e=d;f=10;g=-1;while(1){x=((k[e+4>>2]|0)-(k[e>>2]|0)|0)/12|0;g=x+g|0;if(x>>>0>65535|(g|0)>65535){d=0;break}i[b+f>>0]=g>>>8;d=f+2|0;i[b+(f|1)>>0]=g;e=e+12|0;if((e|0)==(h|0))break a;else f=d}return d|0}while(0);x=j[n>>1]|0;i[b+d>>0]=(x&65535)>>>8;e=d+2|0;i[b+(d+1)>>0]=x;x=m[n>>1]|0;ki(b+e|0,k[a+12>>2]|0,x|0)|0;e=x+e|0;x=k[c>>2]|0;d=k[y>>2]|0;w=k[z>>2]|0;do if((d|0)!=(w|0)){n=-1;a=0;o=0;f=0;r=0;g=0;b:while(1){h=k[d>>2]|0;v=k[d+4>>2]|0;if((h|0)==(v|0))h=r;else{u=n;t=a;while(1){n=l[h+8>>0]|0;A=k[h>>2]|0;a=A-t|0;s=h+4|0;p=k[s>>2]|0;q=p-o|0;do if((A|0)!=(t|0))if((a+255|0)>>>0<511){n=((a|0)>0?18:2)|n;r=r+1|0;break}else{r=r+2|0;break}else n=n|16;while(0);do if((p|0)!=(o|0))if((q+255|0)>>>0<511){n=n|((q|0)>0?36:4);g=g+1|0;break}else{g=g+2|0;break}else n=n|32;while(0);if((f|0)!=255&(n|0)==(u|0)){A=b+(e+-1)|0;i[A>>0]=l[A>>0]|8;f=f+1|0}else{if(f){if(e>>>0>=x>>>0){d=0;n=49;break b}i[b+e>>0]=f;e=e+1|0}if(e>>>0>=x>>>0){d=0;n=49;break b}i[b+e>>0]=n;e=e+1|0;f=0}a=k[h>>2]|0;o=k[s>>2]|0;h=h+12|0;if((h|0)==(v|0)){h=r;break}else{u=n;t=a}}}d=d+12|0;if((d|0)==(w|0)){d=h;n=32;break}else r=h}if((n|0)==32){if(!f){h=e;e=g;break}if(e>>>0>>0){i[b+e>>0]=f;h=e+1|0;e=g;break}else{A=0;return A|0}}else if((n|0)==49)return d|0}else{h=e;d=0;e=0}while(0);d=d+h|0;if((d+e|0)>>>0>x>>>0){A=0;return A|0}e=k[y>>2]|0;s=k[z>>2]|0;if((e|0)!=(s|0)){g=0;p=0;while(1){f=k[e>>2]|0;r=k[e+4>>2]|0;if((f|0)==(r|0))f=p;else{o=g;while(1){g=k[f>>2]|0;n=g-o|0;q=k[f+4>>2]|0;a=q-p|0;do if((g|0)!=(o|0))if((n+255|0)>>>0<511){i[b+h>>0]=(n|0)>-1?n:0-n|0;h=h+1|0;break}else{i[b+h>>0]=n>>>8;i[b+(h+1)>>0]=n;h=h+2|0;break}while(0);do if((q|0)!=(p|0))if((a+255|0)>>>0<511){i[b+d>>0]=(a|0)>-1?a:0-a|0;d=d+1|0;break}else{i[b+d>>0]=a>>>8;i[b+(d+1)>>0]=a;d=d+2|0;break}while(0);f=f+12|0;if((f|0)==(r|0)){f=q;break}else{o=g;p=q}}}e=e+12|0;if((e|0)==(s|0))break;else p=f}}}else d=0}else{z=k[c>>2]|0;f=a+36|0;A=(i[f>>0]|0)!=0;g=a+8|0;y=m[g>>1]|0;x=ii(e|0,0,10,0)|0;y=ii(x|0,L|0,y|0,0)|0;A=ii(y|0,L|0,(A?2:0)|0,(A?0:0)|0)|0;y=L;if(0>>0|0==(y|0)&z>>>0>>0){A=0;return A|0}i[b>>0]=-1;i[b+1>>0]=-1;e=j[a>>1]|0;i[b+2>>0]=(e&65535)>>>8;i[b+3>>0]=e;e=j[a+4>>1]|0;i[b+4>>0]=(e&65535)>>>8;i[b+5>>0]=e;e=j[a+2>>1]|0;i[b+6>>0]=(e&65535)>>>8;i[b+7>>0]=e;e=j[a+6>>1]|0;i[b+8>>0]=(e&65535)>>>8;i[b+9>>0]=e;e=k[d>>2]|0;ki(b+10|0,k[a+28>>2]|0,e|0)|0;d=e+10|0;if(i[f>>0]|0){A=j[g>>1]|0;i[b+d>>0]=(A&65535)>>>8;d=e+12|0;i[b+(e+11)>>0]=A;A=m[g>>1]|0;ki(b+d|0,k[a+12>>2]|0,A|0)|0;d=A+d|0}}k[c>>2]=d;A=1;return A|0}function rc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0;m=a+8|0;f=k[m>>2]|0;n=a+4|0;e=k[n>>2]|0;c=e;if(((f-c|0)/12|0)>>>0>=b>>>0){c=b;d=e;while(1){k[d>>2]=0;k[d+4>>2]=0;k[d+8>>2]=0;c=c+-1|0;if(!c)break;else d=d+12|0}k[n>>2]=e+(b*12|0);return}l=k[a>>2]|0;d=((c-l|0)/12|0)+b|0;if(d>>>0>357913941)mg(a);i=l;c=(f-i|0)/12|0;if(c>>>0<178956970){c=c<<1;c=c>>>0>>0?d:c;e=k[n>>2]|0;d=(e-i|0)/12|0;if(!c){f=0;j=0;h=d}else g=9}else{e=k[n>>2]|0;c=357913941;d=(e-i|0)/12|0;g=9}if((g|0)==9){f=c;j=og(c*12|0)|0;h=d}d=j+(h*12|0)|0;g=j+(f*12|0)|0;c=b;f=d;while(1){k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=0;c=c+-1|0;if(!c)break;else f=f+12|0}c=d;f=j+((h+b|0)*12|0)|0;if((e|0)==(l|0))d=a;else{do{b=d+-12|0;j=e;e=e+-12|0;k[b>>2]=0;i=d+-8|0;k[i>>2]=0;k[d+-4>>2]=0;k[b>>2]=k[e>>2];b=j+-8|0;k[i>>2]=k[b>>2];j=j+-4|0;k[d+-4>>2]=k[j>>2];k[j>>2]=0;k[b>>2]=0;k[e>>2]=0;d=c+-12|0;c=d}while((e|0)!=(l|0));d=a;i=k[a>>2]|0}k[d>>2]=c;c=k[n>>2]|0;k[n>>2]=f;k[m>>2]=g;h=i;if((c|0)!=(h|0))do{d=c;c=c+-12|0;f=k[c>>2]|0;g=f;if(f){d=d+-8|0;e=k[d>>2]|0;if((e|0)!=(f|0))k[d>>2]=e+(~(((e+-12-g|0)>>>0)/12|0)*12|0);rg(f)}}while((c|0)!=(h|0));if(!i)return;rg(i);return}function sc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=a+8|0;e=k[i>>2]|0;j=a+4|0;c=k[j>>2]|0;d=c;if(((e-d|0)/12|0)>>>0>=b>>>0){do{k[c>>2]=0;k[c+4>>2]=0;k[c+8>>2]=0;c=(k[j>>2]|0)+12|0;k[j>>2]=c;b=b+-1|0}while((b|0)!=0);return}c=k[a>>2]|0;d=((d-c|0)/12|0)+b|0;if(d>>>0>357913941)mg(a);f=c;c=(e-f|0)/12|0;if(c>>>0<178956970){c=c<<1;c=c>>>0>>0?d:c;d=((k[j>>2]|0)-f|0)/12|0;if(!c){e=0;g=0}else h=8}else{c=357913941;d=((k[j>>2]|0)-f|0)/12|0;h=8}if((h|0)==8){e=c;g=og(c*12|0)|0}c=g+(d*12|0)|0;f=g+(e*12|0)|0;e=c;do{k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=0;e=c+12|0;c=e;b=b+-1|0}while((b|0)!=0);b=k[a>>2]|0;e=(k[j>>2]|0)-b|0;h=g+((((e|0)/-12|0)+d|0)*12|0)|0;ki(h|0,b|0,e|0)|0;k[a>>2]=h;k[j>>2]=c;k[i>>2]=f;if(!b)return;rg(b);return}function tc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;k[a>>2]=0;c=a+4|0;k[c>>2]=0;k[a+8>>2]=0;if(!b)return;if(b>>>0>357913941)mg(a);e=og(b*12|0)|0;k[c>>2]=e;k[a>>2]=e;d=e+(b*12|0)|0;k[a+8>>2]=d;a=e;while(1){k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;b=b+-1|0;if(!b)break;else a=a+12|0}k[c>>2]=d;return}function uc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0;j=a+8|0;e=k[j>>2]|0;l=a+4|0;c=k[l>>2]|0;d=c;if((e-d|0)>>>0>=b>>>0){do{i[c>>0]=0;c=(k[l>>2]|0)+1|0;k[l>>2]=c;b=b+-1|0}while((b|0)!=0);return}c=k[a>>2]|0;d=d-c+b|0;if((d|0)<0)mg(a);f=c;c=e-f|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?d:c;d=(k[l>>2]|0)-f|0;if(!c){e=0;g=0}else h=8}else{c=2147483647;d=(k[l>>2]|0)-f|0;h=8}if((h|0)==8){e=c;g=og(c)|0}c=g+d|0;f=g+e|0;e=c;do{i[e>>0]=0;e=c+1|0;c=e;b=b+-1|0}while((b|0)!=0);b=k[a>>2]|0;e=(k[l>>2]|0)-b|0;h=g+(d-e)|0;ki(h|0,b|0,e|0)|0;k[a>>2]=h;k[l>>2]=c;k[j>>2]=f;if(!b)return;rg(b);return}function vc(a,b){a=a|0;b=b|0;var c=0,d=0;d=a+12|0;c=k[d>>2]|0;if(!c)return 0;else a=d;a:do{while(1){if((k[c+16>>2]|0)>>>0>=b>>>0){a=c;break}c=k[c+4>>2]|0;if(!c)break a}c=k[a>>2]|0}while((c|0)!=0);if((a|0)==(d|0))return 0;else return ((k[a+16>>2]|0)>>>0>b>>>0?0:a+20|0)|0;return 0}function wc(a,b){a=a|0;b=b|0;var c=0,d=0;d=a+12|0;c=k[d>>2]|0;if(!c)return 0;else a=d;a:do{while(1){if((k[c+16>>2]|0)>>>0>=b>>>0){a=c;break}c=k[c+4>>2]|0;if(!c)break a}c=k[a>>2]|0}while((c|0)!=0);if((a|0)==(d|0))return 0;else return ((k[a+16>>2]|0)>>>0>b>>>0?0:a+20|0)|0;return 0}function xc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+16|0;h=j;k[a>>2]=0;i=a+4|0;k[i>>2]=0;k[a+8>>2]=0;c=k[b+8>>2]|0;f=b+12|0;if((c|0)==(f|0)){i=0;a=0;Rh(i,a,h);r=j;return}g=a+8|0;while(1){e=c+20|0;b=k[e>>2]|0;do if(!(b&-2139062144)){d=k[i>>2]|0;if((d|0)==(k[g>>2]|0)){Gc(a,e);break}else{k[d>>2]=b;k[i>>2]=d+4;break}}while(0);b=k[c+4>>2]|0;if(!b)while(1){b=k[c+8>>2]|0;if((k[b>>2]|0)==(c|0))break;else c=b}else while(1){c=k[b>>2]|0;if(!c)break;else b=c}if((b|0)==(f|0))break;else c=b}g=k[a>>2]|0;a=k[i>>2]|0;Rh(g,a,h);r=j;return}function yc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=r;r=r+64|0;I=L+48|0;K=L+36|0;J=L;F=d+4|0;G=a+8|0;h=k[G>>2]|0;e=h+2|0;H=a+4|0;m=k[H>>2]|0;if(e>>>0>m>>>0){K=0;r=L;return K|0}g=(k[a>>2]|0)+h|0;g=qh(l[g>>0]|l[g+1>>0]<<8)|0;j[F>>1]=g;k[G>>2]=e;i=h+8|0;if(i>>>0>m>>>0|e>>>0>(m+-6|0)>>>0){K=0;r=L;return K|0}k[G>>2]=i;B=K+4|0;k[B>>2]=0;C=K+8|0;k[C>>2]=0;f=K+4|0;k[K>>2]=f;D=f;a:do if(!(g<<16>>16)){e=1;n=74}else{q=J+20|0;E=J+24|0;s=J+32|0;t=J+4|0;u=J+8|0;v=J+12|0;w=J+16|0;x=d+8|0;y=d+12|0;z=y;A=d+12|0;p=d+16|0;e=h+12|0;k[q>>2]=0;k[q+4>>2]=0;k[q+8>>2]=0;k[q+12>>2]=0;b:do if(e>>>0<=m>>>0){d=m;o=0;c:while(1){g=k[a>>2]|0;n=g+i|0;n=rh(l[n>>0]|l[n+1>>0]<<8|l[n+2>>0]<<16|l[n+3>>0]<<24)|0;k[J>>2]=n;k[G>>2]=e;if((i+8|0)>>>0>d>>>0){n=65;break}e=g+e|0;e=rh(l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24)|0;k[t>>2]=e;e=i+8|0;k[G>>2]=e;if((i+12|0)>>>0>d>>>0){n=64;break}h=g+e|0;h=rh(l[h>>0]|l[h+1>>0]<<8|l[h+2>>0]<<16|l[h+3>>0]<<24)|0;k[u>>2]=h;e=i+12|0;k[G>>2]=e;if((i+16|0)>>>0>d>>>0){n=63;break}m=g+e|0;m=rh(l[m>>0]|l[m+1>>0]<<8|l[m+2>>0]<<16|l[m+3>>0]<<24)|0;k[v>>2]=m;k[G>>2]=i+16;if(h&3){n=67;break}if(m>>>0>c>>>0|(c-m|0)>>>0>>0){n=68;break}e=k[f>>2]|0;do if(e){while(1){g=k[e+16>>2]|0;if(h>>>0>>0){g=k[e>>2]|0;if(!g){g=e;n=13;break}else e=g}else{if(g>>>0>=h>>>0){n=19;break}g=e+4|0;d=k[g>>2]|0;if(!d){n=17;break}else e=d}}if((n|0)==13){k[I>>2]=e;n=20;break}else if((n|0)==17){k[I>>2]=e;n=20;break}else if((n|0)==19){n=0;k[I>>2]=e;if(!e){g=I;n=20;break}else break}}else{k[I>>2]=f;g=f;e=D;n=20}while(0);if((n|0)==20){d=og(24)|0;k[d+16>>2]=h;k[d+20>>2]=0;k[d>>2]=0;k[d+4>>2]=0;k[d+8>>2]=e;k[g>>2]=d;e=k[k[K>>2]>>2]|0;if(!e)e=d;else{k[K>>2]=e;e=k[g>>2]|0}Hc(k[B>>2]|0,e);k[C>>2]=(k[C>>2]|0)+1;e=d}k[e+20>>2]=m;k[w>>2]=b+(k[u>>2]|0);i=k[y>>2]|0;d=(i|0)==0;do if(!d){h=k[J>>2]|0;e=y;g=i;d:do{while(1){if((k[g+16>>2]|0)>>>0>=h>>>0){e=g;break}g=k[g+4>>2]|0;if(!g)break d}g=k[e>>2]|0}while((g|0)!=0);if((e|0)!=(y|0)?h>>>0>=(k[e+16>>2]|0)>>>0:0){n=69;break c}if(!d){d=k[J>>2]|0;h=i;while(1){e=k[h+16>>2]|0;if(d>>>0>>0){e=k[h>>2]|0;if(!e){e=h;g=h;n=36;break}}else{if(e>>>0>=d>>>0){e=h;n=42;break}g=h+4|0;e=k[g>>2]|0;if(!e){e=g;g=h;n=40;break}}h=e}if((n|0)==36){k[I>>2]=g;i=e;n=43;break}else if((n|0)==40){k[I>>2]=g;i=e;n=43;break}else if((n|0)==42){n=0;k[I>>2]=e;if(!e){i=I;g=e;n=43;break}else break}}else n=41}else n=41;while(0);if((n|0)==41){k[I>>2]=y;i=y;g=z;n=43}if((n|0)==43){n=0;e=og(56)|0;k[e+16>>2]=k[J>>2];d=e+20|0;h=d+36|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(h|0));k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=g;k[i>>2]=e;g=k[k[x>>2]>>2]|0;if(!g)g=e;else{k[x>>2]=g;g=k[i>>2]|0}Hc(k[A>>2]|0,g);k[p>>2]=(k[p>>2]|0)+1}m=e+20|0;k[m>>2]=k[J>>2];k[m+4>>2]=k[J+4>>2];k[m+8>>2]=k[J+8>>2];k[m+12>>2]=k[J+12>>2];k[m+16>>2]=k[J+16>>2];if((m|0)!=(J|0))Ic(e+40|0,k[q>>2]|0,k[E>>2]|0);k[e+52>>2]=k[s>>2];e=k[q>>2]|0;if(e){if((k[E>>2]|0)!=(e|0))k[E>>2]=e;rg(e)}o=o+1<<16>>16;d=j[F>>1]|0;if((o&65535)>=(d&65535)){n=54;break}i=k[G>>2]|0;d=k[H>>2]|0;e=i+4|0;k[q>>2]=0;k[q+4>>2]=0;k[q+8>>2]=0;k[q+12>>2]=0;if(e>>>0>d>>>0)break b}if((n|0)==54){e=k[K>>2]|0;if((e|0)==(f|0)){e=1;n=74;break a}g=e;d=(d&65535)<<4|12;while(1){e=k[g+16>>2]|0;if(e>>>0>>0){e=0;n=74;break a}d=(k[g+20>>2]|0)+e|0;if(d>>>0>>0){e=0;n=74;break a}e=k[g+4>>2]|0;if(!e)while(1){e=k[g+8>>2]|0;if((k[e>>2]|0)==(g|0))break;else g=e}else while(1){g=k[e>>2]|0;if(!g)break;else e=g}if((e|0)==(f|0)){e=1;n=74;break a}else g=e}}else if((n|0)==63){e=0;break a}else if((n|0)==64){e=0;break a}else if((n|0)==65){e=0;break a}else if((n|0)==67){e=0;break a}else if((n|0)==68){e=0;break a}else if((n|0)==69){e=k[q>>2]|0;if(e){if((k[E>>2]|0)!=(e|0))k[E>>2]=e;rg(e)}e=0;break a}}while(0);e=0}while(0);Jc(K,k[f>>2]|0);K=e;r=L;return K|0}function zc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+16|0;q=s;f=a+8|0;g=k[f>>2]|0;if((g+4|0)>>>0>(k[a+4>>2]|0)>>>0){e=0;r=s;return e|0}p=(k[a>>2]|0)+g|0;p=rh(l[p>>0]|l[p+1>>0]<<8|l[p+2>>0]<<16|l[p+3>>0]<<24)|0;k[d>>2]=p;k[f>>2]=(k[f>>2]|0)+4;if(!(yc(a,b,c,d)|0)){e=0;r=s;return e|0}g=k[d+8>>2]|0;j=d+12|0;if((g|0)==(j|0)){e=1;r=s;return e|0}m=e+4|0;n=m;o=e+4|0;p=e+8|0;while(1){i=g+28|0;f=k[m>>2]|0;d=(f|0)==0;if(!d){c=k[i>>2]|0;b=m;a=f;a:do{while(1){if((k[a+16>>2]|0)>>>0>=c>>>0){b=a;break}a=k[a+4>>2]|0;if(!a)break a}a=k[b>>2]|0}while((a|0)!=0);if((b|0)!=(m|0)?c>>>0>=(k[b+16>>2]|0)>>>0:0){while(1){b=k[f+16>>2]|0;if(c>>>0>>0){b=k[f>>2]|0;if(!b){b=f;c=38;break}else f=b}else{if(b>>>0>=c>>>0){c=43;break}b=f+4|0;a=k[b>>2]|0;if(!a){c=42;break}else f=a}}if((c|0)==38){k[q>>2]=f;a=b;b=f;c=44}else if((c|0)==42){k[q>>2]=f;a=b;b=f;c=44}else if((c|0)==43){c=0;k[q>>2]=f;if(!f){a=q;b=f;c=44}}if((c|0)==44){c=0;f=og(24)|0;k[f+16>>2]=k[i>>2];k[f+20>>2]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=b;k[a>>2]=f;b=k[k[e>>2]>>2]|0;if(!b)b=f;else{k[e>>2]=b;b=k[a>>2]|0}Hc(k[o>>2]|0,b);k[p>>2]=(k[p>>2]|0)+1}k[g+52>>2]=k[f+20>>2]}else c=13}else c=13;if((c|0)==13){c=k[g+20>>2]|0;a=k[j>>2]|0;if(a){b=j;b:do{while(1){if((k[a+16>>2]|0)>>>0>=c>>>0){b=a;break}a=k[a+4>>2]|0;if(!a)break b}a=k[b>>2]|0}while((a|0)!=0);if((b|0)!=(j|0))h=(k[b+16>>2]|0)>>>0>c>>>0?0:b+20|0;else h=0}else h=0;do if(!d){c=k[i>>2]|0;while(1){b=k[f+16>>2]|0;if(c>>>0>>0){b=k[f>>2]|0;if(!b){b=f;c=24;break}else f=b}else{if(b>>>0>=c>>>0){c=30;break}b=f+4|0;a=k[b>>2]|0;if(!a){c=28;break}else f=a}}if((c|0)==24){k[q>>2]=f;c=31;break}else if((c|0)==28){k[q>>2]=f;c=31;break}else if((c|0)==30){c=0;k[q>>2]=f;if(!f){b=q;c=31;break}else break}}else{k[q>>2]=m;b=m;f=n;c=31}while(0);if((c|0)==31){a=og(24)|0;k[a+16>>2]=k[i>>2];k[a+20>>2]=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=f;k[b>>2]=a;f=k[k[e>>2]>>2]|0;if(!f)f=a;else{k[e>>2]=f;f=k[b>>2]|0}Hc(k[o>>2]|0,f);k[p>>2]=(k[p>>2]|0)+1;f=a}k[f+20>>2]=h}f=k[g+4>>2]|0;if(!f)while(1){f=k[g+8>>2]|0;if((k[f>>2]|0)==(g|0))break;else g=f}else while(1){g=k[f>>2]|0;if(!g)break;else f=g}if((f|0)==(j|0)){f=1;break}else g=f}r=s;return f|0}function Ac(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0;w=r;r=r+32|0;v=w+16|0;o=w+12|0;u=w;s=a+8|0;e=k[s>>2]|0;n=a+4|0;if((e+4|0)>>>0>(k[n>>2]|0)>>>0){v=0;r=w;return v|0}f=k[a>>2]|0;g=f+e|0;g=rh(l[g>>0]|l[g+1>>0]<<8|l[g+2>>0]<<16|l[g+3>>0]<<24)|0;k[d>>2]=g;g=k[s>>2]|0;e=g+4|0;k[s>>2]=e;h=g+8|0;i=k[n>>2]|0;if(h>>>0>i>>>0){v=0;r=w;return v|0}j=f+e|0;j=rh(l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24)|0;k[s>>2]=h;k[v>>2]=0;t=v+4|0;k[t>>2]=0;k[v+8>>2]=0;a:do if(j){m=v+8|0;e=g+12|0;if(e>>>0>i>>>0)g=0;else{f=h;g=0;while(1){f=(k[a>>2]|0)+f|0;f=rh(l[f>>0]|l[f+1>>0]<<8|l[f+2>>0]<<16|l[f+3>>0]<<24)|0;k[o>>2]=f;k[s>>2]=e;e=k[t>>2]|0;if((e|0)==(k[m>>2]|0))Gc(v,o);else{k[e>>2]=f;k[t>>2]=e+4}g=g+1|0;if(g>>>0>=j>>>0)break;f=k[s>>2]|0;e=f+4|0;if(e>>>0>(k[n>>2]|0)>>>0){g=0;break a}}e=k[v>>2]|0;f=k[t>>2]|0;p=11}}else{e=0;f=0;p=11}while(0);if((p|0)==11){j=d+16|0;h=f-e>>2;i=d+20|0;e=k[i>>2]|0;f=k[j>>2]|0;g=(e-f|0)/20|0;if(h>>>0<=g>>>0){if(h>>>0>>0?(q=f+(h*20|0)|0,(e|0)!=(q|0)):0)do{k[i>>2]=e+-20;Lc(e+-12|0,k[e+-8>>2]|0);e=k[i>>2]|0}while((e|0)!=(q|0))}else Kc(j,h-g|0);e=k[j>>2]|0;k[u+4>>2]=0;k[u+8>>2]=0;h=u+4|0;k[u>>2]=h;f=k[v>>2]|0;g=k[t>>2]|0;b:do if((f|0)==(g|0))e=1;else while(1){k[s>>2]=k[f>>2];f=f+4|0;if(!(zc(a,b,c,e,u)|0)){e=0;break b}if((f|0)==(g|0)){e=1;break}else e=e+20|0}while(0);Mc(u,k[h>>2]|0);g=e}e=k[v>>2]|0;if(!e){v=g;r=w;return v|0}f=k[t>>2]|0;if((f|0)!=(e|0))k[t>>2]=f+(~((f+-4-e|0)>>>2)<<2);rg(e);v=g;r=w;return v|0}function Bc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,m=0;m=r;r=r+16|0;j=m;k[j>>2]=a;k[j+4>>2]=b;d=j+8|0;k[d>>2]=0;if(b>>>0<4){b=0;r=m;return b|0}i=rh(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24)|0;k[d>>2]=4;if((i|0)==1953784678){b=Ac(j,a,b,c)|0;r=m;return b|0}g=c+16|0;f=c+20|0;d=k[f>>2]|0;e=k[g>>2]|0;c=(d-e|0)/20|0;if((d|0)!=(e|0)){if(c>>>0>1?(h=e+20|0,(d|0)!=(h|0)):0)do{k[f>>2]=d+-20;Lc(d+-12|0,k[d+-8>>2]|0);d=k[f>>2]|0}while((d|0)!=(h|0))}else Kc(g,1-c|0);h=k[g>>2]|0;k[h>>2]=i;b=yc(j,a,b,h)|0;r=m;return b|0}function Cc(a){a=a|0;return (k[a+32>>2]|0)!=0|0}function Dc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;f=a+12|0;e=k[f>>2]|0;if(!e){f=0;return f|0}else{a=f;b=e}a:do{while(1){if((k[b+16>>2]|0)>>>0>=1751474532){a=b;break}b=k[b+4>>2]|0;if(!b)break a}b=k[a>>2]|0}while((b|0)!=0);if((a|0)==(f|0))c=0;else c=(k[a+16>>2]|0)>>>0>1751474532?0:a+20|0;a=f;b=e;b:do{while(1){if((k[b+16>>2]|0)>>>0>=1819239265){a=b;break}b=k[b+4>>2]|0;if(!b)break b}b=k[a>>2]|0}while((b|0)!=0);if((a|0)==(f|0)){f=0;return f|0}b=(k[a+16>>2]|0)>>>0>1819239265;d=b?0:a+20|0;if((c|0)==0|b){f=0;return f|0}if((k[c+12>>2]|0)>>>0<52){f=0;return f|0}else{a=f;b=e}c:do{while(1){if((k[b+16>>2]|0)>>>0>=1751474532){a=b;break}b=k[b+4>>2]|0;if(!b)break c}b=k[a>>2]|0}while((b|0)!=0);if((a|0)!=(f|0)?(k[a+16>>2]|0)>>>0<=1751474532:0)a=(i[(k[a+36>>2]|0)+51>>0]|0)==0?1:2;else a=1;f=((k[d+12>>2]|0)>>>a)+-1|0;return f|0}function Ec(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0,n=0;if((b|0)<0){d=0;return d|0}j=a+12|0;h=k[j>>2]|0;if(!h){d=0;return d|0}else{a=j;e=h}a:do{while(1){if((k[e+16>>2]|0)>>>0>=1751474532){a=e;break}e=k[e+4>>2]|0;if(!e)break a}e=k[a>>2]|0}while((e|0)!=0);if((a|0)==(j|0))f=0;else f=(k[a+16>>2]|0)>>>0>1751474532?0:a+20|0;a=j;e=h;b:do{while(1){if((k[e+16>>2]|0)>>>0>=1819239265){a=e;break}e=k[e+4>>2]|0;if(!e)break b}e=k[a>>2]|0}while((e|0)!=0);if((a|0)==(j|0))g=0;else g=(k[a+16>>2]|0)>>>0>1819239265?0:a+20|0;a=j;e=h;c:do{while(1){if((k[e+16>>2]|0)>>>0>=1735162214){a=e;break}e=k[e+4>>2]|0;if(!e)break c}e=k[a>>2]|0}while((e|0)!=0);if((a|0)==(j|0)){d=0;return d|0}e=(k[a+16>>2]|0)>>>0>1735162214;m=e?0:a+20|0;if((f|0)==0|(g|0)==0|e){d=0;return d|0}if((k[f+12>>2]|0)>>>0<52){d=0;return d|0}else{e=j;a=h}d:do{while(1){if((k[a+16>>2]|0)>>>0>=1751474532){e=a;break}a=k[a+4>>2]|0;if(!a)break d}a=k[e>>2]|0}while((a|0)!=0);do if((e|0)!=(j|0)?(k[e+16>>2]|0)>>>0<=1751474532:0){j=k[g+16>>2]|0;g=k[g+12>>2]|0;if(i[(k[e+36>>2]|0)+51>>0]|0){a=b<<2;if(a>>>0>1073741824|a>>>0>g>>>0){d=0;return d|0}e=a+4|0;if(e>>>0>g>>>0){d=0;return d|0}f=j+a|0;f=rh(l[f>>0]|l[f+1>>0]<<8|l[f+2>>0]<<16|l[f+3>>0]<<24)|0;if((a+8|0)>>>0>g>>>0){d=0;return d|0}a=j+e|0;a=rh(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24)|0;if(a>>>0>>0){d=0;return d|0}if(a>>>0>(k[m+12>>2]|0)>>>0){d=0;return d|0}else{k[c>>2]=(k[m+16>>2]|0)+f;a=a-f|0;break}}else{h=g;f=j;n=32}}else n=30;while(0);if((n|0)==30){h=k[g+12>>2]|0;f=k[g+16>>2]|0;n=32}do if((n|0)==32){a=b<<1;if(a>>>0>1073741824|a>>>0>h>>>0){d=0;return d|0}e=a+2|0;if(e>>>0>h>>>0){d=0;return d|0}g=f+a|0;g=qh(l[g>>0]|l[g+1>>0]<<8)|0;if((a+4|0)>>>0>h>>>0){d=0;return d|0}a=f+e|0;a=qh(l[a>>0]|l[a+1>>0]<<8)|0;e=g&65535;if((a&65535)<(g&65535)){d=0;return d|0}a=a&65535;if(a<<1>>>0>(k[m+12>>2]|0)>>>0){d=0;return d|0}else{k[c>>2]=(k[m+16>>2]|0)+(e<<1);a=a-e<<1;break}}while(0);k[d>>2]=a;d=1;return d|0}function Fc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;f=a+8|0;d=a+12|0;g=k[d>>2]|0;if(!g)return 1;else{c=d;b=g}a:while(1){while(1){if((k[b+16>>2]|0)>>>0>=1146308935){c=b;break}b=k[b+4>>2]|0;if(!b){e=c;break a}}b=k[c>>2]|0;if(!b){e=c;break}}if((e|0)==(d|0))return 1;if((e|0)==(d|0)?1:(k[e+16>>2]|0)>>>0>1146308935)return 1;b=k[e+4>>2]|0;if(!b){c=e;while(1){b=k[c+8>>2]|0;if((k[b>>2]|0)==(c|0))break;else c=b}}else while(1){c=k[b>>2]|0;if(!c)break;else b=c}if((k[f>>2]|0)==(e|0))k[f>>2]=b;d=a+16|0;k[d>>2]=(k[d>>2]|0)+-1;Nc(g,e);b=k[e+40>>2]|0;if(b){c=e+44|0;if((k[c>>2]|0)!=(b|0))k[c>>2]=b;rg(b)}rg(e);j[a+4>>1]=k[d>>2];return 1}function Gc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;h=a+4|0;i=k[a>>2]|0;j=i;d=((k[h>>2]|0)-j>>2)+1|0;if(d>>>0>1073741823)mg(a);l=a+8|0;e=i;c=(k[l>>2]|0)-e|0;if(c>>2>>>0<536870911){c=c>>1;c=c>>>0>>0?d:c;e=(k[h>>2]|0)-e|0;d=e>>2;if(!c){g=0;f=0;c=e}else m=6}else{e=(k[h>>2]|0)-e|0;c=1073741823;d=e>>2;m=6}if((m|0)==6){g=c;f=og(c<<2)|0;c=e}k[f+(d<<2)>>2]=k[b>>2];ki(f|0,i|0,c|0)|0;k[a>>2]=f;k[h>>2]=f+(d+1<<2);k[l>>2]=f+(g<<2);if(!j)return;rg(j);return}function Hc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;h=(b|0)==(a|0);i[b+12>>0]=h&1;if(h)return;while(1){f=k[b+8>>2]|0;e=f+12|0;if(i[e>>0]|0){b=37;break}h=f+8|0;d=b;b=k[h>>2]|0;c=k[b>>2]|0;if((c|0)==(f|0)){c=k[b+4>>2]|0;if(!c){c=d;g=h;e=h;d=b;a=b;b=7;break}c=c+12|0;if(i[c>>0]|0){c=d;g=h;e=h;d=b;a=b;b=7;break}i[e>>0]=1;i[b+12>>0]=(b|0)==(a|0)&1;i[c>>0]=1}else{if(!c){c=d;g=h;a=h;d=b;e=b;b=24;break}c=c+12|0;if(i[c>>0]|0){c=d;g=h;a=h;d=b;e=b;b=24;break}i[e>>0]=1;i[b+12>>0]=(b|0)==(a|0)&1;i[c>>0]=1}if((b|0)==(a|0)){b=37;break}}if((b|0)==7){if((k[f>>2]|0)==(c|0))b=f;else{h=f+4|0;b=k[h>>2]|0;c=k[b>>2]|0;k[h>>2]=c;if(!c)c=d;else{k[c+8>>2]=f;c=k[g>>2]|0}d=b+8|0;k[d>>2]=c;c=k[e>>2]|0;if((k[c>>2]|0)==(f|0))k[c>>2]=b;else k[c+4>>2]=b;k[b>>2]=f;k[g>>2]=b;a=k[d>>2]|0}i[b+12>>0]=1;i[a+12>>0]=0;d=k[a>>2]|0;e=d+4|0;b=k[e>>2]|0;k[a>>2]=b;if(b)k[b+8>>2]=a;b=a+8|0;k[d+8>>2]=k[b>>2];c=k[b>>2]|0;if((k[c>>2]|0)==(a|0))k[c>>2]=d;else k[c+4>>2]=d;k[e>>2]=a;k[b>>2]=d;return}else if((b|0)==24){if((k[f>>2]|0)==(c|0)){b=k[f>>2]|0;e=b+4|0;c=k[e>>2]|0;k[f>>2]=c;if(!c)c=d;else{k[c+8>>2]=f;c=k[g>>2]|0}d=b+8|0;k[d>>2]=c;c=k[a>>2]|0;if((k[c>>2]|0)==(f|0))k[c>>2]=b;else k[c+4>>2]=b;k[e>>2]=f;k[g>>2]=b;e=k[d>>2]|0}else b=f;i[b+12>>0]=1;i[e+12>>0]=0;h=e+4|0;d=k[h>>2]|0;b=k[d>>2]|0;k[h>>2]=b;if(b)k[b+8>>2]=e;b=e+8|0;k[d+8>>2]=k[b>>2];c=k[b>>2]|0;if((k[c>>2]|0)==(e|0))k[c>>2]=d;else k[c+4>>2]=d;k[d>>2]=e;k[b>>2]=d;return}else if((b|0)==37)return}function Ic(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0;j=c-b|0;l=a+8|0;d=k[l>>2]|0;g=k[a>>2]|0;e=g;if(j>>>0<=(d-e|0)>>>0){f=a+4|0;e=(k[f>>2]|0)-e|0;if(j>>>0<=e>>>0){li(g|0,b|0,j|0)|0;d=g+j|0;if((k[f>>2]|0)==(d|0))return;k[f>>2]=d;return}d=b+e|0;li(g|0,b|0,e|0)|0;if((d|0)==(c|0))return;b=k[f>>2]|0;do{i[b>>0]=i[d>>0]|0;b=(k[f>>2]|0)+1|0;k[f>>2]=b;d=d+1|0}while((d|0)!=(c|0));return}if(g){d=a+4|0;if((k[d>>2]|0)!=(g|0))k[d>>2]=g;rg(g);k[l>>2]=0;k[d>>2]=0;k[a>>2]=0;d=0}f=(j|0)<0;if(f)mg(a);d=d-0|0;if(d>>>0<1073741823){e=d<<1;d=e>>>0>=j>>>0;if(d|f^1)h=d?e:j;else mg(a)}else h=2147483647;d=og(h)|0;e=a+4|0;k[e>>2]=d;k[a>>2]=d;k[l>>2]=d+h;if((b|0)==(c|0))return;do{i[d>>0]=i[b>>0]|0;d=(k[e>>2]|0)+1|0;k[e>>2]=d;b=b+1|0}while((b|0)!=(c|0));return}function Jc(a,b){a=a|0;b=b|0;if(!b)return;else{Jc(a,k[b>>2]|0);Jc(a,k[b+4>>2]|0);rg(b);return}}function Kc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0,q=0;o=a+8|0;e=k[o>>2]|0;p=a+4|0;c=k[p>>2]|0;d=c;if(((e-d|0)/20|0)>>>0>=b>>>0){do{k[c>>2]=0;k[c+4>>2]=0;k[c+8>>2]=0;k[c+12>>2]=0;k[c+16>>2]=0;k[c+8>>2]=c+12;c=(k[p>>2]|0)+20|0;k[p>>2]=c;b=b+-1|0}while((b|0)!=0);return}c=k[a>>2]|0;d=((d-c|0)/20|0)+b|0;if(d>>>0>214748364)mg(a);f=c;c=(e-f|0)/20|0;if(c>>>0<107374182){c=c<<1;c=c>>>0>>0?d:c;d=((k[p>>2]|0)-f|0)/20|0;if(!c){f=0;e=0;c=d}else g=8}else{c=214748364;d=((k[p>>2]|0)-f|0)/20|0;g=8}if((g|0)==8){f=c;e=og(c*20|0)|0;c=d}g=e+(c*20|0)|0;h=g;e=e+(f*20|0)|0;d=g;c=h;do{k[d>>2]=0;k[d+4>>2]=0;k[d+8>>2]=0;k[d+12>>2]=0;k[d+16>>2]=0;k[d+8>>2]=d+12;d=c+20|0;c=d;b=b+-1|0}while((b|0)!=0);n=c;d=k[a>>2]|0;c=k[p>>2]|0;if((c|0)==(d|0)){f=a;g=p;b=h}else{f=g;b=h;do{h=f+-20|0;g=c;c=c+-20|0;k[h>>2]=k[c>>2];j[h+4>>1]=j[c+4>>1]|0;h=f+-12|0;i=g+-12|0;k[h>>2]=k[i>>2];l=k[g+-8>>2]|0;k[f+-8>>2]=l;m=g+-4|0;q=k[m>>2]|0;k[f+-4>>2]=q;f=f+-8|0;if(!q)k[h>>2]=f;else{k[l+8>>2]=f;q=g+-8|0;k[i>>2]=q;k[q>>2]=0;k[m>>2]=0}f=b+-20|0;b=f}while((c|0)!=(d|0));c=b;f=a;g=p;b=c;d=k[a>>2]|0;c=k[p>>2]|0}k[f>>2]=b;k[g>>2]=n;k[o>>2]=e;b=d;if((c|0)!=(b|0))do{Lc(c+-12|0,k[c+-8>>2]|0);c=c+-20|0}while((c|0)!=(b|0));if(!d)return;rg(d);return}function Lc(a,b){a=a|0;b=b|0;var c=0;if(!b)return;Lc(a,k[b>>2]|0);Lc(a,k[b+4>>2]|0);a=k[b+40>>2]|0;if(a){c=b+44|0;if((k[c>>2]|0)!=(a|0))k[c>>2]=a;rg(a)}rg(b);return}function Mc(a,b){a=a|0;b=b|0;if(!b)return;else{Mc(a,k[b>>2]|0);Mc(a,k[b+4>>2]|0);rg(b);return}}function Nc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0;d=k[b>>2]|0;do if(d){c=k[b+4>>2]|0;if(!c){e=b;c=b;g=7;break}else while(1){d=k[c>>2]|0;if(!d){g=5;break}else c=d}}else{c=b;g=5}while(0);if((g|0)==5){d=k[c+4>>2]|0;if(!d){j=c+8|0;l=c;d=0;m=0;h=c}else{e=c;g=7}}if((g|0)==7){j=e+8|0;k[d+8>>2]=k[j>>2];l=e;m=1;h=c}e=k[j>>2]|0;c=k[e>>2]|0;if((c|0)==(l|0)){k[e>>2]=d;if((l|0)==(a|0)){a=d;c=0}else c=k[e+4>>2]|0}else k[e+4>>2]=d;f=l+12|0;g=(i[f>>0]|0)!=0;if((l|0)!=(b|0)){n=b+8|0;e=k[n>>2]|0;k[j>>2]=e;if((k[k[n>>2]>>2]|0)==(b|0))k[e>>2]=l;else k[e+4>>2]=l;e=k[b>>2]|0;k[h>>2]=e;k[e+8>>2]=l;e=k[b+4>>2]|0;k[l+4>>2]=e;if(e)k[e+8>>2]=l;i[f>>0]=i[b+12>>0]|0;a=(a|0)==(b|0)?l:a}if(!(g&(a|0)!=0))return;if(m){i[d+12>>0]=1;return}while(1){h=k[c+8>>2]|0;d=c+12|0;e=(i[d>>0]|0)!=0;if((k[h>>2]|0)==(c|0)){if(e)e=a;else{i[d>>0]=1;i[h+12>>0]=0;f=k[h>>2]|0;g=f+4|0;d=k[g>>2]|0;k[h>>2]=d;if(d)k[d+8>>2]=h;d=h+8|0;k[f+8>>2]=k[d>>2];e=k[d>>2]|0;if((k[e>>2]|0)==(h|0))k[e>>2]=f;else k[e+4>>2]=f;k[g>>2]=h;k[d>>2]=f;n=k[c+4>>2]|0;e=(a|0)==(n|0)?c:a;c=k[n>>2]|0}a=k[c>>2]|0;d=(a|0)==0;if(!d?(i[a+12>>0]|0)==0:0){g=68;break}n=k[c+4>>2]|0;if((n|0)!=0?(i[n+12>>0]|0)==0:0){g=67;break}i[c+12>>0]=0;c=k[c+8>>2]|0;a=c+12|0;if((c|0)==(e|0)|(i[a>>0]|0)==0){g=64;break}n=k[c+8>>2]|0;a=e;c=(k[n>>2]|0)==(c|0)?n+4|0:n}else{if(!e){i[d>>0]=1;i[h+12>>0]=0;n=h+4|0;f=k[n>>2]|0;d=k[f>>2]|0;k[n>>2]=d;if(d)k[d+8>>2]=h;d=h+8|0;k[f+8>>2]=k[d>>2];e=k[d>>2]|0;if((k[e>>2]|0)==(h|0))k[e>>2]=f;else k[e+4>>2]=f;k[f>>2]=h;k[d>>2]=f;n=k[c>>2]|0;a=(a|0)==(n|0)?c:a;c=k[n+4>>2]|0}d=k[c>>2]|0;if((d|0)!=0?(i[d+12>>0]|0)==0:0){e=c;a=d;f=c;g=38;break}e=k[c+4>>2]|0;if((e|0)!=0?(i[e+12>>0]|0)==0:0){a=d;d=c;f=c;g=39;break}i[c+12>>0]=0;c=k[c+8>>2]|0;if((c|0)==(a|0)){g=36;break}if(!(i[c+12>>0]|0)){a=c;g=36;break}n=k[c+8>>2]|0;c=(k[n>>2]|0)==(c|0)?n+4|0:n}c=k[c>>2]|0}if((g|0)==36){i[a+12>>0]=1;return}else if((g|0)==38){c=k[f+4>>2]|0;if(!c){d=e;g=40}else{d=e;e=c;g=39}}else if((g|0)==64){i[a>>0]=1;return}else if((g|0)==67)if(d){e=c;g=69}else g=68;if((g|0)==39)if(!(i[e+12>>0]|0)){c=e;a=f;g=46}else g=40;else if((g|0)==68)if(!(i[a+12>>0]|0))g=75;else{e=c;g=69}if((g|0)==40){i[a+12>>0]=1;i[f+12>>0]=0;e=a+4|0;c=k[e>>2]|0;k[d>>2]=c;if(c)k[c+8>>2]=f;c=f+8|0;k[a+8>>2]=k[c>>2];d=k[c>>2]|0;if((k[d>>2]|0)==(f|0))k[d>>2]=a;else k[d+4>>2]=a;k[e>>2]=f;k[c>>2]=a;c=f;g=46}else if((g|0)==69){n=e+4|0;d=k[n>>2]|0;i[d+12>>0]=1;i[e+12>>0]=0;a=k[d>>2]|0;k[n>>2]=a;if(a)k[a+8>>2]=e;a=e+8|0;k[d+8>>2]=k[a>>2];c=k[a>>2]|0;if((k[c>>2]|0)==(e|0))k[c>>2]=d;else k[c+4>>2]=d;k[d>>2]=e;k[a>>2]=d;a=e;c=d;g=75}if((g|0)==46){e=k[a+8>>2]|0;n=e+12|0;i[a+12>>0]=i[n>>0]|0;i[n>>0]=1;i[c+12>>0]=1;n=e+4|0;d=k[n>>2]|0;a=k[d>>2]|0;k[n>>2]=a;if(a)k[a+8>>2]=e;a=e+8|0;k[d+8>>2]=k[a>>2];c=k[a>>2]|0;if((k[c>>2]|0)==(e|0))k[c>>2]=d;else k[c+4>>2]=d;k[d>>2]=e;k[a>>2]=d;return}else if((g|0)==75){f=k[c+8>>2]|0;d=f+12|0;i[c+12>>0]=i[d>>0]|0;i[d>>0]=1;i[a+12>>0]=1;d=k[f>>2]|0;e=d+4|0;a=k[e>>2]|0;k[f>>2]=a;if(a)k[a+8>>2]=f;a=f+8|0;k[d+8>>2]=k[a>>2];c=k[a>>2]|0;if((k[c>>2]|0)==(f|0))k[c>>2]=d;else k[c+4>>2]=d;k[e>>2]=f;k[a>>2]=d;return}}function Oc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0;b=vc(a,1128678944)|0;n=vc(a,1751474532)|0;j=vc(a,1735162214)|0;c=vc(a,1819239265)|0;if(!n){a=0;return a|0}d=(c|0)==0;e=(j|0)==0;if(e&((b|0)!=0&d)){a=1;return a|0}if(e|d){a=0;return a|0}m=Cc(c)|0;if(m^(Cc(j)|0)){a=0;return a|0}if(Cc(c)|0){a=1;return a|0}f=i[(k[n+16>>2]|0)+51>>0]|0;g=f&255;h=Dc(a)|0;l=~~(+(h<<1|0)+ +((k[j+12>>2]|0)>>>0)*1.1)>>>0;m=j+20|0;b=j+24|0;c=k[b>>2]|0;d=k[m>>2]|0;e=c-d|0;if(l>>>0<=e>>>0){if(l>>>0>>0?(o=d+l|0,(c|0)!=(o|0)):0)k[b>>2]=o}else uc(m,l-e|0);if(Tc(g,h,a)|0){a=1;return a|0}if(f<<24>>24){a=0;return a|0}if(!(Tc(1,h,a)|0)){a=0;return a|0}i[(k[n+20>>2]|0)+51>>0]=1;a=1;return a|0}function Pc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+16|0;q=t+12|0;i=t;c=j[a+4>>1]|0;xc(i,a);b=k[i>>2]|0;s=i+4|0;p=k[s>>2]|0;if((b|0)!=(p|0)){l=a+8|0;m=a+12|0;n=m;o=a+12|0;h=a+16|0;g=(c&65535)<<4|12;while(1){e=k[b>>2]|0;a=k[m>>2]|0;do if(a){while(1){c=k[a+16>>2]|0;if(e>>>0>>0){c=k[a>>2]|0;if(!c){c=a;d=12;break}else a=c}else{if(c>>>0>=e>>>0){d=18;break}c=a+4|0;d=k[c>>2]|0;if(!d){d=16;break}else a=d}}if((d|0)==12){k[q>>2]=a;d=19;break}else if((d|0)==16){k[q>>2]=a;d=19;break}else if((d|0)==18){d=0;k[q>>2]=a;if(!a){c=q;d=19;break}else break}}else{k[q>>2]=m;c=m;a=n;d=19}while(0);if((d|0)==19){f=og(56)|0;k[f+16>>2]=e;d=f+20|0;e=d+36|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=a;k[c>>2]=f;a=k[k[l>>2]>>2]|0;if(!a)a=f;else{k[l>>2]=a;a=k[c>>2]|0}Hc(k[o>>2]|0,a);k[h>>2]=(k[h>>2]|0)+1;a=f}k[a+28>>2]=g;a=k[a+32>>2]|0;b=b+4|0;if((b|0)==(p|0))break;else g=(a>>>0>4294967292?a:a+3&-4)+g|0}b=k[i>>2]|0}if(!b){r=t;return 1}a=k[s>>2]|0;if((a|0)!=(b|0))k[s>>2]=a+(~((a+-4-b|0)>>>2)<<2);rg(b);r=t;return 1}function Qc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0;b=vc(a,1751474532)|0;if(!b){o=0;return o|0}o=k[b+32>>2]|0;b=(o|0)==0?b:o;if((k[b+12>>2]|0)>>>0<12){o=0;return o|0}o=k[b+20>>2]|0;l=o+8|0;m=o+9|0;n=o+10|0;o=o+11|0;f=a+8|0;i[l>>0]=0;i[l+1>>0]=0;i[l+2>>0]=0;i[l+3>>0]=0;b=k[f>>2]|0;h=a+12|0;if((b|0)==(h|0))g=0;else{c=0;do{g=b+20|0;d=Cc(g)|0;g=d?k[b+52>>2]|0:g;d=bd(k[g+16>>2]|0,k[g+12>>2]|0)|0;k[g+4>>2]=d;c=d+c|0;d=k[b+4>>2]|0;if(!d)while(1){d=k[b+8>>2]|0;if((k[d>>2]|0)==(b|0)){b=d;break}else b=d}else{b=d;while(1){d=k[b>>2]|0;if(!d)break;else b=d}}}while((b|0)!=(h|0));g=c}e=k[a>>2]|0;b=j[a+4>>1]|0;if(b<<16>>16){b=b&65535;a=ja(b|0)|0;c=a^31;if((a|0)==31){d=0;c=0}else{d=1<>2]|0;if((c|0)!=(h|0)){d=c;while(1){c=d+20|0;f=Cc(c)|0;c=f?k[d+52>>2]|0:c;b=(k[c>>2]|0)+b+(k[c+4>>2]|0)+(k[c+8>>2]|0)+(k[c+12>>2]|0)|0;c=k[d+4>>2]|0;if(!c)while(1){c=k[d+8>>2]|0;if((k[c>>2]|0)==(d|0))break;else d=c}else while(1){d=k[c>>2]|0;if(!d)break;else c=d}if((c|0)==(h|0))break;else d=c}}h=-1313820742-g-b|0;i[l>>0]=h>>>24;i[m>>0]=h>>>16;i[n>>0]=h>>>8;i[o>>0]=h;o=1;return o|0}function Rc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=vc(a,1751474532)|0;if(!j){a=0;return a|0}if(!(Cc(j)|0)){h=k[j+12>>2]|0;h=h>>>0>4294967292?h:h+3&-4;f=j+20|0;g=j+24|0;c=k[g>>2]|0;b=k[f>>2]|0;d=c-b|0;if(h>>>0<=d>>>0){if(h>>>0>>0?(e=b+h|0,(c|0)!=(e|0)):0)k[g>>2]=e}else{uc(f,h-d|0);b=k[f>>2]|0}j=j+16|0;ki(b|0,k[j>>2]|0,h|0)|0;k[j>>2]=b}if(!(Fc(a)|0)){a=0;return a|0}b=vc(a,1751474532)|0;if(!b){a=0;return a|0}j=k[b+32>>2]|0;b=(j|0)==0?b:j;if((k[b+12>>2]|0)>>>0<17){a=0;return a|0}i[(k[b+20>>2]|0)+16>>0]=l[(k[b+16>>2]|0)+16>>0]|0|8;if(!(Oc(a)|0)){a=0;return a|0}Pc(a)|0;a=1;return a|0}function Sc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=r;r=r+16|0;w=y+12|0;u=y;x=a+20|0;v=a+16|0;b=k[v>>2]|0;c=(k[x>>2]|0)-b|0;if((c|0)==20){if(!(Rc(b)|0)){x=0;r=y;return x|0}x=Qc(b)|0;r=y;return x|0}c=cd(k[a>>2]|0,(c|0)/20|0)|0;b=k[v>>2]|0;a=k[x>>2]|0;if((b|0)==(a|0)){x=1;r=y;return x|0}do{if(!(Rc(b)|0)){t=6;break}c=((m[b+4>>1]|0)<<4|12)+c|0;b=b+20|0}while((b|0)!=(a|0));if((t|0)==6){Dh(72066,27,1,k[1343]|0)|0;x=0;r=y;return x|0}b=k[v>>2]|0;q=k[x>>2]|0;if((b|0)==(q|0)){x=1;r=y;return x|0}s=u+4|0;do{xc(u,b);e=k[u>>2]|0;i=k[s>>2]|0;if((e|0)!=(i|0)){j=b+8|0;l=b+12|0;n=l;o=b+12|0;p=b+16|0;do{g=k[e>>2]|0;a=k[l>>2]|0;do if(a){while(1){d=k[a+16>>2]|0;if(g>>>0>>0){d=k[a>>2]|0;if(!d){d=a;t=21;break}else a=d}else{if(d>>>0>=g>>>0){t=27;break}d=a+4|0;f=k[d>>2]|0;if(!f){t=25;break}else a=f}}if((t|0)==21){k[w>>2]=a;t=28;break}else if((t|0)==25){k[w>>2]=a;t=28;break}else if((t|0)==27){t=0;k[w>>2]=a;if(!a){d=w;t=28;break}else break}}else{k[w>>2]=l;d=l;a=n;t=28}while(0);if((t|0)==28){t=0;h=og(56)|0;k[h+16>>2]=g;f=h+20|0;g=f+36|0;do{k[f>>2]=0;f=f+4|0}while((f|0)<(g|0));k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=a;k[d>>2]=h;a=k[k[j>>2]>>2]|0;if(!a)a=h;else{k[j>>2]=a;a=k[d>>2]|0}Hc(k[o>>2]|0,a);k[p>>2]=(k[p>>2]|0)+1;a=h}if(Cc(a+20|0)|0)d=k[(k[a+52>>2]|0)+8>>2]|0;else{h=k[a+32>>2]|0;d=c;c=(h>>>0>4294967292?h:h+3&-4)+c|0}k[a+28>>2]=d;e=e+4|0}while((e|0)!=(i|0));e=k[u>>2]|0}a=e;if(e){d=k[s>>2]|0;if((d|0)!=(e|0))k[s>>2]=d+(~((d+-4-a|0)>>>2)<<2);rg(e)}b=b+20|0}while((b|0)!=(q|0));b=k[v>>2]|0;c=k[x>>2]|0;if((b|0)==(c|0)){x=1;r=y;return x|0}while(1){if(!(Qc(b)|0))break;b=b+20|0;if((b|0)==(c|0)){b=1;t=39;break}}if((t|0)==39){r=y;return b|0}Dh(72094,24,1,k[1343]|0)|0;x=0;r=y;return x|0}function Tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;J=r;r=r+64|0;A=J+16|0;B=J+8|0;C=J+4|0;z=J;H=vc(c,1735162214)|0;I=vc(c,1819239265)|0;D=(a|0)==0;l=D?2:4;G=I+20|0;m=b+1|0;a=ha((2147483646-b|0)<3?m:b+4&-4,l)|0;d=I+24|0;e=k[d>>2]|0;f=k[G>>2]|0;g=e-f|0;if(a>>>0<=g>>>0){if(a>>>0>>0?(h=f+a|0,(e|0)!=(h|0)):0)k[d>>2]=h}else{uc(G,a-g|0);f=k[G>>2]|0}y=ha(m,l)|0;k[I+12>>2]=y;y=H+20|0;o=k[y>>2]|0;if((b|0)<=0){I=0;r=J;return I|0}p=A+8|0;q=A+16|0;s=A+20|0;t=A+24|0;u=A+32|0;v=H+24|0;w=A+16|0;a=0;h=0;x=0;do{if(D){i[f+a>>0]=h>>>9;i[f+(a+1)>>0]=h>>>1;a=a+2|0}else{i[f+a>>0]=h>>>24;i[f+(a+1)>>0]=h>>>16;i[f+(a+2)>>0]=h>>>8;i[f+(a+3)>>0]=h;a=a+4|0}j[p>>1]=0;k[q>>2]=0;k[s>>2]=0;k[t>>2]=0;k[u>>2]=0;do if(Ec(c,x,B,C)|0){d=k[C>>2]|0;if((d|0)!=0?!(pc(k[B>>2]|0,d,A)|0):0){n=0;break}k[z>>2]=(k[v>>2]|0)-h-(k[y>>2]|0);if(qc(A,o+h|0,z)|0){m=k[z>>2]|0;m=m>>>0>4294967292?m:m+3&-4;k[z>>2]=m;m=m+h|0;l=m>>>0>>0|D&m>>>0>131071;n=l^1;h=l?h:m}else n=0}else n=0;while(0);d=k[w>>2]|0;if(d){e=k[s>>2]|0;if((e|0)!=(d|0)){do{g=e+-12|0;k[s>>2]=g;l=k[g>>2]|0;m=l;if(!l)e=g;else{e=e+-8|0;g=k[e>>2]|0;if((g|0)!=(l|0))k[e>>2]=g+(~(((g+-12-m|0)>>>0)/12|0)*12|0);rg(l);e=k[s>>2]|0}}while((e|0)!=(d|0));d=k[w>>2]|0}rg(d)}x=x+1|0;if(!n){a=0;E=37;break}}while((x|0)<(b|0));if((E|0)==37){r=J;return a|0}if(!h){I=0;r=J;return I|0}if(D){i[f+a>>0]=h>>>9;i[f+(a+1)>>0]=h>>>1}else{i[f+a>>0]=h>>>24;i[f+(a+1)>>0]=h>>>16;i[f+(a+2)>>0]=h>>>8;i[f+(a+3)>>0]=h}d=H+24|0;e=k[d>>2]|0;f=k[y>>2]|0;a=f;g=e-a|0;if(h>>>0<=g>>>0){if(h>>>0>>0?(F=f+h|0,(e|0)!=(F|0)):0)k[d>>2]=F}else{uc(y,h-g|0);a=k[y>>2]|0}k[H+16>>2]=a;k[H+12>>2]=h;k[I+16>>2]=k[G>>2];I=1;r=J;return I|0}function Uc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0;ya=r;r=r+160|0;xa=ya+48|0;sa=ya;ta=ya+44|0;ua=ya+40|0;b=vc(a,1735162214)|0;c=vc(a,1819239265)|0;if((c|0)==0&((b|0)==0&(vc(a,1128678944)|0)!=0)){xa=1;r=ya;return xa|0}va=Cc(b)|0;if(va^(Cc(c)|0)){xa=0;r=ya;return xa|0}if(Cc(b)|0){xa=1;r=ya;return xa|0}n=a+8|0;f=a+12|0;e=k[f>>2]|0;do if(e){d=e;while(1){b=k[d+16>>2]|0;if(b>>>0>3891067366){b=k[d>>2]|0;if(!b){b=d;c=d;va=7;break}}else{if(b>>>0>=3891067366){c=d;va=13;break}c=d+4|0;b=k[c>>2]|0;if(!b){b=c;c=d;va=11;break}}d=b}if((va|0)==7){k[xa>>2]=c;e=b;va=14;break}else if((va|0)==11){k[xa>>2]=c;e=b;va=14;break}else if((va|0)==13){k[xa>>2]=c;if(!c){e=xa;va=14;break}else{b=e;Z=c;break}}}else{k[xa>>2]=f;e=f;c=f;va=14}while(0);if((va|0)==14){d=og(56)|0;k[d+16>>2]=-403899930;g=d+20|0;h=g+36|0;do{k[g>>2]=0;g=g+4|0}while((g|0)<(h|0));k[d>>2]=0;k[d+4>>2]=0;k[d+8>>2]=c;k[e>>2]=d;b=k[k[n>>2]>>2]|0;if(!b)b=d;else{k[n>>2]=b;b=k[e>>2]|0}Hc(k[a+12>>2]|0,b);b=a+16|0;k[b>>2]=(k[b>>2]|0)+1;b=k[f>>2]|0;Z=d}do if(b){d=b;while(1){b=k[d+16>>2]|0;if(b>>>0>3975144417){b=k[d>>2]|0;if(!b){c=d;b=d;va=20;break}}else{if(b>>>0>=3975144417){b=d;va=26;break}c=d+4|0;b=k[c>>2]|0;if(!b){b=d;va=24;break}}d=b}if((va|0)==20){k[xa>>2]=b;va=27;break}else if((va|0)==24){k[xa>>2]=b;va=27;break}else if((va|0)==26){k[xa>>2]=b;if(!b){c=xa;va=27;break}else break}}else{k[xa>>2]=f;c=f;b=f;va=27}while(0);if((va|0)==27){d=og(56)|0;k[d+16>>2]=-319822879;g=d+20|0;h=g+36|0;do{k[g>>2]=0;g=g+4|0}while((g|0)<(h|0));k[d>>2]=0;k[d+4>>2]=0;k[d+8>>2]=b;k[c>>2]=d;b=k[k[n>>2]>>2]|0;if(!b)b=d;else{k[n>>2]=b;b=k[c>>2]|0}Hc(k[a+12>>2]|0,b);b=a+16|0;k[b>>2]=(k[b>>2]|0)+1;b=d}U=Dc(a)|0;la=xa+4|0;ia=xa+12|0;ka=xa+16|0;ga=xa+24|0;ja=xa+28|0;ea=xa+36|0;ha=xa+40|0;V=xa+48|0;fa=xa+52|0;ba=xa+60|0;da=xa+64|0;$=xa+72|0;ca=xa+76|0;_=xa+84|0;aa=xa+88|0;W=xa+96|0;g=xa;h=g+96|0;do{k[g>>2]=0;g=g+4|0}while((g|0)<(h|0));k[W>>2]=U;c=U+31>>5;if(c)uc(V,c<<2);a:do if((U|0)>0){R=sa+8|0;S=sa+16|0;X=sa+20|0;A=sa+24|0;B=sa+32|0;C=sa+4|0;D=sa+2|0;E=sa+6|0;F=xa+12|0;G=xa+24|0;H=xa+32|0;I=xa+72|0;J=xa+80|0;K=xa+84|0;L=sa+12|0;M=xa+48|0;N=xa+60|0;Y=sa+16|0;O=xa+36|0;P=sa+28|0;Q=sa+36|0;T=0;b:while(1){j[R>>1]=0;k[S>>2]=0;k[X>>2]=0;k[A>>2]=0;k[B>>2]=0;if(!(Ec(a,T,ta,ua)|0)){va=288;break}c=k[ua>>2]|0;if((c|0)!=0?!(pc(k[ta>>2]|0,c,sa)|0):0){va=278;break}do if(!(k[B>>2]|0)){c=k[X>>2]|0;d=k[S>>2]|0;if((c|0)==(d|0)){Vc(xa,0);break}q=c-d|0;z=(q|0)/12|0;Vc(xa,z);c=k[S>>2]|0;o=k[X>>2]|0;if((c|0)!=(o|0)?(qa=k[c>>2]|0,ra=k[c+4>>2]|0,(qa|0)!=(ra|0)):0){f=k[qa>>2]&65535;d=k[qa+4>>2]&65535;n=qa;p=ra;g=f;e=d;while(1){if((n|0)!=(p|0))do{y=k[n>>2]|0;x=y&65535;f=(y|0)<(f<<16>>16|0)?x:f;g=(y|0)>(g<<16>>16|0)?x:g;x=k[n+4>>2]|0;y=x&65535;d=(x|0)<(d<<16>>16|0)?y:d;e=(x|0)>(e<<16>>16|0)?y:e;n=n+12|0}while((n|0)!=(p|0));h=c+12|0;if((h|0)==(o|0))break;n=k[h>>2]|0;p=k[c+16>>2]|0;c=h}c=k[sa>>2]|0;if(!((c&65535)<<16>>16==f<<16>>16?(y=k[C>>2]|0,((y&65535)<<16>>16==d<<16>>16?(c>>>16&65535)<<16>>16==g<<16>>16:0)&(y>>>16&65535)<<16>>16==e<<16>>16):0))va=65}else{c=k[sa>>2]|0;if(!((c&65535)<<16>>16==0?(y=k[C>>2]|0,(c|y)>>>0<65536&(y&65535)<<16>>16==0):0))va=65}if((va|0)==65){va=0;y=(k[M>>2]|0)+(T>>3)|0;i[y>>0]=l[y>>0]|128>>>(T&7);Vc(N,j[sa>>1]|0);Vc(N,j[C>>1]|0);Vc(N,j[D>>1]|0);Vc(N,j[E>>1]|0)}if((q|0)>0){c=0;do{y=k[S>>2]|0;Zc(F,((k[y+(c*12|0)+4>>2]|0)-(k[y+(c*12|0)>>2]|0)|0)/12|0);c=c+1|0}while((c|0)<(z|0));y=0;f=0;c=0;while(1){w=k[S>>2]|0;d=k[w+(y*12|0)>>2]|0;w=(k[w+(y*12|0)+4>>2]|0)-d|0;x=(w|0)/12|0;c:do if((w|0)>0){e=0;h=c;while(1){w=k[d+(e*12|0)>>2]|0;c=k[d+(e*12|0)+4>>2]|0;o=w-f|0;g=c-h|0;t=(o|0)>-1?o:0-o|0;v=(g|0)>-1?g:0-g|0;n=(i[d+(e*12|0)+8>>0]|0)!=0?0:128;d=o>>>31^1;g=g>>>31^1;o=g<<1|d;do if((w|0)==(f|0)&(v|0)<1280){p=(g|n|v>>>7&30)&255;d=k[ja>>2]|0;f=k[H>>2]|0;do if(d>>>0>>0){i[d>>0]=p;k[ja>>2]=(k[ja>>2]|0)+1}else{q=k[G>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=73;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ja>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=77}else{f=k[ja>>2]|0;d=2147483647;g=f;f=f-o|0;va=77}if((va|0)==77){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;t=d-o|0;u=h+(f-t)|0;ki(u|0,q|0,t|0)|0;k[G>>2]=u;k[ja>>2]=h+(f+1);k[H>>2]=h+n;if(!s)break;rg(s)}while(0);p=v&255;d=k[ca>>2]|0;f=k[J>>2]|0;if(d>>>0>>0){i[d>>0]=p;k[ca>>2]=(k[ca>>2]|0)+1;break}q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=83;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=87}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-o|0;va=87}if((va|0)==87){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;u=d-o|0;v=h+(f-u)|0;ki(v|0,q|0,u|0)|0;k[I>>2]=v;k[ca>>2]=h+(f+1);k[J>>2]=h+n;if(!s)break;rg(s)}else{if((c|0)==(h|0)&(t|0)<1280){p=((t>>>7&30)+(n|10)|d)&255;d=k[ja>>2]|0;f=k[H>>2]|0;do if(d>>>0>>0){i[d>>0]=p;k[ja>>2]=(k[ja>>2]|0)+1}else{q=k[G>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=94;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ja>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=98}else{f=k[ja>>2]|0;d=2147483647;g=f;f=f-o|0;va=98}if((va|0)==98){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;u=d-o|0;v=h+(f-u)|0;ki(v|0,q|0,u|0)|0;k[G>>2]=v;k[ja>>2]=h+(f+1);k[H>>2]=h+n;if(!s)break;rg(s)}while(0);p=t&255;d=k[ca>>2]|0;f=k[J>>2]|0;if(d>>>0>>0){i[d>>0]=p;k[ca>>2]=(k[ca>>2]|0)+1;break}q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=104;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=108}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-o|0;va=108}if((va|0)==108){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;u=d-o|0;v=h+(f-u)|0;ki(v|0,q|0,u|0)|0;k[I>>2]=v;k[ca>>2]=h+(f+1);k[J>>2]=h+n;if(!s)break;rg(s);break}if((t|0)<65&(v|0)<65){u=t+-1|0;t=v+-1|0;p=((u&48)+(n|20)+(t>>>2&12)|o)&255;d=k[ja>>2]|0;f=k[H>>2]|0;do if(d>>>0>>0){i[d>>0]=p;k[ja>>2]=(k[ja>>2]|0)+1}else{q=k[G>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=115;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ja>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=119}else{f=k[ja>>2]|0;d=2147483647;g=f;f=f-o|0;va=119}if((va|0)==119){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;p=d-o|0;v=h+(f-p)|0;ki(v|0,q|0,p|0)|0;k[G>>2]=v;k[ja>>2]=h+(f+1);k[H>>2]=h+n;if(!s)break;rg(s)}while(0);p=(t&15|u<<4)&255;d=k[ca>>2]|0;f=k[J>>2]|0;if(d>>>0>>0){i[d>>0]=p;k[ca>>2]=(k[ca>>2]|0)+1;break}q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=125;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=129}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-o|0;va=129}if((va|0)==129){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;u=d-o|0;v=h+(f-u)|0;ki(v|0,q|0,u|0)|0;k[I>>2]=v;k[ca>>2]=h+(f+1);k[J>>2]=h+n;if(!s)break;rg(s);break}if((t|0)<769&(v|0)<769){t=t+-1|0;u=v+-1|0;p=(((t>>>8&3)*12|0)+(n|84)+(u>>>6&12)|o)&255;d=k[ja>>2]|0;f=k[H>>2]|0;do if(d>>>0>>0){i[d>>0]=p;k[ja>>2]=(k[ja>>2]|0)+1}else{q=k[G>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=136;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ja>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=140}else{f=k[ja>>2]|0;d=2147483647;g=f;f=f-o|0;va=140}if((va|0)==140){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;p=d-o|0;v=h+(f-p)|0;ki(v|0,q|0,p|0)|0;k[G>>2]=v;k[ja>>2]=h+(f+1);k[H>>2]=h+n;if(!s)break;rg(s)}while(0);o=t&255;d=k[ca>>2]|0;f=k[J>>2]|0;do if(d>>>0>>0){i[d>>0]=o;d=(k[ca>>2]|0)+1|0;k[ca>>2]=d}else{q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=146;break b}p=q;d=f-p|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-p|0;if(!d){n=0;h=0}else va=150}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-p|0;va=150}if((va|0)==150){va=0;n=d;h=og(d)|0}i[h+f>>0]=o;d=h+(f+1)|0;t=g-p|0;v=h+(f-t)|0;ki(v|0,q|0,t|0)|0;k[I>>2]=v;k[ca>>2]=d;k[J>>2]=h+n;if(!s)break;rg(s);d=k[ca>>2]|0}while(0);p=u&255;f=k[J>>2]|0;if(d>>>0>>0){i[d>>0]=p;k[ca>>2]=(k[ca>>2]|0)+1;break}q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=156;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=160}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-o|0;va=160}if((va|0)==160){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;u=d-o|0;v=h+(f-u)|0;ki(v|0,q|0,u|0)|0;k[I>>2]=v;k[ca>>2]=h+(f+1);k[J>>2]=h+n;if(!s)break;rg(s);break}d=o|n;if((t|0)<4096&(v|0)<4096){p=(d|120)&255;d=k[ja>>2]|0;f=k[H>>2]|0;do if(d>>>0>>0){i[d>>0]=p;k[ja>>2]=(k[ja>>2]|0)+1}else{q=k[G>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=167;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ja>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=171}else{f=k[ja>>2]|0;d=2147483647;g=f;f=f-o|0;va=171}if((va|0)==171){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;p=d-o|0;u=h+(f-p)|0;ki(u|0,q|0,p|0)|0;k[G>>2]=u;k[ja>>2]=h+(f+1);k[H>>2]=h+n;if(!s)break;rg(s)}while(0);o=t>>>4&255;d=k[ca>>2]|0;f=k[J>>2]|0;do if(d>>>0>>0){i[d>>0]=o;d=(k[ca>>2]|0)+1|0;k[ca>>2]=d}else{q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=177;break b}p=q;d=f-p|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-p|0;if(!d){n=0;h=0}else va=181}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-p|0;va=181}if((va|0)==181){va=0;n=d;h=og(d)|0}i[h+f>>0]=o;d=h+(f+1)|0;p=g-p|0;u=h+(f-p)|0;ki(u|0,q|0,p|0)|0;k[I>>2]=u;k[ca>>2]=d;k[J>>2]=h+n;if(!s)break;rg(s);d=k[ca>>2]|0}while(0);o=(v>>>8|t<<4)&255;f=k[J>>2]|0;do if(d>>>0>>0){i[d>>0]=o;d=(k[ca>>2]|0)+1|0;k[ca>>2]=d}else{q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=187;break b}p=q;d=f-p|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-p|0;if(!d){n=0;h=0}else va=191}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-p|0;va=191}if((va|0)==191){va=0;n=d;h=og(d)|0}i[h+f>>0]=o;d=h+(f+1)|0;t=g-p|0;u=h+(f-t)|0;ki(u|0,q|0,t|0)|0;k[I>>2]=u;k[ca>>2]=d;k[J>>2]=h+n;if(!s)break;rg(s);d=k[ca>>2]|0}while(0);p=v&255;f=k[J>>2]|0;if(d>>>0>>0){i[d>>0]=p;k[ca>>2]=(k[ca>>2]|0)+1;break}q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=197;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=201}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-o|0;va=201}if((va|0)==201){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;u=d-o|0;v=h+(f-u)|0;ki(v|0,q|0,u|0)|0;k[I>>2]=v;k[ca>>2]=h+(f+1);k[J>>2]=h+n;if(!s)break;rg(s);break}p=(d|124)&255;d=k[ja>>2]|0;f=k[H>>2]|0;do if(d>>>0>>0){i[d>>0]=p;k[ja>>2]=(k[ja>>2]|0)+1}else{q=k[G>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=207;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ja>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=211}else{f=k[ja>>2]|0;d=2147483647;g=f;f=f-o|0;va=211}if((va|0)==211){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;p=d-o|0;u=h+(f-p)|0;ki(u|0,q|0,p|0)|0;k[G>>2]=u;k[ja>>2]=h+(f+1);k[H>>2]=h+n;if(!s)break;rg(s)}while(0);o=t>>>8&255;d=k[ca>>2]|0;f=k[J>>2]|0;do if(d>>>0>>0){i[d>>0]=o;d=(k[ca>>2]|0)+1|0;k[ca>>2]=d}else{q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=217;break b}p=q;d=f-p|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-p|0;if(!d){n=0;h=0}else va=221}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-p|0;va=221}if((va|0)==221){va=0;n=d;h=og(d)|0}i[h+f>>0]=o;d=h+(f+1)|0;p=g-p|0;u=h+(f-p)|0;ki(u|0,q|0,p|0)|0;k[I>>2]=u;k[ca>>2]=d;k[J>>2]=h+n;if(!s)break;rg(s);d=k[ca>>2]|0}while(0);o=t&255;f=k[J>>2]|0;do if(d>>>0>>0){i[d>>0]=o;d=(k[ca>>2]|0)+1|0;k[ca>>2]=d}else{q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=227;break b}p=q;d=f-p|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-p|0;if(!d){n=0;h=0}else va=231}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-p|0;va=231}if((va|0)==231){va=0;n=d;h=og(d)|0}i[h+f>>0]=o;d=h+(f+1)|0;t=g-p|0;u=h+(f-t)|0;ki(u|0,q|0,t|0)|0;k[I>>2]=u;k[ca>>2]=d;k[J>>2]=h+n;if(!s)break;rg(s);d=k[ca>>2]|0}while(0);o=v>>>8&255;f=k[J>>2]|0;do if(d>>>0>>0){i[d>>0]=o;d=(k[ca>>2]|0)+1|0;k[ca>>2]=d}else{q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=237;break b}p=q;d=f-p|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;f=k[ca>>2]|0;g=f-p|0;if(!d){n=0;h=0}else va=241}else{g=k[ca>>2]|0;d=2147483647;f=g;g=g-p|0;va=241}if((va|0)==241){va=0;n=d;h=og(d)|0}i[h+g>>0]=o;d=h+(g+1)|0;t=f-p|0;u=h+(g-t)|0;ki(u|0,q|0,t|0)|0;k[I>>2]=u;k[ca>>2]=d;k[J>>2]=h+n;if(!s)break;rg(s);d=k[ca>>2]|0}while(0);p=v&255;f=k[J>>2]|0;if(d>>>0>>0){i[d>>0]=p;k[ca>>2]=(k[ca>>2]|0)+1;break}q=k[I>>2]|0;s=q;g=d-s+1|0;if((g|0)<0){va=247;break b}o=q;d=f-o|0;if(d>>>0<1073741823){d=d<<1;d=d>>>0>>0?g:d;g=k[ca>>2]|0;f=g-o|0;if(!d){n=0;h=0;d=g}else va=251}else{f=k[ca>>2]|0;d=2147483647;g=f;f=f-o|0;va=251}if((va|0)==251){va=0;n=d;h=og(d)|0;d=g}i[h+f>>0]=p;u=d-o|0;v=h+(f-u)|0;ki(v|0,q|0,u|0)|0;k[I>>2]=v;k[ca>>2]=h+(f+1);k[J>>2]=h+n;if(!s)break;rg(s)}while(0);e=e+1|0;if((e|0)>=(x|0)){d=w;break c}d=k[(k[S>>2]|0)+(y*12|0)>>2]|0;f=w;h=c}}else d=f;while(0);y=y+1|0;if((y|0)>=(z|0))break;else f=d}Zc(I,m[R>>1]|0);f=k[L>>2]|0;z=j[R>>1]|0;g=z&65535;if(z<<16>>16){e=k[aa>>2]|0;c=k[K>>2]|0;h=e-c|0;d=h+g|0;do if(h>>>0>=d>>>0){if(h>>>0>d>>>0){d=c+d|0;if((e|0)==(d|0))break;k[aa>>2]=d}}else{uc(K,g);c=k[K>>2]|0}while(0);ki(c+h|0,f|0,g|0)|0}}}else{Vc(xa,-1);f=(k[M>>2]|0)+(T>>3)|0;i[f>>0]=l[f>>0]|128>>>(T&7);Vc(N,j[sa>>1]|0);Vc(N,j[C>>1]|0);Vc(N,j[D>>1]|0);Vc(N,j[E>>1]|0);f=k[P>>2]|0;g=k[B>>2]|0;if(g){d=k[ha>>2]|0;c=k[O>>2]|0;h=d-c|0;e=h+g|0;if(h>>>0>=e>>>0){if(h>>>0>e>>>0?(ma=c+e|0,(d|0)!=(ma|0)):0)k[ha>>2]=ma}else{uc(O,g);c=k[O>>2]|0}ki(c+h|0,f|0,g|0)|0}if((i[Q>>0]|0)!=0?(Zc(I,m[R>>1]|0),na=k[L>>2]|0,z=j[R>>1]|0,oa=z&65535,z<<16>>16!=0):0){d=k[aa>>2]|0;c=k[K>>2]|0;f=d-c|0;e=f+oa|0;if(f>>>0>=e>>>0){if(f>>>0>e>>>0?(pa=c+e|0,(d|0)!=(pa|0)):0)k[aa>>2]=pa}else{uc(K,oa);c=k[K>>2]|0}ki(c+f|0,na|0,oa|0)|0}}while(0);c=k[Y>>2]|0;if(c){d=k[X>>2]|0;if((d|0)!=(c|0)){do{e=d+-12|0;k[X>>2]=e;f=k[e>>2]|0;g=f;if(!f)d=e;else{d=d+-8|0;e=k[d>>2]|0;if((e|0)!=(f|0))k[d>>2]=e+(~(((e+-12-g|0)>>>0)/12|0)*12|0);rg(f);d=k[X>>2]|0}}while((d|0)!=(c|0));c=k[Y>>2]|0}rg(c)}T=T+1|0;if((T|0)>=(U|0)){va=275;break a}}switch(va|0){case 73:{mg(G);break}case 83:{mg(I);break}case 94:{mg(G);break}case 104:{mg(I);break}case 115:{mg(G);break}case 125:{mg(I);break}case 136:{mg(G);break}case 146:{mg(I);break}case 156:{mg(I);break}case 167:{mg(G);break}case 177:{mg(I);break}case 187:{mg(I);break}case 197:{mg(I);break}case 207:{mg(G);break}case 217:{mg(I);break}case 227:{mg(I);break}case 237:{mg(I);break}case 247:{mg(I);break}case 278:{b=k[Y>>2]|0;if(b){c=k[X>>2]|0;if((c|0)!=(b|0)){do{d=c+-12|0;k[X>>2]=d;e=k[d>>2]|0;f=e;if(!e)c=d;else{c=c+-8|0;d=k[c>>2]|0;if((d|0)!=(e|0))k[c>>2]=d+(~(((d+-12-f|0)>>>0)/12|0)*12|0);rg(e);c=k[X>>2]|0}}while((c|0)!=(b|0));b=k[Y>>2]|0}rg(b)}wa=0;break a}case 288:{b=k[Y>>2]|0;if(b){c=k[X>>2]|0;if((c|0)!=(b|0)){do{d=c+-12|0;k[X>>2]=d;e=k[d>>2]|0;f=e;if(!e)c=d;else{c=c+-8|0;d=k[c>>2]|0;if((d|0)!=(e|0))k[c>>2]=d+(~(((d+-12-f|0)>>>0)/12|0)*12|0);rg(e);c=k[X>>2]|0}}while((c|0)!=(b|0));b=k[Y>>2]|0}rg(b)}wa=0;break a}}}else va=275;while(0);if((va|0)==275){d=Z+40|0;Wc(d,0);Vc(d,k[W>>2]|0);Vc(d,0);Wc(d,(k[la>>2]|0)-(k[xa>>2]|0)|0);sa=xa+12|0;Wc(d,(k[ka>>2]|0)-(k[sa>>2]|0)|0);ta=xa+24|0;Wc(d,(k[ja>>2]|0)-(k[ta>>2]|0)|0);ua=xa+72|0;Wc(d,(k[ca>>2]|0)-(k[ua>>2]|0)|0);va=xa+36|0;Wc(d,(k[ha>>2]|0)-(k[va>>2]|0)|0);wa=xa+60|0;Wc(d,(k[fa>>2]|0)-(k[V>>2]|0)+(k[da>>2]|0)-(k[wa>>2]|0)|0);c=xa+84|0;Wc(d,(k[aa>>2]|0)-(k[c>>2]|0)|0);Xc(d,xa);Xc(d,sa);Xc(d,ta);Xc(d,ua);Xc(d,va);Xc(d,V);Xc(d,wa);Xc(d,c);c=vc(a,1751474532)|0;if((c|0)!=0?(k[c+12>>2]|0)>>>0>=52:0){i[(k[d>>2]|0)+7>>0]=i[(k[c+16>>2]|0)+51>>0]|0;k[Z+20>>2]=-403899930;wa=k[d>>2]|0;k[Z+32>>2]=(k[Z+44>>2]|0)-wa;k[Z+36>>2]=wa;k[b+20>>2]=-319822879;k[b+32>>2]=0;k[b+36>>2]=0;wa=1}else wa=0}b=k[_>>2]|0;if(b){if((k[aa>>2]|0)!=(b|0))k[aa>>2]=b;rg(b)}b=k[$>>2]|0;if(b){if((k[ca>>2]|0)!=(b|0))k[ca>>2]=b;rg(b)}b=k[ba>>2]|0;if(b){if((k[da>>2]|0)!=(b|0))k[da>>2]=b;rg(b)}b=k[xa+48>>2]|0;if(b){if((k[fa>>2]|0)!=(b|0))k[fa>>2]=b;rg(b)}b=k[ea>>2]|0;if(b){if((k[ha>>2]|0)!=(b|0))k[ha>>2]=b;rg(b)}b=k[ga>>2]|0;if(b){if((k[ja>>2]|0)!=(b|0))k[ja>>2]=b;rg(b)}b=k[ia>>2]|0;if(b){if((k[ka>>2]|0)!=(b|0))k[ka>>2]=b;rg(b)}b=k[xa>>2]|0;if(b){if((k[la>>2]|0)!=(b|0))k[la>>2]=b;rg(b)}xa=wa;r=ya;return xa|0}function Vc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0;h=b>>>8&255;n=a+4|0;c=k[n>>2]|0;o=a+8|0;e=k[o>>2]|0;if(c>>>0>=e>>>0){m=k[a>>2]|0;l=m;d=c-l+1|0;if((d|0)<0)mg(a);j=m;c=e-j|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?d:c;d=k[n>>2]|0;e=d-j|0;if(!c){g=0;f=0}else p=8}else{e=k[n>>2]|0;c=2147483647;d=e;e=e-j|0;p=8}if((p|0)==8){g=c;f=og(c)|0}i[f+e>>0]=h;c=f+(e+1)|0;h=d-j|0;j=f+(e-h)|0;ki(j|0,m|0,h|0)|0;k[a>>2]=j;k[n>>2]=c;k[o>>2]=f+g;if(l){rg(l);c=k[n>>2]|0}}else{i[c>>0]=h;c=(k[n>>2]|0)+1|0;k[n>>2]=c}j=b&255;d=k[o>>2]|0;if(c>>>0>>0){i[c>>0]=j;k[n>>2]=(k[n>>2]|0)+1;return}l=k[a>>2]|0;m=l;e=c-m+1|0;if((e|0)<0)mg(a);h=l;c=d-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;e=k[n>>2]|0;d=e-h|0;if(!c){g=0;f=0;c=e}else p=18}else{d=k[n>>2]|0;c=2147483647;e=d;d=d-h|0;p=18}if((p|0)==18){g=c;f=og(c)|0;c=e}i[f+d>>0]=j;b=c-h|0;p=f+(d-b)|0;ki(p|0,l|0,b|0)|0;k[a>>2]=p;k[n>>2]=f+(d+1);k[o>>2]=f+g;if(!m)return;rg(m);return}function Wc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0;h=b>>>24&255;n=a+4|0;c=k[n>>2]|0;o=a+8|0;e=k[o>>2]|0;if(c>>>0>=e>>>0){m=k[a>>2]|0;l=m;d=c-l+1|0;if((d|0)<0)mg(a);j=m;c=e-j|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?d:c;e=k[n>>2]|0;d=e-j|0;if(!c){g=0;f=0}else p=8}else{d=k[n>>2]|0;c=2147483647;e=d;d=d-j|0;p=8}if((p|0)==8){g=c;f=og(c)|0}i[f+d>>0]=h;c=f+(d+1)|0;h=e-j|0;j=f+(d-h)|0;ki(j|0,m|0,h|0)|0;k[a>>2]=j;k[n>>2]=c;k[o>>2]=f+g;if(l){rg(l);c=k[n>>2]|0}}else{i[c>>0]=h;c=(k[n>>2]|0)+1|0;k[n>>2]=c}h=b>>>16&255;d=k[o>>2]|0;if(c>>>0>=d>>>0){l=k[a>>2]|0;m=l;e=c-m+1|0;if((e|0)<0)mg(a);j=l;c=d-j|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;e=k[n>>2]|0;d=e-j|0;if(!c){g=0;f=0}else p=18}else{d=k[n>>2]|0;c=2147483647;e=d;d=d-j|0;p=18}if((p|0)==18){g=c;f=og(c)|0}i[f+d>>0]=h;c=f+(d+1)|0;h=e-j|0;j=f+(d-h)|0;ki(j|0,l|0,h|0)|0;k[a>>2]=j;k[n>>2]=c;k[o>>2]=f+g;if(m){rg(m);c=k[n>>2]|0}}else{i[c>>0]=h;c=(k[n>>2]|0)+1|0;k[n>>2]=c}j=b>>>8&255;d=k[o>>2]|0;if(c>>>0>=d>>>0){l=k[a>>2]|0;m=l;e=c-m+1|0;if((e|0)<0)mg(a);h=l;c=d-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;d=k[n>>2]|0;e=d-h|0;if(!c){g=0;f=0}else p=28}else{e=k[n>>2]|0;c=2147483647;d=e;e=e-h|0;p=28}if((p|0)==28){g=c;f=og(c)|0}i[f+e>>0]=j;c=f+(e+1)|0;h=d-h|0;j=f+(e-h)|0;ki(j|0,l|0,h|0)|0;k[a>>2]=j;k[n>>2]=c;k[o>>2]=f+g;if(m){rg(m);c=k[n>>2]|0}}else{i[c>>0]=j;c=(k[n>>2]|0)+1|0;k[n>>2]=c}j=b&255;d=k[o>>2]|0;if(c>>>0>>0){i[c>>0]=j;k[n>>2]=(k[n>>2]|0)+1;return}l=k[a>>2]|0;m=l;e=c-m+1|0;if((e|0)<0)mg(a);h=l;c=d-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;e=k[n>>2]|0;d=e-h|0;if(!c){g=0;f=0;c=e}else p=38}else{d=k[n>>2]|0;c=2147483647;e=d;d=d-h|0;p=38}if((p|0)==38){g=c;f=og(c)|0;c=e}i[f+d>>0]=j;b=c-h|0;p=f+(d-b)|0;ki(p|0,l|0,b|0)|0;k[a>>2]=p;k[n>>2]=f+(d+1);k[o>>2]=f+g;if(!m)return;rg(m);return}function Xc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=b+4|0;c=k[b>>2]|0;if((k[o>>2]|0)==(c|0))return;p=a+4|0;q=a+8|0;n=0;while(1){m=c+n|0;c=k[p>>2]|0;if((c|0)==(k[q>>2]|0)){h=k[a>>2]|0;j=h;d=c-j+1|0;if((d|0)<0){r=6;break}l=h;c=c-l|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?d:c;e=k[p>>2]|0;d=e-l|0;if(!c){g=0;f=0;c=e}else r=10}else{d=k[p>>2]|0;c=2147483647;e=d;d=d-l|0;r=10}if((r|0)==10){r=0;g=c;f=og(c)|0;c=e}i[f+d>>0]=i[m>>0]|0;l=c-l|0;m=f+(d-l)|0;ki(m|0,h|0,l|0)|0;k[a>>2]=m;k[p>>2]=f+(d+1);k[q>>2]=f+g;if(j)rg(j)}else{i[c>>0]=i[m>>0]|0;k[p>>2]=(k[p>>2]|0)+1}n=n+1|0;c=k[b>>2]|0;if(n>>>0>=((k[o>>2]|0)-c|0)>>>0){r=14;break}}if((r|0)==6)mg(a);else if((r|0)==14)return}function Yc(a){a=a|0;return ((a&65535)<253?1:(a&65535)<762?2:3)|0}function Zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0;if((b|0)<253){j=b&255;m=a+4|0;c=k[m>>2]|0;n=a+8|0;e=k[n>>2]|0;if(c>>>0>>0){i[c>>0]=j;k[m>>2]=(k[m>>2]|0)+1;return}o=k[a>>2]|0;l=o;d=c-l+1|0;if((d|0)<0)mg(a);h=o;c=e-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?d:c;e=k[m>>2]|0;d=e-h|0;if(!c){g=0;f=0;c=e}else p=9}else{d=k[m>>2]|0;c=2147483647;e=d;d=d-h|0;p=9}if((p|0)==9){g=c;f=og(c)|0;c=e}i[f+d>>0]=j;b=c-h|0;p=f+(d-b)|0;ki(p|0,o|0,b|0)|0;k[a>>2]=p;k[m>>2]=f+(d+1);k[n>>2]=f+g;if(!l)return;rg(l);return}if((b|0)<506){n=a+4|0;c=k[n>>2]|0;o=a+8|0;d=k[o>>2]|0;if(c>>>0>=d>>>0){j=k[a>>2]|0;l=j;e=c-l+1|0;if((e|0)<0)mg(a);h=j;c=d-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;e=k[n>>2]|0;d=e-h|0;if(!c){g=0;f=0}else p=20}else{d=k[n>>2]|0;c=2147483647;e=d;d=d-h|0;p=20}if((p|0)==20){g=c;f=og(c)|0}i[f+d>>0]=-1;c=f+(d+1)|0;h=e-h|0;m=f+(d-h)|0;ki(m|0,j|0,h|0)|0;k[a>>2]=m;k[n>>2]=c;k[o>>2]=f+g;if(l){rg(l);c=k[n>>2]|0}}else{i[c>>0]=-1;c=(k[n>>2]|0)+1|0;k[n>>2]=c}j=b+3&255;d=k[o>>2]|0;if(c>>>0>>0){i[c>>0]=j;k[n>>2]=(k[n>>2]|0)+1;return}l=k[a>>2]|0;m=l;e=c-m+1|0;if((e|0)<0)mg(a);h=l;c=d-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;e=k[n>>2]|0;d=e-h|0;if(!c){g=0;f=0;c=e}else p=30}else{d=k[n>>2]|0;c=2147483647;e=d;d=d-h|0;p=30}if((p|0)==30){g=c;f=og(c)|0;c=e}i[f+d>>0]=j;b=c-h|0;p=f+(d-b)|0;ki(p|0,l|0,b|0)|0;k[a>>2]=p;k[n>>2]=f+(d+1);k[o>>2]=f+g;if(!m)return;rg(m);return}n=a+4|0;d=k[n>>2]|0;o=a+8|0;e=k[o>>2]|0;c=d>>>0>>0;if((b|0)<762){if(!c){j=k[a>>2]|0;l=j;d=d-l+1|0;if((d|0)<0)mg(a);h=j;c=e-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?d:c;d=k[n>>2]|0;e=d-h|0;if(!c){g=0;f=0}else p=41}else{e=k[n>>2]|0;c=2147483647;d=e;e=e-h|0;p=41}if((p|0)==41){g=c;f=og(c)|0}i[f+e>>0]=-2;c=f+(e+1)|0;h=d-h|0;m=f+(e-h)|0;ki(m|0,j|0,h|0)|0;k[a>>2]=m;k[n>>2]=c;k[o>>2]=f+g;if(l){rg(l);c=k[n>>2]|0}}else{i[d>>0]=-2;c=(k[n>>2]|0)+1|0;k[n>>2]=c}j=b+6&255;d=k[o>>2]|0;if(c>>>0>>0){i[c>>0]=j;k[n>>2]=(k[n>>2]|0)+1;return}l=k[a>>2]|0;m=l;e=c-m+1|0;if((e|0)<0)mg(a);h=l;c=d-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;e=k[n>>2]|0;d=e-h|0;if(!c){g=0;f=0;c=e}else p=51}else{d=k[n>>2]|0;c=2147483647;e=d;d=d-h|0;p=51}if((p|0)==51){g=c;f=og(c)|0;c=e}i[f+d>>0]=j;b=c-h|0;p=f+(d-b)|0;ki(p|0,l|0,b|0)|0;k[a>>2]=p;k[n>>2]=f+(d+1);k[o>>2]=f+g;if(!m)return;rg(m);return}if(!c){j=k[a>>2]|0;l=j;d=d-l+1|0;if((d|0)<0)mg(a);h=j;c=e-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?d:c;d=k[n>>2]|0;e=d-h|0;if(!c){g=0;f=0}else p=61}else{e=k[n>>2]|0;c=2147483647;d=e;e=e-h|0;p=61}if((p|0)==61){g=c;f=og(c)|0}i[f+e>>0]=-3;c=f+(e+1)|0;h=d-h|0;m=f+(e-h)|0;ki(m|0,j|0,h|0)|0;k[a>>2]=m;k[n>>2]=c;k[o>>2]=f+g;if(l){rg(l);c=k[n>>2]|0}}else{i[d>>0]=-3;c=(k[n>>2]|0)+1|0;k[n>>2]=c}h=b>>>8&255;d=k[o>>2]|0;if(c>>>0>=d>>>0){l=k[a>>2]|0;m=l;e=c-m+1|0;if((e|0)<0)mg(a);j=l;c=d-j|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;d=k[n>>2]|0;e=d-j|0;if(!c){g=0;f=0}else p=71}else{e=k[n>>2]|0;c=2147483647;d=e;e=e-j|0;p=71}if((p|0)==71){g=c;f=og(c)|0}i[f+e>>0]=h;c=f+(e+1)|0;h=d-j|0;j=f+(e-h)|0;ki(j|0,l|0,h|0)|0;k[a>>2]=j;k[n>>2]=c;k[o>>2]=f+g;if(m){rg(m);c=k[n>>2]|0}}else{i[c>>0]=h;c=(k[n>>2]|0)+1|0;k[n>>2]=c}j=b&255;d=k[o>>2]|0;if(c>>>0>>0){i[c>>0]=j;k[n>>2]=(k[n>>2]|0)+1;return}l=k[a>>2]|0;m=l;e=c-m+1|0;if((e|0)<0)mg(a);h=l;c=d-h|0;if(c>>>0<1073741823){c=c<<1;c=c>>>0>>0?e:c;e=k[n>>2]|0;d=e-h|0;if(!c){g=0;f=0;c=e}else p=81}else{d=k[n>>2]|0;c=2147483647;e=d;d=d-h|0;p=81}if((p|0)==81){g=c;f=og(c)|0;c=e}i[f+d>>0]=j;b=c-h|0;p=f+(d-b)|0;ki(p|0,l|0,b|0)|0;k[a>>2]=p;k[n>>2]=f+(d+1);k[o>>2]=f+g;if(!m)return;rg(m);return}function _c(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0;h=r;r=r+16|0;d=h;k[d>>2]=0;g=d+4|0;k[g>>2]=0;k[d+8>>2]=0;Zc(d,a);a=k[d>>2]|0;d=k[g>>2]|0;e=(a|0)==(d|0);if(!e){f=a;do{l=i[f>>0]|0;j=k[b>>2]|0;k[b>>2]=j+1;i[c+j>>0]=l;f=f+1|0}while((f|0)!=(d|0))}if(!a){r=h;return}if(!e)k[g>>2]=a;rg(a);r=h;return}function $c(a){a=a|0;var b=0;if(a>>>0>127){b=1;while(1){b=b+1|0;if(a>>>0>16383)a=a>>>7;else{a=b;break}}}else a=1;return a|0}function ad(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;if(a>>>0>127){e=a;d=1;while(1){d=d+1|0;if(e>>>0>16383)e=e>>>7;else break}if(!d)return}else d=1;e=d+-1|0;f=0;do{h=a>>>(((d-f|0)*7|0)+-7|0);g=k[b>>2]|0;k[b>>2]=g+1;i[c+g>>0]=f>>>0>>0?h|128:h&127;f=f+1|0}while((f|0)!=(d|0));return}function bd(a,b){a=a|0;b=b|0;var c=0,d=0;if(!b){b=0;return b|0}else{c=0;d=0}do{c=((l[a+(d|1)>>0]|0)<<16|(l[a+d>>0]|0)<<24|(l[a+(d|2)>>0]|0)<<8|(l[a+(d|3)>>0]|0))+c|0;d=d+4|0}while(d>>>0>>0);return c|0}function cd(a,b){a=a|0;b=b|0;var c=0,d=0;c=(a|0)==131072?12:0;if((a|0)<131072)switch(a|0){case 65536:{d=2;break}default:{}}else switch(a|0){case 131072:{d=2;break}default:{}}if((d|0)==2)c=(b<<2)+12+c|0;return c|0}function dd(a,b){a=a|0;b=b|0;var c=0,d=0;a=r;r=r+16|0;c=a;ai(c,318131,0);d=i[c>>0]|0;b=b+1024+((d&1)==0?(d&255)>>>1:k[c+4>>2]|0)|0;bi(c);r=a;return b|0}function ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=r;r=r+16|0;f=e;ai(f,318131,0);d=fd(a,b,c,d,f)|0;bi(f);r=e;return d|0}function fd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=r;r=r+224|0;X=ha+196|0;_=ha+16|0;Y=ha+8|0;N=ha;J=ha+164|0;I=ha+132|0;ga=ha+168|0;da=ha+152|0;ca=ha+120|0;ba=ha+108|0;aa=ha+96|0;$=ha+84|0;F=ha+72|0;G=ha+40|0;M=ha+28|0;Z=ha+24|0;k[ga+8>>2]=0;k[ga+12>>2]=0;fa=ga+8|0;k[ga+4>>2]=fa;R=ga+16|0;k[R>>2]=0;ea=ga+20|0;k[ea>>2]=0;k[ga+24>>2]=0;do if(Bc(a,b,ga)|0)if(Sc(ga)|0){a=k[R>>2]|0;b=k[ea>>2]|0;if((a|0)!=(b|0)){do{if(!(Uc(a)|0)){H=7;break}a=a+20|0}while((a|0)!=(b|0));if((H|0)==7){Dh(72154,28,1,k[1343]|0)|0;g=0;break}a=k[R>>2]|0;o=k[ea>>2]|0;if((a|0)!=(o|0)){b=0;do{f=k[a+8>>2]|0;n=a+12|0;if((f|0)==(n|0))f=0;else{h=f;f=0;while(1){g=h+20|0;do if(!(Cc(g)|0)){g=k[g>>2]|0;if((g&-2139062144|0)==0?(wc(a,g^-2139062144)|0)!=0:0)break;f=(k[h+32>>2]|0)+f|0}while(0);g=k[h+4>>2]|0;if(!g)while(1){g=k[h+8>>2]|0;if((k[g>>2]|0)==(h|0))break;else h=g}else while(1){h=k[g>>2]|0;if(!h)break;else g=h}if((g|0)==(n|0))break;else h=g}}b=f+b|0;a=a+20|0}while((a|0)!=(o|0))}else b=0}else b=0;q=~~(+(b>>>0)*1.2+10240.0)>>>0;k[da>>2]=0;W=da+4|0;k[W>>2]=0;k[da+8>>2]=0;if(q){if((q|0)<0)mg(da);f=og(q)|0;k[W>>2]=f;k[da>>2]=f;k[da+8>>2]=f+q;a=q;do{i[f>>0]=0;f=(k[W>>2]|0)+1|0;k[W>>2]=f;a=a+-1|0}while((a|0)!=0)}k[ca>>2]=0;V=ca+4|0;k[V>>2]=0;k[ca+8>>2]=0;if(b){if((b|0)<0)mg(ca);f=og(b)|0;k[V>>2]=f;k[ca>>2]=f;k[ca+8>>2]=f+b;a=b;do{i[f>>0]=0;f=(k[V>>2]|0)+1|0;k[V>>2]=f;a=a+-1|0}while((a|0)!=0)}a=k[R>>2]|0;p=k[ea>>2]|0;if((a|0)!=(p|0)){f=0;do{g=k[a+8>>2]|0;o=a+12|0;if((g|0)!=(o|0))do{h=g+20|0;n=wc(a,k[h>>2]^-2139062144)|0;if(!(Cc(h)|0)?(k[h>>2]&-2139062144|0)==0:0){T=(n|0)==0?h:n;U=k[T+12>>2]|0;ki((k[ca>>2]|0)+f|0,k[T+16>>2]|0,U|0)|0;f=U+f|0}h=k[g+4>>2]|0;if(!h)while(1){h=k[g+8>>2]|0;if((k[h>>2]|0)==(g|0)){g=h;break}else g=h}else{g=h;while(1){h=k[g>>2]|0;if(!h)break;else g=h}}}while((g|0)!=(o|0));a=a+20|0}while((a|0)!=(p|0))}T=k[ca>>2]|0;U=k[da>>2]|0;k[J>>2]=q;k[I>>2]=1;k[I+4>>2]=11;k[I+8>>2]=22;k[I+12>>2]=0;i[I+16>>0]=1;i[I+17>>0]=0;i[I+18>>0]=0;i[I+19>>0]=1;k[X>>2]=k[I>>2];k[X+4>>2]=k[I+4>>2];k[X+8>>2]=k[I+8>>2];k[X+12>>2]=k[I+12>>2];k[X+16>>2]=k[I+16>>2];if(hf(X,b,T,J,U)|0){K=k[J>>2]|0;a=i[e>>0]|0;L=e+4|0;b=k[L>>2]|0;g=~~(+(((a&1)==0?(a&255)>>>1:b)>>>0)*1.2+10240.0)>>>0;k[ba>>2]=0;U=ba+4|0;k[U>>2]=0;k[ba+8>>2]=0;if(g){if((g|0)<0)mg(ba);b=og(g)|0;k[U>>2]=b;k[ba>>2]=b;k[ba+8>>2]=b+g;a=g;do{i[b>>0]=0;b=(k[U>>2]|0)+1|0;k[U>>2]=b;a=a+-1|0}while((a|0)!=0);a=i[e>>0]|0;b=k[L>>2]|0}f=(a&1)==0;a=f?(a&255)>>>1:b;do if(a){S=f?e+1|0:k[e+8>>2]|0;T=k[ba>>2]|0;k[J>>2]=g;k[I>>2]=0;k[I+4>>2]=11;k[I+8>>2]=22;k[I+12>>2]=0;i[I+16>>0]=1;i[I+17>>0]=0;i[I+18>>0]=0;i[I+19>>0]=1;k[X>>2]=k[I>>2];k[X+4>>2]=k[I+4>>2];k[X+8>>2]=k[I+8>>2];k[X+12>>2]=k[I+12>>2];k[X+16>>2]=k[I+16>>2];if(!(hf(X,a,S,J,T)|0)){Dh(72222,41,1,k[1343]|0)|0;g=0;break}else{Q=k[J>>2]|0;H=55;break}}else{Q=0;H=55}while(0);if((H|0)==55){k[aa>>2]=0;T=aa+4|0;k[T>>2]=0;k[aa+8>>2]=0;O=$+4|0;k[O>>2]=0;P=$+8|0;k[P>>2]=0;S=$+4|0;k[$>>2]=S;a=k[R>>2]|0;w=k[ea>>2]|0;x=S;do if((a|0)!=(w|0)){E=F+4|0;y=G+4|0;z=G+12|0;A=G+16|0;B=G+24|0;C=G+28|0;D=aa+8|0;a:while(1){xc(F,a);b=k[F>>2]|0;u=k[E>>2]|0;if((b|0)!=(u|0)){v=a+12|0;do{h=k[b>>2]|0;f=k[v>>2]|0;if(!f){H=67;break a}while(1){g=k[f+16>>2]|0;if(h>>>0>>0){f=k[f>>2]|0;if(!f){H=67;break a}}else{if(g>>>0>=h>>>0)break;f=k[f+4>>2]|0;if(!f){H=67;break a}}}if(!f){H=67;break a}t=f+20|0;do if(!(Cc(t)|0)){s=f+28|0;g=k[S>>2]|0;p=(g|0)==0;do if(!p){o=k[s>>2]|0;h=S;n=g;b:do{while(1){if((k[n+16>>2]|0)>>>0>=o>>>0){h=n;break}n=k[n+4>>2]|0;if(!n)break b}n=k[h>>2]|0}while((n|0)!=0);if((h|0)==(S|0))break;if(o>>>0>=(k[h+16>>2]|0)>>>0){H=100;break a}}while(0);q=((k[T>>2]|0)-(k[aa>>2]|0)|0)>>>5;do if(!p){o=k[s>>2]|0;while(1){h=k[g+16>>2]|0;if(o>>>0>>0){h=k[g>>2]|0;if(!h){h=g;H=81;break}else g=h}else{if(h>>>0>=o>>>0){H=87;break}h=g+4|0;n=k[h>>2]|0;if(!n){H=85;break}else g=n}}if((H|0)==81){k[X>>2]=g;H=88;break}else if((H|0)==85){k[X>>2]=g;H=88;break}else if((H|0)==87){H=0;k[X>>2]=g;if(!g){h=X;H=88;break}else break}}else{k[X>>2]=S;h=S;g=x;H=88}while(0);if((H|0)==88){n=og(24)|0;k[n+16>>2]=k[s>>2];j[n+20>>1]=0;k[n>>2]=0;k[n+4>>2]=0;k[n+8>>2]=g;k[h>>2]=n;g=k[k[$>>2]>>2]|0;if(!g)g=n;else{k[$>>2]=g;g=k[h>>2]|0}Hc(k[O>>2]|0,g);k[P>>2]=(k[P>>2]|0)+1;g=n}j[g+20>>1]=q;H=k[t>>2]|0;k[G>>2]=H;k[y>>2]=0;f=k[f+32>>2]|0;k[z>>2]=f;k[A>>2]=f;f=wc(a,H^-2139062144)|0;if(!f)g=16;else{k[y>>2]=32;k[A>>2]=k[f+12>>2];g=48}f=k[T>>2]|0;if((k[aa>>2]|0)==(f|0)){k[B>>2]=K;k[C>>2]=k[da>>2]}else{k[B>>2]=0;k[C>>2]=0;k[y>>2]=g}if((f|0)==(k[D>>2]|0)){gd(aa,G);break}else{k[f>>2]=k[G>>2];k[f+4>>2]=k[G+4>>2];k[f+8>>2]=k[G+8>>2];k[f+12>>2]=k[G+12>>2];k[f+16>>2]=k[G+16>>2];k[f+20>>2]=k[G+20>>2];k[f+24>>2]=k[G+24>>2];k[f+28>>2]=k[G+28>>2];k[T>>2]=f+32;break}}while(0);b=b+4|0}while((b|0)!=(u|0));b=k[F>>2]|0}f=b;if(b){g=k[E>>2]|0;if((g|0)!=(b|0))k[E>>2]=g+(~((g+-4-f|0)>>>2)<<2);rg(b)}a=a+20|0;if((a|0)==(w|0)){H=110;break}}if((H|0)==67){ha=Va(8)|0;Xh(ha,72264);k[ha>>2]=5156;xb(ha|0,488,7)}else if((H|0)==100){a=k[F>>2]|0;if(!a){g=0;break}b=k[E>>2]|0;if((b|0)!=(a|0))k[E>>2]=b+(~((b+-4-a|0)>>>2)<<2);rg(a);g=0;break}else if((H|0)==110){x=S;a=k[$>>2]|0;H=111;break}}else{x=S;a=S;H=111}while(0);c:do if((H|0)==111){u=M+4|0;k[u>>2]=0;v=M+8|0;k[v>>2]=0;w=M+4|0;k[M>>2]=w;if((a|0)!=(x|0)){h=w;f=a;b=a;while(1){a=og(24)|0;g=a+16|0;G=f+16|0;H=k[G+4>>2]|0;f=g;k[f>>2]=k[G>>2];k[f+4>>2]=H;k[I>>2]=h;k[X>>2]=k[I>>2];g=hd(M,X,J,g)|0;f=k[g>>2]|0;if(f){if((f|0)!=(a|0))rg(a)}else{f=k[J>>2]|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=f;k[g>>2]=a;f=k[k[M>>2]>>2]|0;if(f){k[M>>2]=f;a=k[g>>2]|0}Hc(k[u>>2]|0,a);k[v>>2]=(k[v>>2]|0)+1}a=k[b+4>>2]|0;if(!a)while(1){a=k[b+8>>2]|0;if((k[a>>2]|0)==(b|0))break;else b=a}else while(1){b=k[a>>2]|0;if(!b)break;else a=b}if((a|0)==(S|0))break;else{f=a;b=a}}}a=k[aa>>2]|0;h=k[T>>2]|0;if((a|0)==(h|0))a=48;else{g=a;a=48;do{f=k[g>>2]|0;b=0;while(1){if((k[728+(b<<2)>>2]|0)==(f|0))break;b=b+1|0;if((b|0)>=63){b=63;break}}J=$c(k[g+12>>2]|0)|0;b=((b&63|0)!=63?1:5)+J|0;if(k[g+4>>2]&32)b=($c(k[g+16>>2]|0)|0)+b|0;a=b+a|0;g=g+32|0}while((g|0)!=(h|0))}b=((k[ea>>2]|0)-(k[R>>2]|0)|0)/20|0;if(b>>>0>1){a=a+4+(Yc(b&65535)|0)|0;s=k[ea>>2]|0;b=k[R>>2]|0;a=a+(((s-b|0)/20|0)<<2)|0;if((b|0)!=(s|0)){t=w;do{a=(Yc(k[b+16>>2]&65535)|0)+a|0;f=k[b+8>>2]|0;q=b+12|0;if((f|0)!=(q|0)){g=f;while(1){if(!(k[g+20>>2]&-2139062144)){p=g+28|0;f=k[w>>2]|0;do if(f){o=k[p>>2]|0;while(1){h=k[f+16>>2]|0;if(o>>>0>>0){h=k[f>>2]|0;if(!h){h=f;H=140;break}else f=h}else{if(h>>>0>=o>>>0){H=146;break}h=f+4|0;n=k[h>>2]|0;if(!n){H=144;break}else f=n}}if((H|0)==140){k[X>>2]=f;H=147;break}else if((H|0)==144){k[X>>2]=f;H=147;break}else if((H|0)==146){H=0;k[X>>2]=f;if(!f){h=X;H=147;break}else break}}else{k[X>>2]=w;h=w;f=t;H=147}while(0);if((H|0)==147){n=og(24)|0;k[n+16>>2]=k[p>>2];j[n+20>>1]=0;k[n>>2]=0;k[n+4>>2]=0;k[n+8>>2]=f;k[h>>2]=n;f=k[k[M>>2]>>2]|0;if(!f)f=n;else{k[M>>2]=f;f=k[h>>2]|0}Hc(k[u>>2]|0,f);k[v>>2]=(k[v>>2]|0)+1;f=n}a=(Yc(j[f+20>>1]|0)|0)+a|0}f=k[g+4>>2]|0;if(!f)while(1){f=k[g+8>>2]|0;if((k[f>>2]|0)==(g|0))break;else g=f}else while(1){g=k[f>>2]|0;if(!g)break;else f=g}if((f|0)==(q|0))break;else g=f}}b=b+20|0}while((b|0)!=(s|0))}}b=k[aa>>2]|0;f=k[T>>2]|0;if((b|0)==(f|0))q=a;else{do{a=(k[b+24>>2]|0)+a|0;a=a>>>0>4294967292?a:a+3&-4;b=b+32|0}while((b|0)!=(f|0));q=a}f=q+Q|0;id(M,k[w>>2]|0);a=k[d>>2]|0;if(f>>>0>a>>>0){g=k[1343]|0;k[N>>2]=a;k[N+4>>2]=f;Eh(g,72288,N)|0;g=0;break}k[d>>2]=f;p=k[R>>2]|0;i[c>>0]=119;i[c+1>>0]=79;i[c+2>>0]=70;k[Z>>2]=4;i[c+3>>0]=50;a=(k[ea>>2]|0)-p|0;b=(a|0)==20;if(b){N=k[p>>2]|0;i[c+4>>0]=N>>>24;i[c+5>>0]=N>>>16;i[c+6>>0]=N>>>8;k[Z>>2]=8;i[c+7>>0]=N}else{i[c+4>>0]=116;i[c+5>>0]=116;i[c+6>>0]=99;k[Z>>2]=8;i[c+7>>0]=102}i[c+8>>0]=f>>>24;i[c+9>>0]=f>>>16;i[c+10>>0]=f>>>8;i[c+11>>0]=f;N=(k[T>>2]|0)-(k[aa>>2]|0)>>5;i[c+12>>0]=N>>>8;i[c+13>>0]=N;i[c+14>>0]=0;k[Z>>2]=16;i[c+15>>0]=0;do if(b){a=(m[p+4>>1]|0)<<4|12;b=k[p+8>>2]|0;g=p+12|0;if((b|0)==(g|0))break;f=b;while(1){b=f+20|0;do if(!(k[b>>2]&-2139062144)){if(Cc(b)|0)break;N=k[f+32>>2]|0;a=(N>>>0>4294967292?N:N+3&-4)+a|0}while(0);b=k[f+4>>2]|0;if(!b)while(1){b=k[f+8>>2]|0;if((k[b>>2]|0)==(f|0))break;else f=b}else while(1){f=k[b>>2]|0;if(!f)break;else b=f}if((b|0)==(g|0))break;else f=b}}else{a=cd(k[ga>>2]|0,(a|0)/20|0)|0;b=k[R>>2]|0;o=k[ea>>2]|0;if((b|0)==(o|0))break;do{f=(m[b+4>>1]|0)<<4|12;g=k[b+8>>2]|0;n=b+12|0;if((g|0)!=(n|0)){h=g;while(1){g=h+20|0;do if(!(k[g>>2]&-2139062144)){if(Cc(g)|0)break;N=k[h+32>>2]|0;f=(N>>>0>4294967292?N:N+3&-4)+f|0}while(0);g=k[h+4>>2]|0;if(!g)while(1){g=k[h+8>>2]|0;if((k[g>>2]|0)==(h|0))break;else h=g}else while(1){h=k[g>>2]|0;if(!h)break;else g=h}if((g|0)==(n|0))break;else h=g}}a=f+a|0;b=b+20|0}while((b|0)!=(o|0))}while(0);N=k[Z>>2]|0;i[c+N>>0]=a>>>24;i[c+(N+1)>>0]=a>>>16;i[c+(N+2)>>0]=a>>>8;i[c+(N+3)>>0]=a;i[c+(N+4)>>0]=K>>>24;i[c+(N+5)>>0]=K>>>16;i[c+(N+6)>>0]=K>>>8;k[Z>>2]=N+8;i[c+(N+7)>>0]=K;N=(wc(p,1751474532)|0)+16|0;N=(k[N>>2]|0)+4|0;a=k[Z>>2]|0;b=c+a|0;N=l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24;i[b>>0]=N;i[b+1>>0]=N>>8;i[b+2>>0]=N>>16;i[b+3>>0]=N>>24;b=a+4|0;k[Z>>2]=b;if(!Q){i[c+b>>0]=0;i[c+(a+5)>>0]=0;i[c+(a+6)>>0]=0;i[c+(a+7)>>0]=0;i[c+(a+8)>>0]=0;i[c+(a+9)>>0]=0;i[c+(a+10)>>0]=0;i[c+(a+11)>>0]=0;i[c+(a+12)>>0]=0;i[c+(a+13)>>0]=0;i[c+(a+14)>>0]=0;e=a+16|0;k[Z>>2]=e;i[c+(a+15)>>0]=0;a=e}else{i[c+b>>0]=q>>>24;i[c+(a+5)>>0]=q>>>16;i[c+(a+6)>>0]=q>>>8;i[c+(a+7)>>0]=q;i[c+(a+8)>>0]=Q>>>24;i[c+(a+9)>>0]=Q>>>16;i[c+(a+10)>>0]=Q>>>8;i[c+(a+11)>>0]=Q;N=i[e>>0]|0;N=(N&1)==0?(N&255)>>>1:k[L>>2]|0;i[c+(a+12)>>0]=N>>>24;i[c+(a+13)>>0]=N>>>16;i[c+(a+14)>>0]=N>>>8;e=a+16|0;k[Z>>2]=e;i[c+(a+15)>>0]=N;a=e}i[c+a>>0]=0;i[c+(a+1)>>0]=0;i[c+(a+2)>>0]=0;i[c+(a+3)>>0]=0;i[c+(a+4)>>0]=0;i[c+(a+5)>>0]=0;i[c+(a+6)>>0]=0;k[Z>>2]=a+8;i[c+(a+7)>>0]=0;a=k[aa>>2]|0;h=k[T>>2]|0;if((a|0)!=(h|0))do{b=k[a>>2]|0;f=0;while(1){if((k[728+(f<<2)>>2]|0)==(b|0))break;f=f+1|0;if((f|0)>=63){f=63;break}}b=k[Z>>2]|0;g=b+1|0;k[Z>>2]=g;i[c+b>>0]=f;if((f&63|0)==63){e=k[a>>2]|0;i[c+g>>0]=e>>>24;i[c+(b+2)>>0]=e>>>16;i[c+(b+3)>>0]=e>>>8;k[Z>>2]=b+5;i[c+(b+4)>>0]=e}ad(k[a+12>>2]|0,Z,c);if(k[a+4>>2]&32)ad(k[a+16>>2]|0,Z,c);a=a+32|0}while((a|0)!=(h|0));a=((k[ea>>2]|0)-(k[R>>2]|0)|0)/20|0;d:do if(a>>>0>1){e=k[ga>>2]|0;p=k[Z>>2]|0;i[c+p>>0]=e>>>24;i[c+(p+1)>>0]=e>>>16;i[c+(p+2)>>0]=e>>>8;k[Z>>2]=p+4;i[c+(p+3)>>0]=e;_c(a,Z,c);a=k[R>>2]|0;p=k[ea>>2]|0;if((a|0)==(p|0))break;n=a;e:while(1){g=n+8|0;a=k[g>>2]|0;o=n+12|0;if((a|0)==(o|0))a=0;else{b=0;do{b=((k[a+20>>2]&-2139062144|0)==0&1)+b<<16>>16;f=k[a+4>>2]|0;if(!f)while(1){f=k[a+8>>2]|0;if((k[f>>2]|0)==(a|0)){a=f;break}else a=f}else{a=f;while(1){f=k[a>>2]|0;if(!f)break;else a=f}}}while((a|0)!=(o|0));a=b}_c(a&65535,Z,c);R=k[n>>2]|0;a=k[Z>>2]|0;i[c+a>>0]=R>>>24;i[c+(a+1)>>0]=R>>>16;i[c+(a+2)>>0]=R>>>8;k[Z>>2]=a+4;i[c+(a+3)>>0]=R;a=k[g>>2]|0;if((a|0)!=(o|0)){b=a;while(1){a=b+20|0;if(!(k[a>>2]&-2139062144)){a=Cc(a)|0;a=k[(a?(k[b+52>>2]|0)+8|0:b+28|0)>>2]|0;h=k[S>>2]|0;if(!h)break e;else{f=x;g=h}f:do{while(1){if((k[g+16>>2]|0)>>>0>=a>>>0){f=g;break}g=k[g+4>>2]|0;if(!g)break f}g=k[f>>2]|0}while((g|0)!=0);if((f|0)==(x|0))break e;if(a>>>0<(k[f+16>>2]|0)>>>0)break e;while(1){f=k[h+16>>2]|0;if(a>>>0>>0){f=k[h>>2]|0;if(!f){g=h;f=h;H=223;break}}else{if(f>>>0>=a>>>0){f=h;H=228;break}g=h+4|0;f=k[g>>2]|0;if(!f){f=h;H=227;break}}h=f}if((H|0)==223){k[X>>2]=f;H=229}else if((H|0)==227){k[X>>2]=f;H=229}else if((H|0)==228){H=0;k[X>>2]=f;if(!f){g=X;H=229}else a=f}if((H|0)==229){h=og(24)|0;k[h+16>>2]=a;j[h+20>>1]=0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=f;k[g>>2]=h;a=k[k[$>>2]>>2]|0;if(!a)a=h;else{k[$>>2]=a;a=k[g>>2]|0}Hc(k[O>>2]|0,a);k[P>>2]=(k[P>>2]|0)+1;a=h}_c(m[a+20>>1]|0,Z,c)}a=k[b+4>>2]|0;if(!a)while(1){a=k[b+8>>2]|0;if((k[a>>2]|0)==(b|0))break;else b=a}else while(1){b=k[a>>2]|0;if(!b)break;else a=b}if((a|0)==(o|0))break;else b=a}}n=n+20|0;if((n|0)==(p|0))break d}g=k[1343]|0;k[Y>>2]=a;Eh(g,72341,Y)|0;g=0;break c}while(0);a=k[aa>>2]|0;f=k[T>>2]|0;if((a|0)==(f|0))a=k[Z>>2]|0;else{b=a;do{a=k[b+24>>2]|0;Y=k[Z>>2]|0;ki(c+Y|0,k[b+28>>2]|0,a|0)|0;a=Y+a|0;a=a>>>0>4294967292?a:a+3&-4;k[Z>>2]=a;b=b+32|0}while((b|0)!=(f|0))}ki(c+a|0,k[ba>>2]|0,Q|0)|0;b=a+Q|0;k[Z>>2]=b;a=k[d>>2]|0;if((a|0)==(b|0)){g=1;break}g=k[1343]|0;k[_>>2]=a;k[_+4>>2]=b;Eh(g,72380,_)|0;g=0}while(0);id($,k[S>>2]|0);a=k[aa>>2]|0;b=a;if(a){f=k[T>>2]|0;if((f|0)!=(a|0))k[T>>2]=f+(~((f+-32-b|0)>>>5)<<5);rg(a)}}a=k[ba>>2]|0;if(a){if((k[U>>2]|0)!=(a|0))k[U>>2]=a;rg(a)}}else{Dh(72183,38,1,k[1343]|0)|0;g=0}a=k[ca>>2]|0;if(a){if((k[V>>2]|0)!=(a|0))k[V>>2]=a;rg(a)}a=k[da>>2]|0;if(a){if((k[W>>2]|0)!=(a|0))k[W>>2]=a;rg(a)}}else g=0;else{Dh(72119,34,1,k[1343]|0)|0;g=0}while(0);f=ga+16|0;a=k[f>>2]|0;if(!a){ea=ga+4|0;ga=k[fa>>2]|0;Mc(ea,ga);r=ha;return g|0}b=k[ea>>2]|0;if((b|0)!=(a|0)){do{k[ea>>2]=b+-20;Lc(b+-12|0,k[b+-8>>2]|0);b=k[ea>>2]|0}while((b|0)!=(a|0));a=k[f>>2]|0}rg(a);ea=ga+4|0;ga=k[fa>>2]|0;Mc(ea,ga);r=ha;return g|0}function gd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0;h=a+4|0;i=k[a>>2]|0;j=i;d=((k[h>>2]|0)-j>>5)+1|0;if(d>>>0>134217727)mg(a);l=a+8|0;e=i;c=(k[l>>2]|0)-e|0;if(c>>5>>>0<67108863){c=c>>4;c=c>>>0>>0?d:c;e=(k[h>>2]|0)-e|0;d=e>>5;if(!c){g=0;f=0;c=e}else m=6}else{e=(k[h>>2]|0)-e|0;c=134217727;d=e>>5;m=6}if((m|0)==6){g=c;f=og(c<<5)|0;c=e}m=f+(d<<5)|0;k[m>>2]=k[b>>2];k[m+4>>2]=k[b+4>>2];k[m+8>>2]=k[b+8>>2];k[m+12>>2]=k[b+12>>2];k[m+16>>2]=k[b+16>>2];k[m+20>>2]=k[b+20>>2];k[m+24>>2]=k[b+24>>2];k[m+28>>2]=k[b+28>>2];ki(f|0,i|0,c|0)|0;k[a>>2]=f;k[h>>2]=f+(d+1<<5);k[l>>2]=f+(g<<5);if(!j)return;rg(j);return}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;h=a+4|0;g=k[b>>2]|0;b=g;if((g|0)!=(h|0)?(f=k[d>>2]|0,e=k[g+16>>2]|0,f>>>0>=e>>>0):0){if(e>>>0>=f>>>0){k[c>>2]=b;return c|0}a=g+4|0;b=k[a>>2]|0;d=(b|0)==0;if(d){e=g;while(1){b=k[e+8>>2]|0;if((k[b>>2]|0)==(e|0))break;else e=b}}else while(1){e=k[b>>2]|0;if(!e)break;else b=e}if((b|0)!=(h|0)?f>>>0>=(k[b+16>>2]|0)>>>0:0){b=k[h>>2]|0;if(!b){k[c>>2]=h;c=h;return c|0}else a=b;while(1){b=k[a+16>>2]|0;if(f>>>0>>0){b=k[a>>2]|0;if(!b){e=a;b=a;f=33;break}}else{if(b>>>0>=f>>>0){b=a;f=38;break}e=a+4|0;b=k[e>>2]|0;if(!b){b=a;f=37;break}}a=b}if((f|0)==33){k[c>>2]=b;c=e;return c|0}else if((f|0)==37){k[c>>2]=b;c=e;return c|0}else if((f|0)==38){k[c>>2]=b;return c|0}}if(d){k[c>>2]=g;c=a;return c|0}else{k[c>>2]=b;c=b;return c|0}}if((g|0)!=(k[a>>2]|0)){b=k[g>>2]|0;if(!b){e=g;while(1){b=k[e+8>>2]|0;if((k[b>>2]|0)==(e|0))e=b;else break}}else while(1){e=k[b+4>>2]|0;if(!e)break;else b=e}d=k[d>>2]|0;if((k[b+16>>2]|0)>>>0>=d>>>0){b=k[h>>2]|0;if(!b){k[c>>2]=h;c=h;return c|0}else a=b;while(1){b=k[a+16>>2]|0;if(d>>>0>>0){b=k[a>>2]|0;if(!b){e=a;b=a;f=14;break}}else{if(b>>>0>=d>>>0){b=a;f=19;break}e=a+4|0;b=k[e>>2]|0;if(!b){b=a;f=18;break}}a=b}if((f|0)==14){k[c>>2]=b;c=e;return c|0}else if((f|0)==18){k[c>>2]=b;c=e;return c|0}else if((f|0)==19){k[c>>2]=b;return c|0}}}if(!(k[g>>2]|0)){k[c>>2]=g;c=g;return c|0}else{h=b;k[c>>2]=h;c=h+4|0;return c|0}return 0}function id(a,b){a=a|0;b=b|0;if(!b)return;else{id(a,k[b>>2]|0);id(a,k[b+4>>2]|0);rg(b);return}}function jd(a,b,c,d,e,f,g,h,i,j,l,m,n,o,p){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;j=j|0;l=l|0;m=m|0;n=n|0;o=o|0;p=p|0;do switch(l|0){case 1:{kd(a,b,c,d,e,f,g,h,i,k[j>>2]|0,m,n,o,p);return}case 2:{ld(a,b,c,d,e,f,g,h,i,k[j+4>>2]|0,m,n,o,p);return}case 3:{md(a,b,c,d,e,f,g,h,i,k[j+8>>2]|0,m,n,o,p);return}case 4:{nd(a,b,c,d,e,f,g,h,i,k[j+12>>2]|0,m,n,o,p);return}case 5:{od(a,b,c,d,e,f,g,h,i,k[j+16>>2]|0,m,n,o,p);return}case 6:{pd(a,b,c,d,e,f,g,h,i,k[j+20>>2]|0,m,n,o,p);return}case 7:{qd(a,b,c,d,e,f,g,h,i,k[j+24>>2]|0,m,n,o,p);return}case 8:{rd(a,b,c,d,e,f,g,h,i,k[j+28>>2]|0,m,n,o,p);return}case 9:{sd(a,b,c,d,e,f,g,h,i,k[j+32>>2]|0,m,n,o,p);return}default:return}while(0)}function kd(a,b,c,d,e,f,g,h,i,j,m,n,o,q){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;j=j|0;m=m|0;n=n|0;o=o|0;q=q|0;var s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;W=r;r=r+80|0;P=W+68|0;R=W+64|0;N=W+60|0;T=W+40|0;Q=W+56|0;S=W+52|0;O=W+48|0;U=W+32|0;V=W;if(a>>>0>2&b>>>0>2){L=b+-3|0;M=c+(L&d)|0;M=j+((ha(l[M>>0]|l[M+1>>0]<<8|l[M+2>>0]<<16|l[M+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[M>>2]=L;M=b+-2|0;L=c+(M&d)|0;L=j+((ha(l[L>>0]|l[L+1>>0]<<8|l[L+2>>0]<<16|l[L+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[L>>2]=M;L=b+-1|0;M=c+(L&d)|0;M=j+((ha(l[M>>0]|l[M+1>>0]<<8|l[M+2>>0]<<16|l[M+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[M>>2]=L}s=k[n>>2]|0;t=d&b;D=b-t|0;E=t+a|0;F=(i|0)<9?64:512;if((t+3|0)>>>0>=E>>>0){d=o;c=a;g=s;c=g+c|0;k[n>>2]=c;n=o;n=d-n|0;n=n>>5;o=k[q>>2]|0;n=o+n|0;k[q>>2]=n;r=W;return}G=F<<2;H=E+-4|0;I=E+-3|0;J=(i|0)<4;K=m+4|0;L=m+8|0;M=m+12|0;C=(i|0)>1;i=o;B=F+t|0;a:while(1){v=B+G|0;while(1){b=t+D|0;k[P>>2]=0;k[R>>2]=0;k[N>>2]=0;p[T>>3]=h;if(Dd(j,c,d,e,f,5.4,m,b,a,b>>>0>g>>>0?g:b,P,R,N,T)|0){b=t;break}s=s+1|0;A=c+t|0;A=j+((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[A>>2]=b;b=t+1|0;do if(b>>>0>B>>>0)if(b>>>0>v>>>0){a=t+17|0;a=H>>>0>>0?H:a;if(b>>>0>=a>>>0)break;do{A=c+b|0;A=j+((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[A>>2]=b+D;s=s+4|0;b=b+4|0}while(b>>>0>>0)}else{a=t+9|0;a=I>>>0>>0?I:a;if(b>>>0>=a>>>0)break;do{A=c+b|0;A=j+((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[A>>2]=b+D;s=s+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=E-b|0;if((b+3|0)>>>0>>0)t=b;else{b=36;break a}}b:do if(J){t=0;do{a=a+-1|0;z=(k[P>>2]|0)+-1|0;k[Q>>2]=(a|0)<(z|0)?a:z;k[S>>2]=0;k[O>>2]=0;p[U>>3]=h;z=b+D|0;B=z+1|0;A=c+b|0;A=j+((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[A>>2]=z;if(!(Dd(j,c,d,e,f,5.4,m,B,a,B>>>0>g>>>0?g:B,Q,S,O,U)|0))break b;u=+p[U>>3];if(!(u>=+p[T>>3]+7.0))break b;b=b+1|0;s=s+1|0;k[P>>2]=k[Q>>2];k[R>>2]=k[S>>2];k[N>>2]=k[O>>2];p[T>>3]=u;t=t+1|0}while((t|0)<4)}else{t=0;do{a=a+-1|0;k[Q>>2]=0;k[S>>2]=0;k[O>>2]=0;p[U>>3]=h;z=b+D|0;B=z+1|0;A=c+b|0;A=j+((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[A>>2]=z;if(!(Dd(j,c,d,e,f,5.4,m,B,a,B>>>0>g>>>0?g:B,Q,S,O,U)|0))break b;u=+p[U>>3];if(!(u>=+p[T>>3]+7.0))break b;b=b+1|0;s=s+1|0;k[P>>2]=k[Q>>2];k[R>>2]=k[S>>2];k[N>>2]=k[O>>2];p[T>>3]=u;t=t+1|0}while((t|0)<4)}while(0);A=k[P>>2]|0;B=b+F+(A<<1)|0;z=b+D|0;w=k[N>>2]|0;a=w+16|0;do if(w>>>0<=(z>>>0>g>>>0?g:z)>>>0){x=k[m>>2]|0;if((w|0)==(x|0))a=1;else{y=k[K>>2]|0;t=k[L>>2]|0;if((w|0)!=(y|0))if((w|0)!=(t|0))if((w|0)!=(k[M>>2]|0)){c:do if(C&(w|0)>5){v=4;while(1){if((w|0)==((k[1044+(v<<2)>>2]|0)+(k[m+(k[980+(v<<2)>>2]<<2)>>2]|0)|0)?(w|0)>=(k[1812+(v<<2)>>2]|0):0){a=v;break}v=v+1|0;if((v|0)>=16)break c}a=a+1|0}while(0);if((a|0)<=1)break}else a=4;else{t=w;a=3}else a=2;k[M>>2]=t;k[L>>2]=y;k[K>>2]=x;k[m>>2]=w}}while(0);ud(V,s,A,k[R>>2]|0,a);v=i+32|0;k[i>>2]=k[V>>2];k[i+4>>2]=k[V+4>>2];k[i+8>>2]=k[V+8>>2];k[i+12>>2]=k[V+12>>2];k[i+16>>2]=k[V+16>>2];k[i+20>>2]=k[V+20>>2];k[i+24>>2]=k[V+24>>2];if((A|0)>1){s=1;do{y=c+(s+b)|0;y=j+((ha(l[y>>0]|l[y+1>>0]<<8|l[y+2>>0]<<16|l[y+3>>0]<<24,506832829)|0)>>>16<<2)|0;k[y>>2]=s+z;s=s+1|0}while((s|0)<(A|0))}t=A+b|0;a=E-t|0;if((t+3|0)>>>0>=E>>>0){i=v;s=0;b=36;break}else{i=v;s=0}}if((b|0)==36){d=s+a|0;k[n>>2]=d;d=i;n=o;n=d-n|0;n=n>>5;o=k[q>>2]|0;n=o+n|0;k[q>>2]=n;r=W;return}}function ld(a,b,c,d,e,f,g,h,i,j,m,n,o,q){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;j=j|0;m=m|0;n=n|0;o=o|0;q=q|0;var s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;W=r;r=r+80|0;P=W+68|0;R=W+64|0;N=W+60|0;T=W+40|0;Q=W+56|0;S=W+52|0;O=W+48|0;U=W+32|0;V=W;if(a>>>0>2&b>>>0>2){L=b+-3|0;M=c+(L&d)|0;M=j+(((ha(l[M>>0]|l[M+1>>0]<<8|l[M+2>>0]<<16|l[M+3>>0]<<24,506832829)|0)>>>15)+(L>>>3&3)<<2)|0;k[M>>2]=L;M=b+-2|0;L=c+(M&d)|0;L=j+(((ha(l[L>>0]|l[L+1>>0]<<8|l[L+2>>0]<<16|l[L+3>>0]<<24,506832829)|0)>>>15)+(M>>>3&3)<<2)|0;k[L>>2]=M;L=b+-1|0;M=c+(L&d)|0;M=j+(((ha(l[M>>0]|l[M+1>>0]<<8|l[M+2>>0]<<16|l[M+3>>0]<<24,506832829)|0)>>>15)+(L>>>3&3)<<2)|0;k[M>>2]=L}s=k[n>>2]|0;t=d&b;D=b-t|0;E=t+a|0;F=(i|0)<9?64:512;if((t+3|0)>>>0>=E>>>0){d=o;c=a;g=s;c=g+c|0;k[n>>2]=c;n=o;n=d-n|0;n=n>>5;o=k[q>>2]|0;n=o+n|0;k[q>>2]=n;r=W;return}G=F<<2;H=E+-4|0;I=E+-3|0;J=(i|0)<4;K=m+4|0;L=m+8|0;M=m+12|0;C=(i|0)>1;i=o;B=F+t|0;a:while(1){v=B+G|0;while(1){b=t+D|0;k[P>>2]=0;k[R>>2]=0;k[N>>2]=0;p[T>>3]=h;if(Cd(j,c,d,e,f,5.4,m,b,a,b>>>0>g>>>0?g:b,P,R,N,T)|0){v=0;break}s=s+1|0;A=c+t|0;A=j+(((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>15)+(b>>>3&3)<<2)|0;k[A>>2]=b;b=t+1|0;do if(b>>>0>B>>>0)if(b>>>0>v>>>0){a=t+17|0;a=H>>>0>>0?H:a;if(b>>>0>=a>>>0)break;do{A=c+b|0;z=b+D|0;A=j+(((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>15)+(z>>>3&3)<<2)|0;k[A>>2]=z;s=s+4|0;b=b+4|0}while(b>>>0>>0)}else{a=t+9|0;a=I>>>0>>0?I:a;if(b>>>0>=a>>>0)break;do{A=c+b|0;z=b+D|0;A=j+(((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>15)+(z>>>3&3)<<2)|0;k[A>>2]=z;s=s+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=E-b|0;if((b+3|0)>>>0>>0)t=b;else{b=34;break a}}while(1){a=a+-1|0;if(J){b=(k[P>>2]|0)+-1|0;b=(a|0)<(b|0)?a:b}else b=0;k[Q>>2]=b;k[S>>2]=0;k[O>>2]=0;p[U>>3]=h;z=t+D|0;B=z+1|0;A=c+t|0;A=j+(((ha(l[A>>0]|l[A+1>>0]<<8|l[A+2>>0]<<16|l[A+3>>0]<<24,506832829)|0)>>>15)+(z>>>3&3)<<2)|0;k[A>>2]=z;if(!(Cd(j,c,d,e,f,5.4,m,B,a,B>>>0>g>>>0?g:B,Q,S,O,U)|0)){b=t;break}u=+p[U>>3];if(!(u>=+p[T>>3]+7.0)){b=t;break}b=t+1|0;s=s+1|0;k[P>>2]=k[Q>>2];k[R>>2]=k[S>>2];k[N>>2]=k[O>>2];p[T>>3]=u;v=v+1|0;if((v|0)>=4)break;else t=b}z=k[P>>2]|0;B=b+F+(z<<1)|0;A=b+D|0;w=k[N>>2]|0;a=w+16|0;do if(w>>>0<=(A>>>0>g>>>0?g:A)>>>0){x=k[m>>2]|0;if((w|0)==(x|0))a=1;else{y=k[K>>2]|0;t=k[L>>2]|0;if((w|0)!=(y|0))if((w|0)!=(t|0))if((w|0)!=(k[M>>2]|0)){b:do if(C&(w|0)>5){v=4;while(1){if((w|0)==((k[1044+(v<<2)>>2]|0)+(k[m+(k[980+(v<<2)>>2]<<2)>>2]|0)|0)?(w|0)>=(k[1748+(v<<2)>>2]|0):0){a=v;break}v=v+1|0;if((v|0)>=16)break b}a=a+1|0}while(0);if((a|0)<=1)break}else a=4;else{t=w;a=3}else a=2;k[M>>2]=t;k[L>>2]=y;k[K>>2]=x;k[m>>2]=w}}while(0);ud(V,s,z,k[R>>2]|0,a);v=i+32|0;k[i>>2]=k[V>>2];k[i+4>>2]=k[V+4>>2];k[i+8>>2]=k[V+8>>2];k[i+12>>2]=k[V+12>>2];k[i+16>>2]=k[V+16>>2];k[i+20>>2]=k[V+20>>2];k[i+24>>2]=k[V+24>>2];if((z|0)>1){s=1;do{y=c+(s+b)|0;x=s+A|0;y=j+(((ha(l[y>>0]|l[y+1>>0]<<8|l[y+2>>0]<<16|l[y+3>>0]<<24,506832829)|0)>>>15)+(x>>>3&3)<<2)|0;k[y>>2]=x;s=s+1|0}while((s|0)<(z|0))}t=z+b|0;a=E-t|0;if((t+3|0)>>>0>=E>>>0){i=v;s=0;b=34;break}else{i=v;s=0}}if((b|0)==34){d=s+a|0;k[n>>2]=d;d=i;n=o;n=d-n|0;n=n>>5;o=k[q>>2]|0;n=o+n|0;k[q>>2]=n;r=W;return}}function md(a,b,c,d,e,f,g,h,i,m,n,o,q,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;m=m|0;n=n|0;o=o|0;q=q|0;s=s|0;var t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;X=r;r=r+80|0;Q=X+68|0;S=X+64|0;O=X+60|0;U=X+40|0;R=X+56|0;T=X+52|0;P=X+48|0;V=X+32|0;W=X;if(a>>>0>2&b>>>0>2){L=b+-3|0;K=c+(L&d)|0;K=(ha(l[K>>0]|l[K+1>>0]<<8|l[K+2>>0]<<16|l[K+3>>0]<<24,506832829)|0)>>>18;M=m+(K<<1)|0;N=j[M>>1]|0;k[m+32768+(K<<6)+((N&15)<<2)>>2]=L;j[M>>1]=N+1<<16>>16;M=b+-2|0;N=c+(M&d)|0;N=(ha(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24,506832829)|0)>>>18;K=m+(N<<1)|0;L=j[K>>1]|0;k[m+32768+(N<<6)+((L&15)<<2)>>2]=M;j[K>>1]=L+1<<16>>16;K=b+-1|0;L=c+(K&d)|0;L=(ha(l[L>>0]|l[L+1>>0]<<8|l[L+2>>0]<<16|l[L+3>>0]<<24,506832829)|0)>>>18;N=m+(L<<1)|0;M=j[N>>1]|0;k[m+32768+(L<<6)+((M&15)<<2)>>2]=K;j[N>>1]=M+1<<16>>16}t=k[o>>2]|0;u=d&b;E=b-u|0;F=u+a|0;G=(i|0)<9?64:512;if((u+3|0)>>>0>=F>>>0){d=q;c=a;g=t;c=g+c|0;k[o>>2]=c;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}H=G<<2;I=F+-4|0;J=F+-3|0;K=(i|0)<4;L=n+4|0;M=n+8|0;N=n+12|0;D=(i|0)>1;i=q;C=G+u|0;a:while(1){w=C+H|0;while(1){b=u+E|0;k[Q>>2]=0;k[S>>2]=0;k[O>>2]=0;p[U>>3]=h;if(Bd(m,c,d,e,f,5.4,n,b,a,b>>>0>g>>>0?g:b,Q,S,O,U)|0){w=0;break}t=t+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>18;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+32768+(z<<6)+((A&15)<<2)>>2]=b;j[B>>1]=A+1<<16>>16;b=u+1|0;do if(b>>>0>C>>>0)if(b>>>0>w>>>0){a=u+17|0;a=I>>>0>>0?I:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>18;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+32768+(z<<6)+((A&15)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+4|0;b=b+4|0}while(b>>>0>>0)}else{a=u+9|0;a=J>>>0>>0?J:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>18;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+32768+(z<<6)+((A&15)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=F-b|0;if((b+3|0)>>>0>>0)u=b;else{b=34;break a}}while(1){a=a+-1|0;if(K){b=(k[Q>>2]|0)+-1|0;b=(a|0)<(b|0)?a:b}else b=0;k[R>>2]=b;k[T>>2]=0;k[P>>2]=0;p[V>>3]=h;y=u+E|0;C=y+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>18;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+32768+(z<<6)+((A&15)<<2)>>2]=y;j[B>>1]=A+1<<16>>16;if(!(Bd(m,c,d,e,f,5.4,n,C,a,C>>>0>g>>>0?g:C,R,T,P,V)|0)){b=u;break}v=+p[V>>3];if(!(v>=+p[U>>3]+7.0)){b=u;break}b=u+1|0;t=t+1|0;k[Q>>2]=k[R>>2];k[S>>2]=k[T>>2];k[O>>2]=k[P>>2];p[U>>3]=v;w=w+1|0;if((w|0)>=4)break;else u=b}A=k[Q>>2]|0;C=b+G+(A<<1)|0;B=b+E|0;x=k[O>>2]|0;a=x+16|0;do if(x>>>0<=(B>>>0>g>>>0?g:B)>>>0){y=k[n>>2]|0;if((x|0)==(y|0))a=1;else{z=k[L>>2]|0;u=k[M>>2]|0;if((x|0)!=(z|0))if((x|0)!=(u|0))if((x|0)!=(k[N>>2]|0)){b:do if(D&(x|0)>5){w=4;while(1){if((x|0)==((k[1044+(w<<2)>>2]|0)+(k[n+(k[980+(w<<2)>>2]<<2)>>2]|0)|0)?(x|0)>=(k[1684+(w<<2)>>2]|0):0){a=w;break}w=w+1|0;if((w|0)>=16)break b}a=a+1|0}while(0);if((a|0)<=1)break}else a=4;else{u=x;a=3}else a=2;k[N>>2]=u;k[M>>2]=z;k[L>>2]=y;k[n>>2]=x}}while(0);ud(W,t,A,k[S>>2]|0,a);w=i+32|0;k[i>>2]=k[W>>2];k[i+4>>2]=k[W+4>>2];k[i+8>>2]=k[W+8>>2];k[i+12>>2]=k[W+12>>2];k[i+16>>2]=k[W+16>>2];k[i+20>>2]=k[W+20>>2];k[i+24>>2]=k[W+24>>2];if((A|0)>1){t=1;do{x=c+(t+b)|0;x=(ha(l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24,506832829)|0)>>>18;z=m+(x<<1)|0;y=j[z>>1]|0;k[m+32768+(x<<6)+((y&15)<<2)>>2]=t+B;j[z>>1]=y+1<<16>>16;t=t+1|0}while((t|0)<(A|0))}u=A+b|0;a=F-u|0;if((u+3|0)>>>0>=F>>>0){i=w;t=0;b=34;break}else{i=w;t=0}}if((b|0)==34){d=t+a|0;k[o>>2]=d;d=i;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}}function nd(a,b,c,d,e,f,g,h,i,m,n,o,q,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;m=m|0;n=n|0;o=o|0;q=q|0;s=s|0;var t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;X=r;r=r+80|0;Q=X+68|0;S=X+64|0;O=X+60|0;U=X+40|0;R=X+56|0;T=X+52|0;P=X+48|0;V=X+32|0;W=X;if(a>>>0>2&b>>>0>2){L=b+-3|0;K=c+(L&d)|0;K=(ha(l[K>>0]|l[K+1>>0]<<8|l[K+2>>0]<<16|l[K+3>>0]<<24,506832829)|0)>>>18;M=m+(K<<1)|0;N=j[M>>1]|0;k[m+32768+(K<<7)+((N&31)<<2)>>2]=L;j[M>>1]=N+1<<16>>16;M=b+-2|0;N=c+(M&d)|0;N=(ha(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24,506832829)|0)>>>18;K=m+(N<<1)|0;L=j[K>>1]|0;k[m+32768+(N<<7)+((L&31)<<2)>>2]=M;j[K>>1]=L+1<<16>>16;K=b+-1|0;L=c+(K&d)|0;L=(ha(l[L>>0]|l[L+1>>0]<<8|l[L+2>>0]<<16|l[L+3>>0]<<24,506832829)|0)>>>18;N=m+(L<<1)|0;M=j[N>>1]|0;k[m+32768+(L<<7)+((M&31)<<2)>>2]=K;j[N>>1]=M+1<<16>>16}t=k[o>>2]|0;u=d&b;E=b-u|0;F=u+a|0;G=(i|0)<9?64:512;if((u+3|0)>>>0>=F>>>0){d=q;c=a;g=t;c=g+c|0;k[o>>2]=c;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}H=G<<2;I=F+-4|0;J=F+-3|0;K=(i|0)<4;L=n+4|0;M=n+8|0;N=n+12|0;D=(i|0)>1;i=q;C=G+u|0;a:while(1){w=C+H|0;while(1){b=u+E|0;k[Q>>2]=0;k[S>>2]=0;k[O>>2]=0;p[U>>3]=h;if(Ad(m,c,d,e,f,5.4,n,b,a,b>>>0>g>>>0?g:b,Q,S,O,U)|0){w=0;break}t=t+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>18;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+32768+(z<<7)+((A&31)<<2)>>2]=b;j[B>>1]=A+1<<16>>16;b=u+1|0;do if(b>>>0>C>>>0)if(b>>>0>w>>>0){a=u+17|0;a=I>>>0>>0?I:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>18;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+32768+(z<<7)+((A&31)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+4|0;b=b+4|0}while(b>>>0>>0)}else{a=u+9|0;a=J>>>0>>0?J:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>18;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+32768+(z<<7)+((A&31)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=F-b|0;if((b+3|0)>>>0>>0)u=b;else{b=34;break a}}while(1){a=a+-1|0;if(K){b=(k[Q>>2]|0)+-1|0;b=(a|0)<(b|0)?a:b}else b=0;k[R>>2]=b;k[T>>2]=0;k[P>>2]=0;p[V>>3]=h;y=u+E|0;C=y+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>18;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+32768+(z<<7)+((A&31)<<2)>>2]=y;j[B>>1]=A+1<<16>>16;if(!(Ad(m,c,d,e,f,5.4,n,C,a,C>>>0>g>>>0?g:C,R,T,P,V)|0)){b=u;break}v=+p[V>>3];if(!(v>=+p[U>>3]+7.0)){b=u;break}b=u+1|0;t=t+1|0;k[Q>>2]=k[R>>2];k[S>>2]=k[T>>2];k[O>>2]=k[P>>2];p[U>>3]=v;w=w+1|0;if((w|0)>=4)break;else u=b}A=k[Q>>2]|0;C=b+G+(A<<1)|0;B=b+E|0;x=k[O>>2]|0;a=x+16|0;do if(x>>>0<=(B>>>0>g>>>0?g:B)>>>0){y=k[n>>2]|0;if((x|0)==(y|0))a=1;else{z=k[L>>2]|0;u=k[M>>2]|0;if((x|0)!=(z|0))if((x|0)!=(u|0))if((x|0)!=(k[N>>2]|0)){b:do if(D&(x|0)>5){w=4;while(1){if((x|0)==((k[1044+(w<<2)>>2]|0)+(k[n+(k[980+(w<<2)>>2]<<2)>>2]|0)|0)?(x|0)>=(k[1620+(w<<2)>>2]|0):0){a=w;break}w=w+1|0;if((w|0)>=16)break b}a=a+1|0}while(0);if((a|0)<=1)break}else a=4;else{u=x;a=3}else a=2;k[N>>2]=u;k[M>>2]=z;k[L>>2]=y;k[n>>2]=x}}while(0);ud(W,t,A,k[S>>2]|0,a);w=i+32|0;k[i>>2]=k[W>>2];k[i+4>>2]=k[W+4>>2];k[i+8>>2]=k[W+8>>2];k[i+12>>2]=k[W+12>>2];k[i+16>>2]=k[W+16>>2];k[i+20>>2]=k[W+20>>2];k[i+24>>2]=k[W+24>>2];if((A|0)>1){t=1;do{x=c+(t+b)|0;x=(ha(l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24,506832829)|0)>>>18;z=m+(x<<1)|0;y=j[z>>1]|0;k[m+32768+(x<<7)+((y&31)<<2)>>2]=t+B;j[z>>1]=y+1<<16>>16;t=t+1|0}while((t|0)<(A|0))}u=A+b|0;a=F-u|0;if((u+3|0)>>>0>=F>>>0){i=w;t=0;b=34;break}else{i=w;t=0}}if((b|0)==34){d=t+a|0;k[o>>2]=d;d=i;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}}function od(a,b,c,d,e,f,g,h,i,m,n,o,q,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=+h;i=i|0;m=m|0;n=n|0;o=o|0;q=q|0;s=s|0;var t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;X=r;r=r+80|0;Q=X+68|0;S=X+64|0;O=X+60|0;U=X+40|0;R=X+56|0;T=X+52|0;P=X+48|0;V=X+32|0;W=X;if(a>>>0>2&b>>>0>2){L=b+-3|0;K=c+(L&d)|0;K=(ha(l[K>>0]|l[K+1>>0]<<8|l[K+2>>0]<<16|l[K+3>>0]<<24,506832829)|0)>>>17;M=m+(K<<1)|0;N=j[M>>1]|0;k[m+65536+(K<<8)+((N&63)<<2)>>2]=L;j[M>>1]=N+1<<16>>16;M=b+-2|0;N=c+(M&d)|0;N=(ha(l[N>>0]|l[N+1>>0]<<8|l[N+2>>0]<<16|l[N+3>>0]<<24,506832829)|0)>>>17;K=m+(N<<1)|0;L=j[K>>1]|0;k[m+65536+(N<<8)+((L&63)<<2)>>2]=M;j[K>>1]=L+1<<16>>16;K=b+-1|0;L=c+(K&d)|0;L=(ha(l[L>>0]|l[L+1>>0]<<8|l[L+2>>0]<<16|l[L+3>>0]<<24,506832829)|0)>>>17;N=m+(L<<1)|0;M=j[N>>1]|0;k[m+65536+(L<<8)+((M&63)<<2)>>2]=K;j[N>>1]=M+1<<16>>16}t=k[o>>2]|0;u=d&b;E=b-u|0;F=u+a|0;G=(i|0)<9?64:512;if((u+3|0)>>>0>=F>>>0){d=q;c=a;g=t;c=g+c|0;k[o>>2]=c;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}H=G<<2;I=F+-4|0;J=F+-3|0;K=(i|0)<4;L=n+4|0;M=n+8|0;N=n+12|0;D=(i|0)>1;i=q;C=G+u|0;a:while(1){w=C+H|0;while(1){b=u+E|0;k[Q>>2]=0;k[S>>2]=0;k[O>>2]=0;p[U>>3]=h;if(zd(m,c,d,e,f,5.4,n,b,a,b>>>0>g>>>0?g:b,Q,S,O,U)|0){w=0;break}t=t+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<8)+((A&63)<<2)>>2]=b;j[B>>1]=A+1<<16>>16;b=u+1|0;do if(b>>>0>C>>>0)if(b>>>0>w>>>0){a=u+17|0;a=I>>>0>>0?I:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<8)+((A&63)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+4|0;b=b+4|0}while(b>>>0>>0)}else{a=u+9|0;a=J>>>0>>0?J:a;if(b>>>0>=a>>>0)break;do{z=c+b|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<8)+((A&63)<<2)>>2]=b+E;j[B>>1]=A+1<<16>>16;t=t+2|0;b=b+2|0}while(b>>>0>>0)}while(0);a=F-b|0;if((b+3|0)>>>0>>0)u=b;else{b=34;break a}}while(1){a=a+-1|0;if(K){b=(k[Q>>2]|0)+-1|0;b=(a|0)<(b|0)?a:b}else b=0;k[R>>2]=b;k[T>>2]=0;k[P>>2]=0;p[V>>3]=h;y=u+E|0;C=y+1|0;z=c+u|0;z=(ha(l[z>>0]|l[z+1>>0]<<8|l[z+2>>0]<<16|l[z+3>>0]<<24,506832829)|0)>>>17;B=m+(z<<1)|0;A=j[B>>1]|0;k[m+65536+(z<<8)+((A&63)<<2)>>2]=y;j[B>>1]=A+1<<16>>16;if(!(zd(m,c,d,e,f,5.4,n,C,a,C>>>0>g>>>0?g:C,R,T,P,V)|0)){b=u;break}v=+p[V>>3];if(!(v>=+p[U>>3]+7.0)){b=u;break}b=u+1|0;t=t+1|0;k[Q>>2]=k[R>>2];k[S>>2]=k[T>>2];k[O>>2]=k[P>>2];p[U>>3]=v;w=w+1|0;if((w|0)>=4)break;else u=b}A=k[Q>>2]|0;C=b+G+(A<<1)|0;B=b+E|0;x=k[O>>2]|0;a=x+16|0;do if(x>>>0<=(B>>>0>g>>>0?g:B)>>>0){y=k[n>>2]|0;if((x|0)==(y|0))a=1;else{z=k[L>>2]|0;u=k[M>>2]|0;if((x|0)!=(z|0))if((x|0)!=(u|0))if((x|0)!=(k[N>>2]|0)){b:do if(D&(x|0)>5){w=4;while(1){if((x|0)==((k[1044+(w<<2)>>2]|0)+(k[n+(k[980+(w<<2)>>2]<<2)>>2]|0)|0)?(x|0)>=(k[1556+(w<<2)>>2]|0):0){a=w;break}w=w+1|0;if((w|0)>=16)break b}a=a+1|0}while(0);if((a|0)<=1)break}else a=4;else{u=x;a=3}else a=2;k[N>>2]=u;k[M>>2]=z;k[L>>2]=y;k[n>>2]=x}}while(0);ud(W,t,A,k[S>>2]|0,a);w=i+32|0;k[i>>2]=k[W>>2];k[i+4>>2]=k[W+4>>2];k[i+8>>2]=k[W+8>>2];k[i+12>>2]=k[W+12>>2];k[i+16>>2]=k[W+16>>2];k[i+20>>2]=k[W+20>>2];k[i+24>>2]=k[W+24>>2];if((A|0)>1){t=1;do{x=c+(t+b)|0;x=(ha(l[x>>0]|l[x+1>>0]<<8|l[x+2>>0]<<16|l[x+3>>0]<<24,506832829)|0)>>>17;z=m+(x<<1)|0;y=j[z>>1]|0;k[m+65536+(x<<8)+((y&63)<<2)>>2]=t+B;j[z>>1]=y+1<<16>>16;t=t+1|0}while((t|0)<(A|0))}u=A+b|0;a=F-u|0;if((u+3|0)>>>0>=F>>>0){i=w;t=0;b=34;break}else{i=w;t=0}}if((b|0)==34){d=t+a|0;k[o>>2]=d;d=i;o=q;o=d-o|0;o=o>>5;q=k[s>>2]|0;o=q+o|0;k[s>>2]=o;r=X;return}} +function Kf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if((f|0)==0|(e|0)==0)return;a:while(1){i=e;m=a;while(1){l=b;a=m;while(1){e=a;if(Zb[k[d>>2]&1](l,e)|0){z=i;break}i=i+-1|0;if(!i){i=69;break a}else a=e+8|0}if(!((f|0)>(h|0)&(z|0)>(h|0))){j=z;i=8;break a}if((z|0)<(f|0)){j=(f|0)/2|0;o=l+(j<<3)|0;n=e;i=b-a>>3;b:while(1){while(1){if(!i){i=n;break b}m=(i|0)/2|0;if(Zb[k[d>>2]&1](o,n+(m<<3)|0)|0)i=m;else break}n=n+(m+1<<3)|0;i=i+-1-m|0}n=i;x=o;y=i-a>>3}else{if((z|0)==1){e=a;i=44;break a}o=(z|0)/2|0;n=e+(o<<3)|0;m=l;i=c-b>>3;c:while(1){while(1){if(!i){i=m;break c}j=(i|0)/2|0;if(Zb[k[d>>2]&1](m+(j<<3)|0,n)|0)break;else i=j}m=m+(j+1<<3)|0;i=i+-1-j|0}x=i;y=o;j=i-b>>3}o=b;b=x;w=n;i=z-y|0;v=f;f=f-j|0;m=o;d:do if((n|0)!=(l|0))if((l|0)==(x|0))l=n;else{if((n+8|0)==(l|0)){t=n;s=k[t>>2]|0;t=k[t+4>>2]|0;l=b-o|0;li(n|0,m|0,l|0)|0;l=n+(l>>3<<3)|0;u=l;k[u>>2]=s;k[u+4>>2]=t;break}if((l+8|0)==(x|0)){u=x+-8|0;t=u;s=k[t>>2]|0;t=k[t+4>>2]|0;u=u-w|0;l=x+(0-(u>>3)<<3)|0;li(l|0,n|0,u|0)|0;u=n;k[u>>2]=s;k[u+4>>2]=t;break}u=o-w>>3;t=b-o>>3;if((u|0)==(t|0)){m=n;o=l;while(1){t=m;s=k[t>>2]|0;t=k[t+4>>2]|0;q=o;r=k[q+4>>2]|0;u=m;k[u>>2]=k[q>>2];k[u+4>>2]=r;u=o;k[u>>2]=s;k[u+4>>2]=t;m=m+8|0;if((m|0)==(l|0))break d;else o=o+8|0}}else{l=u;m=t}while(1){l=(l|0)%(m|0)|0;if(!l){l=m;break}else{s=m;m=l;l=s}}if(l){s=u+-1|0;p=n+(l<<3)|0;do{l=p;p=p+-8|0;r=p;q=k[r>>2]|0;r=k[r+4>>2]|0;l=l+(s<<3)|0;o=p;while(1){B=l;A=k[B+4>>2]|0;m=o;o=l;k[m>>2]=k[B>>2];k[m+4>>2]=A;m=b-o>>3;m=(u|0)<(m|0)?l+(u<<3)|0:n+(u-m<<3)|0;if((m|0)==(p|0))break;else l=m}B=l;k[B>>2]=q;k[B+4>>2]=r}while((p|0)!=(n|0))}l=n+(t<<3)|0}else l=x;while(0);m=l;if((y+j|0)>=(i+f|0)){n=x;b=w;e=y;break}Kf(e,n,l,d,y,j,g,h);if((v|0)==(j|0)|(z|0)==(y|0)){i=69;break a}}Kf(l,n,c,d,i,f,g,h);if((j|0)==0|(e|0)==0){i=69;break}else{f=j;c=m}}if((i|0)==8){m=c;if((j|0)<=(f|0)){e:do if((e|0)!=(l|0)){f=(l+-8-a|0)>>>3;c=e;i=g;while(1){h=c;A=k[h+4>>2]|0;B=i;k[B>>2]=k[h>>2];k[B+4>>2]=A;c=c+8|0;if((c|0)==(l|0))break;else i=i+8|0}j=g+(f+1<<3)|0;if((j|0)!=(g|0)){f=b;i=b;c=l;a=g;b=g;while(1){if((c|0)==(m|0))break;if(Zb[k[d>>2]&1](c,a)|0){B=f;i=k[B+4>>2]|0;f=e;k[f>>2]=k[B>>2];k[f+4>>2]=i;c=c+8|0;f=c;i=c}else{A=b;B=k[A+4>>2]|0;b=e;k[b>>2]=k[A>>2];k[b+4>>2]=B;b=a+8|0}e=e+8|0;a=b;if((a|0)==(j|0)){b=i;break e}}li(e|0,b|0,j-b|0)|0;return}}else e=l;while(0);if((b|0)==(m|0))return;while(1){g=b;A=k[g+4>>2]|0;B=e;k[B>>2]=k[g>>2];k[B+4>>2]=A;b=b+8|0;if((b|0)==(m|0))break;else e=e+8|0}return}if((l|0)==(m|0))f=g;else{i=(m+-8-b|0)>>>3;f=l;a=g;while(1){h=f;A=k[h+4>>2]|0;B=a;k[B>>2]=k[h>>2];k[B+4>>2]=A;f=f+8|0;if((f|0)==(m|0))break;else a=a+8|0}f=g+(i+1<<3)|0}f:do if((l|0)==(e|0))e=f;else{while(1){i=f;if((i|0)==(g|0))break;i=i+-8|0;c=c+-8|0;if(Zb[k[d>>2]&1](i,l+-8|0)|0){b=b+-8|0;h=b;A=k[h+4>>2]|0;B=c;k[B>>2]=k[h>>2];k[B+4>>2]=A}else{A=i;B=k[A+4>>2]|0;f=c;k[f>>2]=k[A>>2];k[f+4>>2]=B;f=i}l=b;if((l|0)==(e|0)){e=f;break f}}f=b;if((f|0)==(e|0))return;while(1){c=c+-8|0;g=f+-8|0;A=k[g+4>>2]|0;B=c;k[B>>2]=k[g>>2];k[B+4>>2]=A;b=b+-8|0;if((b|0)==(e|0))break;else f=b}return}while(0);b=e;if((b|0)==(g|0))return;while(1){c=c+-8|0;d=b+-8|0;A=k[d+4>>2]|0;B=c;k[B>>2]=k[d>>2];k[B+4>>2]=A;e=e+-8|0;if((e|0)==(g|0))break;else b=e}return}else if((i|0)==44){d=e;A=d;g=k[A>>2]|0;A=k[A+4>>2]|0;B=b;z=B;h=k[z+4>>2]|0;k[d>>2]=k[z>>2];k[d+4>>2]=h;k[B>>2]=g;k[B+4>>2]=A;return}else if((i|0)==69)return}function Lf(a,b,c,d,e,f,g,h,n,o,p,q,r,s){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;n=n|0;o=o|0;p=p|0;q=q|0;r=r|0;s=s|0;var t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;J=k[c+16>>2]|0;if((J|0)==(k[c+20>>2]|0))v=0;else v=k[J>>2]|0;L=k[d+16>>2]|0;if((L|0)==(k[d+20>>2]|0))x=0;else x=k[L>>2]|0;K=k[e+16>>2]|0;if((K|0)==(k[e+20>>2]|0))t=0;else t=k[K>>2]|0;if(!b)return;I=d+4|0;H=e+4|0;G=c+4|0;u=0;w=0;y=0;A=0;z=0;e=x;d=0;F=0;c=g;while(1){if(!e){y=d+1|0;d=y;e=k[L+(y<<2)>>2]|0;y=k[(k[I>>2]|0)+(y<<2)>>2]|0}e=e+-1|0;C=k[r>>2]|0;D=j[a+(F<<5)+8>>1]|0;E=D&65535;B=C+(y*2832|0)+(E<<2)|0;k[B>>2]=(k[B>>2]|0)+1;C=C+(y*2832|0)+2816|0;k[C>>2]=(k[C>>2]|0)+1;C=a+(F<<5)|0;a:do if((k[C>>2]|0)>0){B=n;x=z;n=A;g=0;while(1){if(!v){x=n+1|0;z=x;v=k[J+(x<<2)>>2]|0;x=k[(k[G>>2]|0)+(x<<2)>>2]|0}else z=n;v=v+-1|0;n=x<<6;switch(k[(k[p>>2]|0)+(x<<2)>>2]|0){case 0:{o=B&63;break}case 1:{o=(B&255)>>>2;break}case 2:{o=i[318346+(o&255|256)>>0]|i[318346+(B&255)>>0];break}case 3:{o=((l[318858+(B&255)>>0]|0)<<3)+(l[318858+(o&255)>>0]|0)&255;break}default:o=0}A=(o&255)+n|0;o=k[q>>2]|0;n=f+(c&h)|0;M=o+(A*1040|0)+((l[n>>0]|0)<<2)|0;k[M>>2]=(k[M>>2]|0)+1;A=o+(A*1040|0)+1024|0;k[A>>2]=(k[A>>2]|0)+1;n=i[n>>0]|0;c=c+1|0;g=g+1|0;if((g|0)>=(k[C>>2]|0)){o=B;break a}else{o=B;B=n;n=z}}}else{x=z;z=A}while(0);M=k[a+(F<<5)+4>>2]|0;c=M+c|0;if((M|0)>0){o=i[f+(c+-2&h)>>0]|0;n=i[f+(c+-1&h)>>0]|0;if((D&65535)>127){if(!t){u=u+1|0;t=k[K+(u<<2)>>2]|0;w=k[(k[H>>2]|0)+(u<<2)>>2]|0}D=E>>>6;M=E&7;M=(M>>>0<3&((D|0)==7|((D|0)==4|(D&1021|0)==0))?M:3)+(w<<2)|0;E=k[s>>2]|0;D=E+(M*2096|0)+((m[a+(F<<5)+10>>1]|0)<<2)|0;k[D>>2]=(k[D>>2]|0)+1;M=E+(M*2096|0)+2080|0;k[M>>2]=(k[M>>2]|0)+1;t=t+-1|0}}F=F+1|0;if((F|0)==(b|0))break;else{A=z;z=x}}return}function Mf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,m=0,n=0.0,p=0.0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;x=r;r=r+3088|0;v=x+16|0;w=x;k[v>>2]=0;k[v+4>>2]=0;k[v+8>>2]=0;t=(b|0)==0;if(t){g=0;h=0}else{j=0;m=0;do{h=i[e+(j+a&c)>>0]|0;if(h<<24>>24<=-1)if((h&255)>191)g=1;else g=m>>>0<224?0:2;else g=0;m=h&255;u=v+(g<<2)|0;k[u>>2]=(k[u>>2]|0)+1;j=j+1|0}while((j|0)!=(b|0));g=k[v+4>>2]|0;h=k[v+8>>2]|0}u=(h+g|0)>24&1;gi(v|0,0,3072)|0;k[w>>2]=0;k[w+4>>2]=0;k[w+8>>2]=0;if((b|0)>0|b>>>0>494){m=b>>>0<495?b:495;q=0;s=0;g=0;do{h=i[e+(q+a&c)>>0]|0;j=s;s=h&255;y=v+(g<<10)+(s<<2)|0;k[y>>2]=(k[y>>2]|0)+1;g=w+(g<<2)|0;k[g>>2]=(k[g>>2]|0)+1;if(h<<24>>24<=-1)if((h&255)>191)g=u;else g=j>>>0<224?0:u;else g=0;q=q+1|0}while((q|0)!=(m|0))}if(t){r=x;return}m=a+-495|0;q=a+495|0;s=0;do{if((s+-495|0)>-1){if((s|0)>=496){g=s+a|0;h=i[e+(g+-496&c)>>0]|0;if((s|0)<497)g=0;else g=l[e+(g+-497&c)>>0]|0;if(h<<24>>24<=-1)if((h&255)>191)g=u;else g=g>>>0<224?0:u;else g=0}else g=0;y=v+(g<<10)+((l[e+(m+s&c)>>0]|0)<<2)|0;k[y>>2]=(k[y>>2]|0)+-1;y=w+(g<<2)|0;k[y>>2]=(k[y>>2]|0)+-1}if((s+495|0)>>>0>>0){h=s+a|0;g=i[e+(h+494&c)>>0]|0;h=i[e+(h+493&c)>>0]|0;if(g<<24>>24<=-1)if((g&255)>191)g=u;else g=(h&255)<224?0:u;else g=0;y=v+(g<<10)+((l[e+(q+s&c)>>0]|0)<<2)|0;k[y>>2]=(k[y>>2]|0)+1;y=w+(g<<2)|0;k[y>>2]=(k[y>>2]|0)+1}j=s+a|0;if((s|0)>=1){h=i[e+(j+-1&c)>>0]|0;if((s|0)<2)g=0;else g=l[e+(j+-2&c)>>0]|0;if(h<<24>>24<=-1)if((h&255)>191)g=u;else g=g>>>0<224?0:u;else g=0}else g=0;h=k[v+(g<<10)+((l[e+(j&c)>>0]|0)<<2)>>2]|0;h=(h|0)==0?1:h;g=k[w+(g<<2)>>2]|0;if((g|0)<256)p=+o[4036+(g<<2)>>2];else p=+oh(+(g|0));if((h|0)<256)n=+o[4036+(h<<2)>>2];else n=+oh(+(h|0));n=p-n+.02905;n=n<1.0?n*.5+.5:n;if((s|0)<2e3)n=n+(.7-+(2e3-s|0)/2.0e3*.35);o[f+((j&d)<<2)>>2]=n;s=s+1|0}while((s|0)!=(b|0));r=x;return}function Nf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0.0,m=0.0,n=0,p=0,q=0,s=0,t=0;t=r;r=r+1024|0;s=t;gi(s|0,0,1024)|0;i=b>>>0<2e3?b:2e3;if((i|0)>0){g=b>>>0<2e3?b:2e3;h=0;do{q=s+((l[e+(h+a&c)>>0]|0)<<2)|0;k[q>>2]=(k[q>>2]|0)+1;h=h+1|0}while((h|0)!=(g|0))}if(!b){r=t;return}n=a+-2e3|0;p=a+2e3|0;q=0;g=i;do{if((q+-2e3|0)>-1){i=s+((l[e+(n+q&c)>>0]|0)<<2)|0;k[i>>2]=(k[i>>2]|0)+-1;g=g+-1|0}if((q+2e3|0)>>>0>>0){i=s+((l[e+(p+q&c)>>0]|0)<<2)|0;k[i>>2]=(k[i>>2]|0)+1;g=g+1|0}i=q+a|0;h=k[s+((l[e+(i&c)>>0]|0)<<2)>>2]|0;h=(h|0)==0?1:h;if((g|0)<256)m=+o[4036+(g<<2)>>2];else m=+oh(+(g|0));if((h|0)<256)j=+o[4036+(h<<2)>>2];else j=+oh(+(h|0));m=m-j+.029;o[f+((i&d)<<2)>>2]=m<1.0?m*.5+.5:m;q=q+1|0}while((q|0)!=(b|0));r=t;return}function Of(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;B=r;r=r+48|0;z=B+24|0;y=B+12|0;w=B;u=j+28|0;v=j+56|0;Hd(f,g,a+(c&b)|0,j,u,v);l=k[j>>2]|0;k[z>>2]=0;A=z+4|0;k[A>>2]=0;k[z+8>>2]=0;if(!l)l=0;else{if(l>>>0>1073741823)mg(z);m=og(l<<2)|0;k[A>>2]=m;k[z>>2]=m;n=m+(l<<2)|0;k[z+8>>2]=n;while(1){k[m>>2]=h;l=l+-1|0;if(!l)break;else m=m+4|0}k[A>>2]=n;l=k[j>>2]|0}m=l<<6;q=k[v>>2]|0;t=q<<2;k[y>>2]=0;x=y+4|0;k[x>>2]=0;k[y+8>>2]=0;if(m){if(m>>>0>4129776)mg(y);o=og(l*66560|0)|0;k[x>>2]=o;k[y>>2]=o;k[y+8>>2]=o+(m*1040|0);h=l<<6;n=o;l=o;while(1){gi(n|0,0,1028)|0;l=l+1040|0;m=m+-1|0;if(!m)break;else n=l}k[x>>2]=o+(h*1040|0)}p=j+120|0;l=k[u>>2]|0;m=j+124|0;n=k[m>>2]|0;h=k[p>>2]|0;o=(n-h|0)/2832|0;if(l>>>0<=o>>>0){if(l>>>0>>0?(s=h+(l*2832|0)|0,(n|0)!=(s|0)):0)k[m>>2]=n+(~(((n+-2832-s|0)>>>0)/2832|0)*2832|0)}else je(p,l-o|0);k[w>>2]=0;s=w+4|0;k[s>>2]=0;k[w+8>>2]=0;if(t){if(t>>>0>2049125)mg(w);o=og(q*8384|0)|0;k[s>>2]=o;k[w>>2]=o;k[w+8>>2]=o+(t*2096|0);h=q<<2;l=t;n=o;m=o;while(1){gi(n|0,0,2084)|0;m=m+2096|0;l=l+-1|0;if(!l)break;else n=m}k[s>>2]=o+(h*2096|0)}Lf(f,g,j,u,v,a,b,c,d,e,z,y,p,w);l=j+108|0;if((l|0)!=(y|0))Rf(l,k[y>>2]|0,k[x>>2]|0);m=k[j>>2]|0;n=j+84|0;if(i)ve(y,64,m,256,l,n);else Sf(y,64,m,256,l,n);n=j+132|0;if((n|0)!=(w|0))Tf(n,k[w>>2]|0,k[s>>2]|0);m=k[v>>2]|0;l=j+96|0;if(i)Sd(w,4,m,256,n,l);else Uf(w,4,m,256,n,l);l=k[w>>2]|0;m=l;if(l){n=k[s>>2]|0;if((n|0)!=(l|0))k[s>>2]=n+(~(((n+-2096-m|0)>>>0)/2096|0)*2096|0);rg(l)}l=k[y>>2]|0;m=l;if(l){n=k[x>>2]|0;if((n|0)!=(l|0))k[x>>2]=n+(~(((n+-1040-m|0)>>>0)/1040|0)*1040|0);rg(l)}m=k[z>>2]|0;if(!m){r=B;return}l=k[A>>2]|0;if((l|0)!=(m|0))k[A>>2]=l+(~((l+-4-m|0)>>>2)<<2);rg(m);r=B;return}function Pf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;F=r;r=r+224|0;E=F+144|0;C=F+72|0;D=F;i=(e|0)==0;if(i)g=0;else{h=0;g=0;do{g=(k[d+(h<<5)>>2]|0)+g|0;h=h+1|0}while((h|0)!=(e|0))}Vf(E,256,512,400.0,g,f,f+108|0);Wf(C,704,1024,500.0,e,f+28|0,f+120|0);Xf(D,64,512,100.0,e,f+56|0,f+132|0);if(i){Zf(E,1);Yf(C,1);_f(D,1);r=F;return}p=C+24|0;q=C+36|0;s=C+32|0;t=C+28|0;u=D+24|0;v=D+36|0;w=D+32|0;x=D+28|0;y=E+24|0;z=E+36|0;A=E+32|0;B=E+28|0;g=b;o=0;do{i=k[d+(o<<5)>>2]|0;b=k[d+(o<<5)+4>>2]|0;m=j[d+(o<<5)+8>>1]|0;n=j[d+(o<<5)+10>>1]|0;f=k[q>>2]|0;h=k[k[p>>2]>>2]|0;G=h+(f*2832|0)+((m&65535)<<2)|0;k[G>>2]=(k[G>>2]|0)+1;f=h+(f*2832|0)+2816|0;k[f>>2]=(k[f>>2]|0)+1;f=(k[s>>2]|0)+1|0;k[s>>2]=f;if((f|0)==(k[t>>2]|0))Yf(C,0);if((i|0)>0){h=g;f=0;while(1){G=k[z>>2]|0;H=k[k[y>>2]>>2]|0;I=H+(G*1040|0)+((l[a+(h&c)>>0]|0)<<2)|0;k[I>>2]=(k[I>>2]|0)+1;G=H+(G*1040|0)+1024|0;k[G>>2]=(k[G>>2]|0)+1;G=(k[A>>2]|0)+1|0;k[A>>2]=G;if((G|0)==(k[B>>2]|0))Zf(E,0);f=f+1|0;if((f|0)==(i|0))break;else h=h+1|0}g=g+i|0}g=g+b|0;if((b|0)>0&(m&65535)>127?(I=k[v>>2]|0,H=k[k[u>>2]>>2]|0,G=H+(I*2096|0)+((n&65535)<<2)|0,k[G>>2]=(k[G>>2]|0)+1,I=H+(I*2096|0)+2080|0,k[I>>2]=(k[I>>2]|0)+1,I=(k[w>>2]|0)+1|0,k[w>>2]=I,(I|0)==(k[x>>2]|0)):0)_f(D,0);o=o+1|0}while((o|0)!=(e|0));Zf(E,1);Yf(C,1);_f(D,1);r=F;return}function Qf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;f=c+112|0;g=c+108|0;d=k[g>>2]|0;if((k[f>>2]|0)!=(d|0)){e=0;do{Df(256,d+(e*1040|0)|0)|0;e=e+1|0;d=k[g>>2]|0}while(e>>>0<(((k[f>>2]|0)-d|0)/1040|0)>>>0)}f=c+124|0;g=c+120|0;d=k[g>>2]|0;if((k[f>>2]|0)!=(d|0)){e=0;do{Df(704,d+(e*2832|0)|0)|0;e=e+1|0;d=k[g>>2]|0}while(e>>>0<(((k[f>>2]|0)-d|0)/2832|0)>>>0)}g=a+16+(48<>2]|0;if((k[b>>2]|0)==(d|0))return;else e=0;do{Df(g,d+(e*2096|0)|0)|0;e=e+1|0;d=k[f>>2]|0}while(e>>>0<(((k[b>>2]|0)-d|0)/2096|0)>>>0);return}function Rf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0;e=b;i=(c-e|0)/1040|0;l=a+8|0;d=k[l>>2]|0;h=k[a>>2]|0;g=h;if(i>>>0<=((d-g|0)/1040|0)>>>0){f=a+4|0;d=((k[f>>2]|0)-g|0)/1040|0;a=i>>>0>d>>>0;d=a?b+(d*1040|0)|0:c;l=d-e|0;li(h|0,b|0,l|0)|0;b=h+(((l|0)/1040|0)*1040|0)|0;if(!a){d=k[f>>2]|0;if((d|0)==(b|0))return;k[f>>2]=d+(~(((d+-1040-b|0)>>>0)/1040|0)*1040|0);return}if((d|0)==(c|0))return;b=k[f>>2]|0;do{ki(b|0,d|0,1040)|0;b=(k[f>>2]|0)+1040|0;k[f>>2]=b;d=d+1040|0}while((d|0)!=(c|0));return}if(h){d=a+4|0;e=k[d>>2]|0;if((e|0)!=(h|0))k[d>>2]=e+(~(((e+-1040-g|0)>>>0)/1040|0)*1040|0);rg(h);k[l>>2]=0;k[d>>2]=0;k[a>>2]=0;d=0}f=i>>>0>4129776;if(f)mg(a);d=(d-0|0)/1040|0;if(d>>>0<2064888){e=d<<1;d=e>>>0>=i>>>0;if(d|f^1)j=d?e:i;else mg(a)}else j=4129776;d=og(j*1040|0)|0;e=a+4|0;k[e>>2]=d;k[a>>2]=d;k[l>>2]=d+(j*1040|0);if((b|0)==(c|0))return;do{ki(d|0,b|0,1040)|0;d=(k[e>>2]|0)+1040|0;k[e>>2]=d;b=b+1040|0}while((b|0)!=(c|0));return}function Sf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;q=r;r=r+16|0;p=q;d=e+4|0;g=k[d>>2]|0;h=k[e>>2]|0;i=(g-h|0)/1040|0;if(i>>>0>=c>>>0){if(i>>>0>c>>>0?(j=h+(c*1040|0)|0,(g|0)!=(j|0)):0)k[d>>2]=g+(~(((g+-1040-j|0)>>>0)/1040|0)*1040|0)}else we(e,c-i|0);k[p>>2]=0;if((c|0)<=0){r=q;return}j=f+4|0;l=f+8|0;if((b|0)>0)m=0;else{d=0;do{gi((k[e>>2]|0)+(d*1040|0)|0,0,1028)|0;d=d+1|0}while((d|0)<(c|0));k[p>>2]=d;r=q;return}do{gi((k[e>>2]|0)+(m*1040|0)|0,0,1028)|0;n=ha(m,b)|0;o=0;do{d=k[e>>2]|0;g=n+o|0;h=k[a>>2]|0;i=d+(m*1040|0)+1024|0;k[i>>2]=(k[i>>2]|0)+(k[h+(g*1040|0)+1024>>2]|0);i=0;do{s=d+(m*1040|0)+(i<<2)|0;k[s>>2]=(k[s>>2]|0)+(k[h+(g*1040|0)+(i<<2)>>2]|0);i=i+1|0}while((i|0)!=256);d=k[j>>2]|0;if((d|0)==(k[l>>2]|0))Jd(f,p);else{k[d>>2]=m;k[j>>2]=d+4}o=o+1|0}while((o|0)!=(b|0));m=m+1|0;k[p>>2]=m}while((m|0)<(c|0));r=q;return}function Tf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0;e=b;i=(c-e|0)/2096|0;l=a+8|0;d=k[l>>2]|0;h=k[a>>2]|0;g=h;if(i>>>0<=((d-g|0)/2096|0)>>>0){f=a+4|0;d=((k[f>>2]|0)-g|0)/2096|0;a=i>>>0>d>>>0;d=a?b+(d*2096|0)|0:c;l=d-e|0;li(h|0,b|0,l|0)|0;b=h+(((l|0)/2096|0)*2096|0)|0;if(!a){d=k[f>>2]|0;if((d|0)==(b|0))return;k[f>>2]=d+(~(((d+-2096-b|0)>>>0)/2096|0)*2096|0);return}if((d|0)==(c|0))return;b=k[f>>2]|0;do{ki(b|0,d|0,2096)|0;b=(k[f>>2]|0)+2096|0;k[f>>2]=b;d=d+2096|0}while((d|0)!=(c|0));return}if(h){d=a+4|0;e=k[d>>2]|0;if((e|0)!=(h|0))k[d>>2]=e+(~(((e+-2096-g|0)>>>0)/2096|0)*2096|0);rg(h);k[l>>2]=0;k[d>>2]=0;k[a>>2]=0;d=0}f=i>>>0>2049125;if(f)mg(a);d=(d-0|0)/2096|0;if(d>>>0<1024562){e=d<<1;d=e>>>0>=i>>>0;if(d|f^1)j=d?e:i;else mg(a)}else j=2049125;d=og(j*2096|0)|0;e=a+4|0;k[e>>2]=d;k[a>>2]=d;k[l>>2]=d+(j*2096|0);if((b|0)==(c|0))return;do{ki(d|0,b|0,2096)|0;d=(k[e>>2]|0)+2096|0;k[e>>2]=d;b=b+2096|0}while((b|0)!=(c|0));return}function Uf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;q=r;r=r+16|0;p=q;d=e+4|0;g=k[d>>2]|0;h=k[e>>2]|0;i=(g-h|0)/2096|0;if(i>>>0>=c>>>0){if(i>>>0>c>>>0?(j=h+(c*2096|0)|0,(g|0)!=(j|0)):0)k[d>>2]=g+(~(((g+-2096-j|0)>>>0)/2096|0)*2096|0)}else Td(e,c-i|0);k[p>>2]=0;if((c|0)<=0){r=q;return}j=f+4|0;l=f+8|0;if((b|0)>0)m=0;else{d=0;do{gi((k[e>>2]|0)+(d*2096|0)|0,0,2084)|0;d=d+1|0}while((d|0)<(c|0));k[p>>2]=d;r=q;return}do{gi((k[e>>2]|0)+(m*2096|0)|0,0,2084)|0;n=ha(m,b)|0;o=0;do{d=k[e>>2]|0;g=n+o|0;h=k[a>>2]|0;i=d+(m*2096|0)+2080|0;k[i>>2]=(k[i>>2]|0)+(k[h+(g*2096|0)+2080>>2]|0);i=0;do{s=d+(m*2096|0)+(i<<2)|0;k[s>>2]=(k[s>>2]|0)+(k[h+(g*2096|0)+(i<<2)>>2]|0);i=i+1|0}while((i|0)!=520);d=k[j>>2]|0;if((d|0)==(k[l>>2]|0))Jd(f,p);else{k[d>>2]=m;k[j>>2]=d+4}o=o+1|0}while((o|0)!=(b|0));m=m+1|0;k[p>>2]=m}while((m|0)<(c|0));r=q;return}function Vf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,l=0,m=0,n=0,o=0;k[a>>2]=b;k[a+4>>2]=c;p[a+8>>3]=d;k[a+16>>2]=0;i=a+20|0;k[i>>2]=f;m=a+24|0;k[m>>2]=g;k[a+28>>2]=c;k[a+32>>2]=0;k[a+36>>2]=0;k[a+64>>2]=0;l=((e|0)/(c|0)|0)+1|0;n=(l|0)>257?257:l;b=f+16|0;g=f+20|0;c=k[g>>2]|0;e=k[b>>2]|0;h=c-e>>2;if(l>>>0<=h>>>0){if(l>>>0>>0?(j=e+(l<<2)|0,(c|0)!=(j|0)):0)k[g>>2]=c+(~((c+-4-j|0)>>>2)<<2)}else{Ud(b,l-h|0);f=k[i>>2]|0}e=f+4|0;f=f+8|0;b=k[f>>2]|0;g=k[e>>2]|0;c=b-g>>2;if(l>>>0<=c>>>0){if(l>>>0>>0?(o=g+(l<<2)|0,(b|0)!=(o|0)):0)k[f>>2]=b+(~((b+-4-o|0)>>>2)<<2)}else Ud(e,l-c|0);f=k[m>>2]|0;c=f+4|0;e=k[c>>2]|0;b=k[f>>2]|0;g=(e-b|0)/1040|0;if(n>>>0>g>>>0){we(f,n-g|0);o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}if(n>>>0>=g>>>0){o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}f=b+(n*1040|0)|0;if((e|0)==(f|0)){o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}k[c>>2]=e+(~(((e+-1040-f|0)>>>0)/1040|0)*1040|0);o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}function Wf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,l=0,m=0,n=0,o=0;k[a>>2]=b;k[a+4>>2]=c;p[a+8>>3]=d;k[a+16>>2]=0;i=a+20|0;k[i>>2]=f;m=a+24|0;k[m>>2]=g;k[a+28>>2]=c;k[a+32>>2]=0;k[a+36>>2]=0;k[a+64>>2]=0;l=((e|0)/(c|0)|0)+1|0;n=(l|0)>257?257:l;b=f+16|0;g=f+20|0;c=k[g>>2]|0;e=k[b>>2]|0;h=c-e>>2;if(l>>>0<=h>>>0){if(l>>>0>>0?(j=e+(l<<2)|0,(c|0)!=(j|0)):0)k[g>>2]=c+(~((c+-4-j|0)>>>2)<<2)}else{Ud(b,l-h|0);f=k[i>>2]|0}e=f+4|0;f=f+8|0;b=k[f>>2]|0;g=k[e>>2]|0;c=b-g>>2;if(l>>>0<=c>>>0){if(l>>>0>>0?(o=g+(l<<2)|0,(b|0)!=(o|0)):0)k[f>>2]=b+(~((b+-4-o|0)>>>2)<<2)}else Ud(e,l-c|0);f=k[m>>2]|0;c=f+4|0;e=k[c>>2]|0;b=k[f>>2]|0;g=(e-b|0)/2832|0;if(n>>>0>g>>>0){je(f,n-g|0);o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}if(n>>>0>=g>>>0){o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}f=b+(n*2832|0)|0;if((e|0)==(f|0)){o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}k[c>>2]=e+(~(((e+-2832-f|0)>>>0)/2832|0)*2832|0);o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}function Xf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,l=0,m=0,n=0,o=0;k[a>>2]=b;k[a+4>>2]=c;p[a+8>>3]=d;k[a+16>>2]=0;i=a+20|0;k[i>>2]=f;m=a+24|0;k[m>>2]=g;k[a+28>>2]=c;k[a+32>>2]=0;k[a+36>>2]=0;k[a+64>>2]=0;l=((e|0)/(c|0)|0)+1|0;n=(l|0)>257?257:l;b=f+16|0;g=f+20|0;c=k[g>>2]|0;e=k[b>>2]|0;h=c-e>>2;if(l>>>0<=h>>>0){if(l>>>0>>0?(j=e+(l<<2)|0,(c|0)!=(j|0)):0)k[g>>2]=c+(~((c+-4-j|0)>>>2)<<2)}else{Ud(b,l-h|0);f=k[i>>2]|0}e=f+4|0;f=f+8|0;b=k[f>>2]|0;g=k[e>>2]|0;c=b-g>>2;if(l>>>0<=c>>>0){if(l>>>0>>0?(o=g+(l<<2)|0,(b|0)!=(o|0)):0)k[f>>2]=b+(~((b+-4-o|0)>>>2)<<2)}else Ud(e,l-c|0);f=k[m>>2]|0;c=f+4|0;e=k[c>>2]|0;b=k[f>>2]|0;g=(e-b|0)/2096|0;if(n>>>0>g>>>0){Td(f,n-g|0);o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}if(n>>>0>=g>>>0){o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}f=b+(n*2096|0)|0;if((e|0)==(f|0)){o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}k[c>>2]=e+(~(((e+-2096-f|0)>>>0)/2096|0)*2096|0);o=a+44|0;k[o>>2]=0;a=a+40|0;k[a>>2]=0;return}function Yf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0.0,j=0.0,l=0,m=0.0,n=0,q=0.0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=r;r=r+5696|0;A=I+32|0;z=I+16|0;B=I;E=a+32|0;c=k[E>>2]|0;C=a+4|0;d=k[C>>2]|0;if((c|0)<(d|0)){k[E>>2]=d;c=d}G=a+16|0;v=k[G>>2]|0;if(v){if((c|0)>0){x=a+24|0;n=k[x>>2]|0;y=a+36|0;s=k[y>>2]|0;g=k[n>>2]|0;d=g+(s*2832|0)|0;t=k[a>>2]|0;g=g+(s*2832|0)+(t<<2)|0;u=(t&1|0)==0;if(u){i=0.0;f=0}else{m=0.0;f=0;D=27}while(1){if((D|0)==27){D=0;e=k[d>>2]|0;j=+(e|0);if((e|0)<256)i=+o[4036+(e<<2)>>2];else i=+oh(j);d=d+4|0;i=m-j*i;f=e+f|0}if(d>>>0>=g>>>0)break;e=k[d>>2]|0;m=+(e|0);if((e|0)<256)j=+o[4036+(e<<2)>>2];else j=+oh(m);d=d+4|0;m=i-m*j;f=e+f|0;D=27}m=+(f|0);if(f){if((f|0)<256)j=+o[4036+(f<<2)>>2];else j=+oh(m);i=i+m*j}gi(A|0,0,2820)|0;gi(A+2832|0,0,2820)|0;q=i>2]|0;l=0;do{f=k[a+40+(l<<2)>>2]|0;g=A+(l*2832|0)|0;ki(g|0,e+(s*2832|0)|0,2832)|0;e=k[n>>2]|0;d=A+(l*2832|0)+2816|0;k[d>>2]=(k[d>>2]|0)+(k[e+(f*2832|0)+2816>>2]|0);d=0;do{h=A+(l*2832|0)+(d<<2)|0;k[h>>2]=(k[h>>2]|0)+(k[e+(f*2832|0)+(d<<2)>>2]|0);d=d+1|0}while((d|0)!=704);h=A+(l*2832|0)+(t<<2)|0;if(u){i=0.0;f=0}else{m=0.0;f=0;D=45}while(1){if((D|0)==45){D=0;d=k[g>>2]|0;j=+(d|0);if((d|0)<256)i=+o[4036+(d<<2)>>2];else i=+oh(j);g=g+4|0;i=m-j*i;f=d+f|0}if(g>>>0>=h>>>0)break;d=k[g>>2]|0;m=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(m);g=g+4|0;m=i-m*j;f=d+f|0;D=45}m=+(f|0);if(f){if((f|0)<256)j=+o[4036+(f<<2)>>2];else j=+oh(m);i=i+m*j}m=i>3]=m;p[B+(l<<3)>>3]=m-q-+p[a+48+(l<<3)>>3];l=l+1|0}while((l|0)!=2);g=a+20|0;f=k[g>>2]|0;i=+p[B>>3];if(((k[f>>2]|0)<256?(w=+p[a+8>>3],i>w):0)?+p[B+8>>3]>w:0){k[(k[f+16>>2]|0)+(v<<2)>>2]=c;k[(k[f+4>>2]|0)+(k[G>>2]<<2)>>2]=k[f>>2];B=a+40|0;k[a+44>>2]=k[B>>2];k[B>>2]=k[f>>2];B=a+48|0;p[a+56>>3]=+p[B>>3];p[B>>3]=q;k[G>>2]=(k[G>>2]|0)+1;k[f>>2]=(k[f>>2]|0)+1;k[y>>2]=(k[y>>2]|0)+1;k[E>>2]=0;k[a+64>>2]=0;k[a+28>>2]=k[C>>2]}else D=59;do if((D|0)==59){d=f+16|0;if(+p[B+8>>3]>2]|0)+(v<<2)>>2]=c;u=k[G>>2]|0;B=k[f+4>>2]|0;k[B+(u<<2)>>2]=k[B+(u+-2<<2)>>2];u=a+40|0;B=a+44|0;v=k[u>>2]|0;D=k[B>>2]|0;k[u>>2]=D;k[B>>2]=v;ki(e+(D*2832|0)|0,A+2832|0,2832)|0;D=a+48|0;p[a+56>>3]=+p[D>>3];p[D>>3]=+p[z+8>>3];k[G>>2]=(k[G>>2]|0)+1;k[E>>2]=0;gi((k[k[x>>2]>>2]|0)+((k[y>>2]|0)*2832|0)|0,0,2820)|0;k[a+64>>2]=0;k[a+28>>2]=k[C>>2];break}D=(k[d>>2]|0)+(v+-1<<2)|0;k[D>>2]=(k[D>>2]|0)+c;ki(e+((k[a+40>>2]|0)*2832|0)|0,A|0,2832)|0;i=+p[z>>3];p[a+48>>3]=i;if((k[k[g>>2]>>2]|0)==1)p[a+56>>3]=i;k[E>>2]=0;gi((k[k[x>>2]>>2]|0)+((k[y>>2]|0)*2832|0)|0,0,2820)|0;D=a+64|0;E=k[D>>2]|0;k[D>>2]=E+1;if((E|0)>0){E=a+28|0;k[E>>2]=(k[E>>2]|0)+(k[C>>2]|0)}}while(0)}}else{g=k[a+20>>2]|0;k[k[g+16>>2]>>2]=c;k[k[g+4>>2]>>2]=0;c=k[k[a+24>>2]>>2]|0;C=k[a>>2]|0;f=c+(C<<2)|0;if(!(C&1)){i=0.0;e=0}else{m=0.0;e=0;D=10}while(1){if((D|0)==10){d=k[c>>2]|0;j=+(d|0);if((d|0)<256)i=+o[4036+(d<<2)>>2];else i=+oh(j);c=c+4|0;i=m-j*i;e=d+e|0}if(c>>>0>=f>>>0)break;d=k[c>>2]|0;m=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(m);c=c+4|0;m=i-m*j;e=d+e|0;D=10}m=+(e|0);if(e){if((e|0)<256)j=+o[4036+(e<<2)>>2];else j=+oh(m);i=i+m*j}w=i>3]=w;p[a+56>>3]=w;k[G>>2]=(k[G>>2]|0)+1;k[g>>2]=(k[g>>2]|0)+1;D=a+36|0;k[D>>2]=(k[D>>2]|0)+1;k[E>>2]=0}if(!b){r=I;return}l=k[a+24>>2]|0;n=a+20|0;c=k[n>>2]|0;d=k[c>>2]|0;e=l+4|0;f=k[e>>2]|0;g=k[l>>2]|0;h=(f-g|0)/2832|0;if(d>>>0<=h>>>0){if(d>>>0>>0?(F=g+(d*2832|0)|0,(f|0)!=(F|0)):0)k[e>>2]=f+(~(((f+-2832-F|0)>>>0)/2832|0)*2832|0)}else{je(l,d-h|0);c=k[n>>2]|0}d=c+4|0;h=k[G>>2]|0;e=c+8|0;f=k[e>>2]|0;g=k[d>>2]|0;l=f-g>>2;if(h>>>0<=l>>>0){if(h>>>0>>0?(H=g+(h<<2)|0,(f|0)!=(H|0)):0)k[e>>2]=f+(~((f+-4-H|0)>>>2)<<2)}else{Ud(d,h-l|0);c=k[n>>2]|0;h=k[G>>2]|0}e=c+16|0;f=c+20|0;g=k[f>>2]|0;c=k[e>>2]|0;d=g-c>>2;if(h>>>0>d>>>0){Ud(e,h-d|0);r=I;return}if(h>>>0>=d>>>0){r=I;return}c=c+(h<<2)|0;if((g|0)==(c|0)){r=I;return}k[f>>2]=g+(~((g+-4-c|0)>>>2)<<2);r=I;return}function Zf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0.0,j=0.0,l=0,m=0.0,n=0,q=0.0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=r;r=r+2112|0;A=I+32|0;z=I+16|0;B=I;E=a+32|0;c=k[E>>2]|0;C=a+4|0;d=k[C>>2]|0;if((c|0)<(d|0)){k[E>>2]=d;c=d}G=a+16|0;v=k[G>>2]|0;if(v){if((c|0)>0){x=a+24|0;n=k[x>>2]|0;y=a+36|0;s=k[y>>2]|0;g=k[n>>2]|0;d=g+(s*1040|0)|0;t=k[a>>2]|0;g=g+(s*1040|0)+(t<<2)|0;u=(t&1|0)==0;if(u){i=0.0;f=0}else{m=0.0;f=0;D=27}while(1){if((D|0)==27){D=0;e=k[d>>2]|0;j=+(e|0);if((e|0)<256)i=+o[4036+(e<<2)>>2];else i=+oh(j);d=d+4|0;i=m-j*i;f=e+f|0}if(d>>>0>=g>>>0)break;e=k[d>>2]|0;m=+(e|0);if((e|0)<256)j=+o[4036+(e<<2)>>2];else j=+oh(m);d=d+4|0;m=i-m*j;f=e+f|0;D=27}m=+(f|0);if(f){if((f|0)<256)j=+o[4036+(f<<2)>>2];else j=+oh(m);i=i+m*j}gi(A|0,0,1028)|0;gi(A+1040|0,0,1028)|0;q=i>2]|0;l=0;do{f=k[a+40+(l<<2)>>2]|0;g=A+(l*1040|0)|0;ki(g|0,e+(s*1040|0)|0,1040)|0;e=k[n>>2]|0;d=A+(l*1040|0)+1024|0;k[d>>2]=(k[d>>2]|0)+(k[e+(f*1040|0)+1024>>2]|0);d=0;do{h=A+(l*1040|0)+(d<<2)|0;k[h>>2]=(k[h>>2]|0)+(k[e+(f*1040|0)+(d<<2)>>2]|0);d=d+1|0}while((d|0)!=256);h=A+(l*1040|0)+(t<<2)|0;if(u){i=0.0;f=0}else{m=0.0;f=0;D=45}while(1){if((D|0)==45){D=0;d=k[g>>2]|0;j=+(d|0);if((d|0)<256)i=+o[4036+(d<<2)>>2];else i=+oh(j);g=g+4|0;i=m-j*i;f=d+f|0}if(g>>>0>=h>>>0)break;d=k[g>>2]|0;m=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(m);g=g+4|0;m=i-m*j;f=d+f|0;D=45}m=+(f|0);if(f){if((f|0)<256)j=+o[4036+(f<<2)>>2];else j=+oh(m);i=i+m*j}m=i>3]=m;p[B+(l<<3)>>3]=m-q-+p[a+48+(l<<3)>>3];l=l+1|0}while((l|0)!=2);g=a+20|0;f=k[g>>2]|0;i=+p[B>>3];if(((k[f>>2]|0)<256?(w=+p[a+8>>3],i>w):0)?+p[B+8>>3]>w:0){k[(k[f+16>>2]|0)+(v<<2)>>2]=c;k[(k[f+4>>2]|0)+(k[G>>2]<<2)>>2]=k[f>>2];B=a+40|0;k[a+44>>2]=k[B>>2];k[B>>2]=k[f>>2];B=a+48|0;p[a+56>>3]=+p[B>>3];p[B>>3]=q;k[G>>2]=(k[G>>2]|0)+1;k[f>>2]=(k[f>>2]|0)+1;k[y>>2]=(k[y>>2]|0)+1;k[E>>2]=0;k[a+64>>2]=0;k[a+28>>2]=k[C>>2]}else D=59;do if((D|0)==59){d=f+16|0;if(+p[B+8>>3]>2]|0)+(v<<2)>>2]=c;u=k[G>>2]|0;B=k[f+4>>2]|0;k[B+(u<<2)>>2]=k[B+(u+-2<<2)>>2];u=a+40|0;B=a+44|0;v=k[u>>2]|0;D=k[B>>2]|0;k[u>>2]=D;k[B>>2]=v;ki(e+(D*1040|0)|0,A+1040|0,1040)|0;D=a+48|0;p[a+56>>3]=+p[D>>3];p[D>>3]=+p[z+8>>3];k[G>>2]=(k[G>>2]|0)+1;k[E>>2]=0;gi((k[k[x>>2]>>2]|0)+((k[y>>2]|0)*1040|0)|0,0,1028)|0;k[a+64>>2]=0;k[a+28>>2]=k[C>>2];break}D=(k[d>>2]|0)+(v+-1<<2)|0;k[D>>2]=(k[D>>2]|0)+c;ki(e+((k[a+40>>2]|0)*1040|0)|0,A|0,1040)|0;i=+p[z>>3];p[a+48>>3]=i;if((k[k[g>>2]>>2]|0)==1)p[a+56>>3]=i;k[E>>2]=0;gi((k[k[x>>2]>>2]|0)+((k[y>>2]|0)*1040|0)|0,0,1028)|0;D=a+64|0;E=k[D>>2]|0;k[D>>2]=E+1;if((E|0)>0){E=a+28|0;k[E>>2]=(k[E>>2]|0)+(k[C>>2]|0)}}while(0)}}else{g=k[a+20>>2]|0;k[k[g+16>>2]>>2]=c;k[k[g+4>>2]>>2]=0;c=k[k[a+24>>2]>>2]|0;C=k[a>>2]|0;f=c+(C<<2)|0;if(!(C&1)){i=0.0;e=0}else{m=0.0;e=0;D=10}while(1){if((D|0)==10){d=k[c>>2]|0;j=+(d|0);if((d|0)<256)i=+o[4036+(d<<2)>>2];else i=+oh(j);c=c+4|0;i=m-j*i;e=d+e|0}if(c>>>0>=f>>>0)break;d=k[c>>2]|0;m=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(m);c=c+4|0;m=i-m*j;e=d+e|0;D=10}m=+(e|0);if(e){if((e|0)<256)j=+o[4036+(e<<2)>>2];else j=+oh(m);i=i+m*j}w=i>3]=w;p[a+56>>3]=w;k[G>>2]=(k[G>>2]|0)+1;k[g>>2]=(k[g>>2]|0)+1;D=a+36|0;k[D>>2]=(k[D>>2]|0)+1;k[E>>2]=0}if(!b){r=I;return}l=k[a+24>>2]|0;n=a+20|0;c=k[n>>2]|0;d=k[c>>2]|0;e=l+4|0;f=k[e>>2]|0;g=k[l>>2]|0;h=(f-g|0)/1040|0;if(d>>>0<=h>>>0){if(d>>>0>>0?(F=g+(d*1040|0)|0,(f|0)!=(F|0)):0)k[e>>2]=f+(~(((f+-1040-F|0)>>>0)/1040|0)*1040|0)}else{we(l,d-h|0);c=k[n>>2]|0}d=c+4|0;h=k[G>>2]|0;e=c+8|0;f=k[e>>2]|0;g=k[d>>2]|0;l=f-g>>2;if(h>>>0<=l>>>0){if(h>>>0>>0?(H=g+(h<<2)|0,(f|0)!=(H|0)):0)k[e>>2]=f+(~((f+-4-H|0)>>>2)<<2)}else{Ud(d,h-l|0);c=k[n>>2]|0;h=k[G>>2]|0}e=c+16|0;f=c+20|0;g=k[f>>2]|0;c=k[e>>2]|0;d=g-c>>2;if(h>>>0>d>>>0){Ud(e,h-d|0);r=I;return}if(h>>>0>=d>>>0){r=I;return}c=c+(h<<2)|0;if((g|0)==(c|0)){r=I;return}k[f>>2]=g+(~((g+-4-c|0)>>>2)<<2);r=I;return}function _f(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0.0,j=0.0,l=0,m=0.0,n=0,q=0.0,s=0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;I=r;r=r+4224|0;A=I+32|0;z=I+16|0;B=I;E=a+32|0;c=k[E>>2]|0;C=a+4|0;d=k[C>>2]|0;if((c|0)<(d|0)){k[E>>2]=d;c=d}G=a+16|0;v=k[G>>2]|0;if(v){if((c|0)>0){x=a+24|0;n=k[x>>2]|0;y=a+36|0;s=k[y>>2]|0;g=k[n>>2]|0;d=g+(s*2096|0)|0;t=k[a>>2]|0;g=g+(s*2096|0)+(t<<2)|0;u=(t&1|0)==0;if(u){i=0.0;f=0}else{m=0.0;f=0;D=27}while(1){if((D|0)==27){D=0;e=k[d>>2]|0;j=+(e|0);if((e|0)<256)i=+o[4036+(e<<2)>>2];else i=+oh(j);d=d+4|0;i=m-j*i;f=e+f|0}if(d>>>0>=g>>>0)break;e=k[d>>2]|0;m=+(e|0);if((e|0)<256)j=+o[4036+(e<<2)>>2];else j=+oh(m);d=d+4|0;m=i-m*j;f=e+f|0;D=27}m=+(f|0);if(f){if((f|0)<256)j=+o[4036+(f<<2)>>2];else j=+oh(m);i=i+m*j}gi(A|0,0,2084)|0;gi(A+2096|0,0,2084)|0;q=i>2]|0;l=0;do{f=k[a+40+(l<<2)>>2]|0;g=A+(l*2096|0)|0;ki(g|0,e+(s*2096|0)|0,2096)|0;e=k[n>>2]|0;d=A+(l*2096|0)+2080|0;k[d>>2]=(k[d>>2]|0)+(k[e+(f*2096|0)+2080>>2]|0);d=0;do{h=A+(l*2096|0)+(d<<2)|0;k[h>>2]=(k[h>>2]|0)+(k[e+(f*2096|0)+(d<<2)>>2]|0);d=d+1|0}while((d|0)!=520);h=A+(l*2096|0)+(t<<2)|0;if(u){i=0.0;f=0}else{m=0.0;f=0;D=45}while(1){if((D|0)==45){D=0;d=k[g>>2]|0;j=+(d|0);if((d|0)<256)i=+o[4036+(d<<2)>>2];else i=+oh(j);g=g+4|0;i=m-j*i;f=d+f|0}if(g>>>0>=h>>>0)break;d=k[g>>2]|0;m=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(m);g=g+4|0;m=i-m*j;f=d+f|0;D=45}m=+(f|0);if(f){if((f|0)<256)j=+o[4036+(f<<2)>>2];else j=+oh(m);i=i+m*j}m=i>3]=m;p[B+(l<<3)>>3]=m-q-+p[a+48+(l<<3)>>3];l=l+1|0}while((l|0)!=2);g=a+20|0;f=k[g>>2]|0;i=+p[B>>3];if(((k[f>>2]|0)<256?(w=+p[a+8>>3],i>w):0)?+p[B+8>>3]>w:0){k[(k[f+16>>2]|0)+(v<<2)>>2]=c;k[(k[f+4>>2]|0)+(k[G>>2]<<2)>>2]=k[f>>2];B=a+40|0;k[a+44>>2]=k[B>>2];k[B>>2]=k[f>>2];B=a+48|0;p[a+56>>3]=+p[B>>3];p[B>>3]=q;k[G>>2]=(k[G>>2]|0)+1;k[f>>2]=(k[f>>2]|0)+1;k[y>>2]=(k[y>>2]|0)+1;k[E>>2]=0;k[a+64>>2]=0;k[a+28>>2]=k[C>>2]}else D=59;do if((D|0)==59){d=f+16|0;if(+p[B+8>>3]>2]|0)+(v<<2)>>2]=c;u=k[G>>2]|0;B=k[f+4>>2]|0;k[B+(u<<2)>>2]=k[B+(u+-2<<2)>>2];u=a+40|0;B=a+44|0;v=k[u>>2]|0;D=k[B>>2]|0;k[u>>2]=D;k[B>>2]=v;ki(e+(D*2096|0)|0,A+2096|0,2096)|0;D=a+48|0;p[a+56>>3]=+p[D>>3];p[D>>3]=+p[z+8>>3];k[G>>2]=(k[G>>2]|0)+1;k[E>>2]=0;gi((k[k[x>>2]>>2]|0)+((k[y>>2]|0)*2096|0)|0,0,2084)|0;k[a+64>>2]=0;k[a+28>>2]=k[C>>2];break}D=(k[d>>2]|0)+(v+-1<<2)|0;k[D>>2]=(k[D>>2]|0)+c;ki(e+((k[a+40>>2]|0)*2096|0)|0,A|0,2096)|0;i=+p[z>>3];p[a+48>>3]=i;if((k[k[g>>2]>>2]|0)==1)p[a+56>>3]=i;k[E>>2]=0;gi((k[k[x>>2]>>2]|0)+((k[y>>2]|0)*2096|0)|0,0,2084)|0;D=a+64|0;E=k[D>>2]|0;k[D>>2]=E+1;if((E|0)>0){E=a+28|0;k[E>>2]=(k[E>>2]|0)+(k[C>>2]|0)}}while(0)}}else{g=k[a+20>>2]|0;k[k[g+16>>2]>>2]=c;k[k[g+4>>2]>>2]=0;c=k[k[a+24>>2]>>2]|0;C=k[a>>2]|0;f=c+(C<<2)|0;if(!(C&1)){i=0.0;e=0}else{m=0.0;e=0;D=10}while(1){if((D|0)==10){d=k[c>>2]|0;j=+(d|0);if((d|0)<256)i=+o[4036+(d<<2)>>2];else i=+oh(j);c=c+4|0;i=m-j*i;e=d+e|0}if(c>>>0>=f>>>0)break;d=k[c>>2]|0;m=+(d|0);if((d|0)<256)j=+o[4036+(d<<2)>>2];else j=+oh(m);c=c+4|0;m=i-m*j;e=d+e|0;D=10}m=+(e|0);if(e){if((e|0)<256)j=+o[4036+(e<<2)>>2];else j=+oh(m);i=i+m*j}w=i>3]=w;p[a+56>>3]=w;k[G>>2]=(k[G>>2]|0)+1;k[g>>2]=(k[g>>2]|0)+1;D=a+36|0;k[D>>2]=(k[D>>2]|0)+1;k[E>>2]=0}if(!b){r=I;return}l=k[a+24>>2]|0;n=a+20|0;c=k[n>>2]|0;d=k[c>>2]|0;e=l+4|0;f=k[e>>2]|0;g=k[l>>2]|0;h=(f-g|0)/2096|0;if(d>>>0<=h>>>0){if(d>>>0>>0?(F=g+(d*2096|0)|0,(f|0)!=(F|0)):0)k[e>>2]=f+(~(((f+-2096-F|0)>>>0)/2096|0)*2096|0)}else{Td(l,d-h|0);c=k[n>>2]|0}d=c+4|0;h=k[G>>2]|0;e=c+8|0;f=k[e>>2]|0;g=k[d>>2]|0;l=f-g>>2;if(h>>>0<=l>>>0){if(h>>>0>>0?(H=g+(h<<2)|0,(f|0)!=(H|0)):0)k[e>>2]=f+(~((f+-4-H|0)>>>2)<<2)}else{Ud(d,h-l|0);c=k[n>>2]|0;h=k[G>>2]|0}e=c+16|0;f=c+20|0;g=k[f>>2]|0;c=k[e>>2]|0;d=g-c>>2;if(h>>>0>d>>>0){Ud(e,h-d|0);r=I;return}if(h>>>0>=d>>>0){r=I;return}c=c+(h<<2)|0;if((g|0)==(c|0)){r=I;return}k[f>>2]=g+(~((g+-4-c|0)>>>2)<<2);r=I;return}function $f(a,b,c){a=a|0;b=b|0;c=c|0;k[a>>2]=5068;k[a+4>>2]=b;k[a+8>>2]=c;k[a+12>>2]=0;return}function ag(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+12|0;e=k[d>>2]|0;if((e+c|0)>>>0>(k[a+8>>2]|0)>>>0){a=0;return a|0}ki((k[a+4>>2]|0)+e|0,b|0,c|0)|0;k[d>>2]=(k[d>>2]|0)+c;a=1;return a|0}function bg(a,b,c){a=a|0;b=b|0;c=c|0;k[a>>2]=5088;k[a+4>>2]=b;k[a+8>>2]=c;k[a+12>>2]=0;return}function cg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=a+12|0;e=k[d>>2]|0;f=k[a+8>>2]|0;if((f|0)==(e|0)){a=0;return a|0}f=f-e|0;b=f>>>0>>0?f:b;a=(k[a+4>>2]|0)+e|0;k[d>>2]=b+e;k[c>>2]=b;return a|0}function dg(a){a=a|0;return}function eg(a){a=a|0;rg(a);return}function fg(a){a=a|0;return}function gg(a){a=a|0;rg(a);return}function hg(a){a=a|0;return lh(k[a+4>>2]|0)|0}function ig(a){a=a|0;La(560,319200);Xa(568,319205,1,1,0);Ja(576,319210,1,-128,127);Ja(592,319215,1,-128,127);Ja(584,319227,1,0,255);Ja(600,319241,2,-32768,32767);Ja(608,319247,2,0,65535);Ja(616,319262,4,-2147483648,2147483647);Ja(624,319266,4,0,-1);Ja(632,319279,4,-2147483648,2147483647);Ja(640,319284,4,0,-1);kb(648,319298,4);kb(656,319304,8);Jb(264,319311);Jb(288,319323);Gb(312,4,319356);db(336,319369);Ca(344,0,319385);Ca(352,0,319415);Ca(360,1,319452);Ca(368,2,319491);Ca(376,3,319522);Ca(384,4,319562);Ca(392,5,319591);Ca(400,4,319629);Ca(408,5,319659);Ca(352,0,319698);Ca(360,1,319730);Ca(368,2,319763);Ca(376,3,319796);Ca(384,4,319830);Ca(392,5,319863);Ca(416,6,319897);Ca(424,7,319928);Ca(432,7,319960);return}function jg(){ig(0);return}function kg(a,b){a=a|0;b=b|0;var c=0;c=r;r=r+16|0;k[c>>2]=b;b=k[1343]|0;vh(b,a,c)|0;yh(10,b)|0;Fa()}function lg(a){a=a|0;Ka(320896,320925,1164,321012)}function mg(a){a=a|0;Ka(321033,321056,303,321012)}function ng(){var a=0,b=0;a=r;r=r+16|0;if(!(jb(5320,2)|0)){b=bb(k[1329]|0)|0;r=a;return b|0}else kg(321143,a);return 0}function og(a){a=a|0;var b=0;b=(a|0)==0?1:a;a=Oh(b)|0;a:do if(!a){while(1){a=yg()|0;if(!a)break;Wb[a&3]();a=Oh(b)|0;if(a)break a}b=Va(4)|0;k[b>>2]=5112;xb(b|0,448,5)}while(0);return a|0}function pg(a,b){a=a|0;b=b|0;return og(a)|0}function qg(a){a=a|0;return og(a)|0}function rg(a){a=a|0;Ph(a);return}function sg(a){a=a|0;rg(a);return}function tg(a){a=a|0;return}function ug(a){a=a|0;rg(a);return}function vg(a){a=a|0;return 321192}function wg(a){a=a|0;var b=0;b=r;r=r+16|0;Wb[a&3]();kg(321207,b)}function xg(){var a=0,b=0;a=ng()|0;if(((a|0)!=0?(b=k[a>>2]|0,(b|0)!=0):0)?(a=b+48|0,(k[a>>2]&-256|0)==1126902528?(k[a+4>>2]|0)==1129074247:0):0)wg(k[b+12>>2]|0);b=k[1275]|0;k[1275]=b+0;wg(b)}function yg(){var a=0;a=k[1281]|0;k[1281]=a+0;return a|0}function zg(a){a=a|0;return}function Ag(a){a=a|0;k[a>>2]=5136;eh(a+4|0);return}function Bg(a){a=a|0;Ag(a);rg(a);return}function Cg(a){a=a|0;return k[a+4>>2]|0}function Dg(a){a=a|0;Ag(a);rg(a);return}function Eg(a){a=a|0;return}function Fg(a){a=a|0;return}function Gg(a){a=a|0;return}function Hg(a){a=a|0;return}function Ig(a){a=a|0;rg(a);return}function Jg(a){a=a|0;rg(a);return}function Kg(a){a=a|0;rg(a);return}function Lg(a){a=a|0;rg(a);return}function Mg(a,b,c){a=a|0;b=b|0;c=c|0;return (a|0)==(b|0)|0}function Ng(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=r;r=r+64|0;f=g;if((a|0)!=(b|0))if((b|0)!=0?(e=Tg(b,512,528,0)|0,(e|0)!=0):0){b=f;d=b+56|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(d|0));k[f>>2]=e;k[f+8>>2]=a;k[f+12>>2]=-1;k[f+48>>2]=1;_b[k[(k[e>>2]|0)+28>>2]&3](e,f,k[c>>2]|0,1);if((k[f+24>>2]|0)==1){k[c>>2]=k[f+16>>2];b=1}else b=0}else b=0;else b=1;r=g;return b|0}function Og(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;a=b+16|0;e=k[a>>2]|0;do if(e){if((e|0)!=(c|0)){d=b+36|0;k[d>>2]=(k[d>>2]|0)+1;k[b+24>>2]=2;i[b+54>>0]=1;break}a=b+24|0;if((k[a>>2]|0)==2)k[a>>2]=d}else{k[a>>2]=c;k[b+24>>2]=d;k[b+36>>2]=1}while(0);return}function Pg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))Og(0,b,c,d);return}function Qg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))Og(0,b,c,d);else{a=k[a+8>>2]|0;_b[k[(k[a>>2]|0)+28>>2]&3](a,b,c,d)}return}function Rg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=k[a+4>>2]|0;e=f>>8;if(f&1)e=k[(k[c>>2]|0)+e>>2]|0;a=k[a>>2]|0;_b[k[(k[a>>2]|0)+28>>2]&3](a,b,c+e|0,(f&2|0)!=0?d:2);return}function Sg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if((a|0)!=(k[b+8>>2]|0)){f=k[a+12>>2]|0;e=a+16+(f<<3)|0;Rg(a+16|0,b,c,d);if((f|0)>1){f=b+54|0;a=a+24|0;do{Rg(a,b,c,d);if(i[f>>0]|0)break a;a=a+8|0}while(a>>>0>>0)}}else Og(0,b,c,d);while(0);return}function Tg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+64|0;p=q;o=k[a>>2]|0;n=a+(k[o+-8>>2]|0)|0;o=k[o+-4>>2]|0;k[p>>2]=c;k[p+4>>2]=a;k[p+8>>2]=b;k[p+12>>2]=d;d=p+16|0;a=p+20|0;b=p+24|0;e=p+28|0;f=p+32|0;g=p+40|0;h=(o|0)==(c|0);l=d;m=l+36|0;do{k[l>>2]=0;l=l+4|0}while((l|0)<(m|0));j[d+36>>1]=0;i[d+38>>0]=0;a:do if(h){k[p+48>>2]=1;Yb[k[(k[c>>2]|0)+20>>2]&3](c,p,n,n,1,0);d=(k[b>>2]|0)==1?n:0}else{Qb[k[(k[o>>2]|0)+24>>2]&3](o,p,n,1,0);switch(k[p+36>>2]|0){case 0:{d=(k[g>>2]|0)==1&(k[e>>2]|0)==1&(k[f>>2]|0)==1?k[a>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((k[b>>2]|0)!=1?!((k[g>>2]|0)==0&(k[e>>2]|0)==1&(k[f>>2]|0)==1):0){d=0;break}d=k[d>>2]|0}while(0);r=q;return d|0}function Ug(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;i[b+53>>0]=1;do if((k[b+4>>2]|0)==(d|0)){i[b+52>>0]=1;d=b+16|0;a=k[d>>2]|0;if(!a){k[d>>2]=c;k[b+24>>2]=e;k[b+36>>2]=1;if(!((e|0)==1?(k[b+48>>2]|0)==1:0))break;i[b+54>>0]=1;break}if((a|0)!=(c|0)){e=b+36|0;k[e>>2]=(k[e>>2]|0)+1;i[b+54>>0]=1;break}a=b+24|0;d=k[a>>2]|0;if((d|0)==2){k[a>>2]=e;d=e}if((d|0)==1?(k[b+48>>2]|0)==1:0)i[b+54>>0]=1}while(0);return}function Vg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;a:do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(f=b+28|0,(k[f>>2]|0)!=1):0)k[f>>2]=d}else{if((a|0)!=(k[b>>2]|0)){q=k[a+12>>2]|0;h=a+16+(q<<3)|0;Xg(a+16|0,b,c,d,e);f=a+24|0;if((q|0)<=1)break;g=k[a+8>>2]|0;if((g&2|0)==0?(j=b+36|0,(k[j>>2]|0)!=1):0){if(!(g&1)){g=b+54|0;while(1){if(i[g>>0]|0)break a;if((k[j>>2]|0)==1)break a;Xg(f,b,c,d,e);f=f+8|0;if(f>>>0>=h>>>0)break a}}g=b+24|0;a=b+54|0;while(1){if(i[a>>0]|0)break a;if((k[j>>2]|0)==1?(k[g>>2]|0)==1:0)break a;Xg(f,b,c,d,e);f=f+8|0;if(f>>>0>=h>>>0)break a}}g=b+54|0;while(1){if(i[g>>0]|0)break a;Xg(f,b,c,d,e);f=f+8|0;if(f>>>0>=h>>>0)break a}}if((k[b+16>>2]|0)!=(c|0)?(p=b+20|0,(k[p>>2]|0)!=(c|0)):0){k[b+32>>2]=d;m=b+44|0;if((k[m>>2]|0)==4)break;g=k[a+12>>2]|0;h=a+16+(g<<3)|0;j=b+52|0;d=b+53|0;n=b+54|0;l=a+8|0;o=b+24|0;b:do if((g|0)>0){g=0;f=0;a=a+16|0;while(1){i[j>>0]=0;i[d>>0]=0;Wg(a,b,c,c,1,e);if(i[n>>0]|0){q=20;break b}do if(i[d>>0]|0){if(!(i[j>>0]|0))if(!(k[l>>2]&1)){f=1;q=20;break b}else{f=1;break}if((k[o>>2]|0)==1)break b;if(!(k[l>>2]&2))break b;else{g=1;f=1}}while(0);a=a+8|0;if(a>>>0>=h>>>0){q=20;break}}}else{g=0;f=0;q=20}while(0);do if((q|0)==20){if((!g?(k[p>>2]=c,c=b+40|0,k[c>>2]=(k[c>>2]|0)+1,(k[b+36>>2]|0)==1):0)?(k[o>>2]|0)==2:0){i[n>>0]=1;if(f)break}else q=24;if((q|0)==24?f:0)break;k[m>>2]=4;break a}while(0);k[m>>2]=3;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function Wg(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;h=k[a+4>>2]|0;g=h>>8;if(h&1)g=k[(k[d>>2]|0)+g>>2]|0;a=k[a>>2]|0;Yb[k[(k[a>>2]|0)+20>>2]&3](a,b,c,d+g|0,(h&2|0)!=0?e:2,f);return}function Xg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=k[a+4>>2]|0;f=g>>8;if(g&1)f=k[(k[c>>2]|0)+f>>2]|0;a=k[a>>2]|0;Qb[k[(k[a>>2]|0)+24>>2]&3](a,b,c+f|0,(g&2|0)!=0?d:2,e);return}function Yg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;a:do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(f=b+28|0,(k[f>>2]|0)!=1):0)k[f>>2]=d}else{if((a|0)!=(k[b>>2]|0)){h=k[a+8>>2]|0;Qb[k[(k[h>>2]|0)+24>>2]&3](h,b,c,d,e);break}if((k[b+16>>2]|0)!=(c|0)?(g=b+20|0,(k[g>>2]|0)!=(c|0)):0){k[b+32>>2]=d;d=b+44|0;if((k[d>>2]|0)==4)break;f=b+52|0;i[f>>0]=0;j=b+53|0;i[j>>0]=0;a=k[a+8>>2]|0;Yb[k[(k[a>>2]|0)+20>>2]&3](a,b,c,c,1,e);if(i[j>>0]|0){if(!(i[f>>0]|0)){f=1;h=13}}else{f=0;h=13}do if((h|0)==13){k[g>>2]=c;j=b+40|0;k[j>>2]=(k[j>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0){i[b+54>>0]=1;if(f)break}else h=16;if((h|0)==16?f:0)break;k[d>>2]=4;break a}while(0);k[d>>2]=3;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function Zg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(g=b+28|0,(k[g>>2]|0)!=1):0)k[g>>2]=d}else if((a|0)==(k[b>>2]|0)){if((k[b+16>>2]|0)!=(c|0)?(f=b+20|0,(k[f>>2]|0)!=(c|0)):0){k[b+32>>2]=d;k[f>>2]=c;e=b+40|0;k[e>>2]=(k[e>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0)i[b+54>>0]=1;k[b+44>>2]=4;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function _g(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0;if((a|0)==(k[b+8>>2]|0))Ug(0,b,c,d,e);else{m=b+52|0;n=i[m>>0]|0;o=b+53|0;p=i[o>>0]|0;l=k[a+12>>2]|0;g=a+16+(l<<3)|0;i[m>>0]=0;i[o>>0]=0;Wg(a+16|0,b,c,d,e,f);a:do if((l|0)>1){h=b+24|0;j=a+8|0;l=b+54|0;a=a+24|0;do{if(i[l>>0]|0)break a;if(!(i[m>>0]|0)){if((i[o>>0]|0)!=0?(k[j>>2]&1|0)==0:0)break a}else{if((k[h>>2]|0)==1)break a;if(!(k[j>>2]&2))break a}i[m>>0]=0;i[o>>0]=0;Wg(a,b,c,d,e,f);a=a+8|0}while(a>>>0>>0)}while(0);i[m>>0]=n;i[o>>0]=p}return}function $g(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))Ug(0,b,c,d,e);else{a=k[a+8>>2]|0;Yb[k[(k[a>>2]|0)+20>>2]&3](a,b,c,d,e,f)}return}function ah(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))Ug(0,b,c,d,e);return}function bh(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=r;r=r+48|0;g=e+32|0;c=e+24|0;h=e+16|0;f=e;e=e+36|0;a=ng()|0;if((a|0)!=0?(d=k[a>>2]|0,(d|0)!=0):0){a=d+48|0;b=k[a>>2]|0;a=k[a+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){k[c>>2]=k[1331];kg(321436,c)}if((b|0)==1126902529&(a|0)==1129074247)a=k[d+44>>2]|0;else a=d+80|0;k[e>>2]=a;d=k[d>>2]|0;a=k[d+4>>2]|0;if(Pb[k[(k[464>>2]|0)+16>>2]&15](464,d,e)|0){h=k[e>>2]|0;e=k[1331]|0;h=Ub[k[(k[h>>2]|0)+8>>2]&7](h)|0;k[f>>2]=e;k[f+4>>2]=a;k[f+8>>2]=h;kg(321350,f)}else{k[h>>2]=k[1331];k[h+4>>2]=a;kg(321395,h)}}kg(321474,g)}function ch(){var a=0;a=r;r=r+16|0;if(!(mb(5316,17)|0)){r=a;return}else kg(321247,a)}function dh(a){a=a|0;ab(a|0)|0;xg()}function eh(a){a=a|0;var b=0,c=0;c=(k[a>>2]|0)+-4|0;b=k[c>>2]|0;k[c>>2]=b+-1;if((b+-1|0)<0)rg((k[a>>2]|0)+-12|0);return}function fh(a){a=a|0;var b=0;b=r;r=r+16|0;Ph(a);if(!(ub(k[1329]|0,0)|0)){r=b;return}else kg(321297,b)}function gh(){var a=0;if(!(k[1332]|0))a=5380;else{a=(gb()|0)+60|0;a=k[a>>2]|0}return a|0}function hh(a){a=a|0;var b=0,c=0;b=0;while(1){if((l[321495+b>>0]|0)==(a|0)){c=2;break}b=b+1|0;if((b|0)==87){b=87;a=321583;c=5;break}}if((c|0)==2)if(!b)a=321583;else{a=321583;c=5}if((c|0)==5)while(1){c=a;while(1){a=c+1|0;if(!(i[c>>0]|0))break;else c=a}b=b+-1|0;if(!b)break;else c=5}return a|0}function ih(a){a=a|0;var b=0;if(a>>>0>4294963200){b=gh()|0;k[b>>2]=0-a;a=-1}return a|0}function jh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;f=b&255;d=(c|0)!=0;a:do if(d&(a&3|0)!=0){e=b&255;while(1){if((i[a>>0]|0)==e<<24>>24){g=6;break a}a=a+1|0;c=c+-1|0;d=(c|0)!=0;if(!(d&(a&3|0)!=0)){g=5;break}}}else g=5;while(0);if((g|0)==5)if(d)g=6;else c=0;b:do if((g|0)==6){e=b&255;if((i[a>>0]|0)!=e<<24>>24){d=ha(f,16843009)|0;c:do if(c>>>0>3)while(1){f=k[a>>2]^d;if((f&-2139062144^-2139062144)&f+-16843009)break;a=a+4|0;c=c+-4|0;if(c>>>0<=3){g=11;break c}}else g=11;while(0);if((g|0)==11)if(!c){c=0;break}while(1){if((i[a>>0]|0)==e<<24>>24)break b;a=a+1|0;c=c+-1|0;if(!c){c=0;break}}}}while(0);return ((c|0)!=0?a:0)|0}function kh(a){a=a|0;var b=0,c=0,d=0;d=a;a:do if(!(d&3))c=4;else{b=a;a=d;while(1){if(!(i[b>>0]|0))break a;b=b+1|0;a=b;if(!(a&3)){a=b;c=4;break}}}while(0);if((c|0)==4){while(1){b=k[a>>2]|0;if(!((b&-2139062144^-2139062144)&b+-16843009))a=a+4|0;else break}if((b&255)<<24>>24)do a=a+1|0;while((i[a>>0]|0)!=0)}return a-d|0}function lh(a){a=a|0;var b=0,c=0;c=(kh(a)|0)+1|0;b=Oh(c)|0;if(!b)b=0;else ki(b|0,a|0,c|0)|0;return b|0}function mh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a:do if(!c)c=0;else{e=c;d=a;while(1){a=i[d>>0]|0;c=i[b>>0]|0;if(a<<24>>24!=c<<24>>24)break;e=e+-1|0;if(!e){c=0;break a}else{d=d+1|0;b=b+1|0}}c=(a&255)-(c&255)|0}while(0);return c|0}function nh(a,b){a=+a;b=b|0;var c=0,d=0,e=0;p[t>>3]=a;c=k[t>>2]|0;d=k[t+4>>2]|0;e=ji(c|0,d|0,52)|0;e=e&2047;switch(e|0){case 0:{if(a!=0.0){a=+nh(a*18446744073709551616.0,b);c=(k[b>>2]|0)+-64|0}else c=0;k[b>>2]=c;break}case 2047:break;default:{k[b>>2]=e+-1022;k[t>>2]=c;k[t+4>>2]=d&-2146435073|1071644672;a=+p[t>>3]}}return +a}function oh(a){a=+a;var b=0,c=0,d=0,e=0,f=0.0,g=0.0,h=0.0,i=0.0,j=0.0;p[t>>3]=a;c=k[t>>2]|0;b=k[t+4>>2]|0;d=(b|0)<0;do if(d|b>>>0<1048576){if((c|0)==0&(b&2147483647|0)==0){a=-1.0/(a*a);break}if(d){a=(a-a)/0.0;break}else{p[t>>3]=a*18014398509481984.0;b=k[t+4>>2]|0;d=k[t>>2]|0;c=-1077;e=9;break}}else if(b>>>0<=2146435071)if((c|0)==0&0==0&(b|0)==1072693248)a=0.0;else{d=c;c=-1023;e=9}while(0);if((e|0)==9){e=b+614242|0;k[t>>2]=d;k[t+4>>2]=(e&1048575)+1072079006;i=+p[t>>3]+-1.0;a=i*(i*.5);j=i/(i+2.0);g=j*j;h=g*g;p[t>>3]=i-a;d=k[t+4>>2]|0;k[t>>2]=0;k[t+4>>2]=d;f=+p[t>>3];a=j*(a+(h*(h*(h*.15313837699209373+.22222198432149784)+.3999999999940942)+g*(h*(h*(h*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)))+(i-f-a);i=f*1.4426950407214463;h=+(c+(e>>>20)|0);g=h+i;a=g+(i+(h-g)+(a*1.4426950407214463+(f+a)*1.6751713164886512e-10))}return +a}function ph(a,b){a=+a;b=b|0;return +(+nh(a,b))}function qh(a){a=a|0;a=a&65535;return (a<<8|a>>>8)&65535|0}function rh(a){a=a|0;return mi(a|0)|0}function sh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+80|0;d=e;k[a+36>>2]=5;if((k[a>>2]&64|0)==0?(k[d>>2]=k[a+60>>2],k[d+4>>2]=21505,k[d+8>>2]=e+12,(Ba(54,d|0)|0)!=0):0)i[a+75>>0]=-1;d=Bh(a,b,c)|0;r=e;return d|0}function th(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=r;r=r+32|0;f=e;d=e+20|0;k[f>>2]=k[a+60>>2];k[f+4>>2]=0;k[f+8>>2]=b;k[f+12>>2]=d;k[f+16>>2]=c;if((ih(Hb(140,f|0)|0)|0)<0){k[d>>2]=-1;a=-1}else a=k[d>>2]|0;r=e;return a|0}function uh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+16|0;h=j;g=b&255;i[h>>0]=g;d=a+16|0;e=k[d>>2]|0;if(!e)if(!(Ah(a)|0)){e=k[d>>2]|0;f=4}else c=-1;else f=4;do if((f|0)==4){d=a+20|0;f=k[d>>2]|0;if(f>>>0>>0?(c=b&255,(c|0)!=(i[a+75>>0]|0)):0){k[d>>2]=f+1;i[f>>0]=g;break}if((Pb[k[a+36>>2]&15](a,h,1)|0)==1)c=l[h>>0]|0;else c=-1}while(0);r=j;return c|0}function vh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+224|0;n=s+80|0;q=s+96|0;p=s;o=s+136|0;d=q;e=d+40|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[n>>2]=k[c>>2];if((Ih(0,b,n,p,q)|0)<0)c=-1;else{if((k[a+76>>2]|0)>-1)l=wh(a)|0;else l=0;c=k[a>>2]|0;m=c&32;if((i[a+74>>0]|0)<1)k[a>>2]=c&-33;c=a+48|0;if(!(k[c>>2]|0)){e=a+44|0;f=k[e>>2]|0;k[e>>2]=o;g=a+28|0;k[g>>2]=o;h=a+20|0;k[h>>2]=o;k[c>>2]=80;j=a+16|0;k[j>>2]=o+80;d=Ih(a,b,n,p,q)|0;if(f){Pb[k[a+36>>2]&15](a,0,0)|0;d=(k[h>>2]|0)==0?-1:d;k[e>>2]=f;k[c>>2]=0;k[j>>2]=0;k[g>>2]=0;k[h>>2]=0}}else d=Ih(a,b,n,p,q)|0;c=k[a>>2]|0;k[a>>2]=c|m;if(l)xh(a);c=(c&32|0)==0?d:-1}r=s;return c|0}function wh(a){a=a|0;return 0}function xh(a){a=a|0;return}function yh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;if((k[b+76>>2]|0)>=0?(wh(b)|0)!=0:0){if((i[b+75>>0]|0)!=(a|0)?(d=b+20|0,e=k[d>>2]|0,e>>>0<(k[b+16>>2]|0)>>>0):0){k[d>>2]=e+1;i[e>>0]=a;c=a&255}else c=uh(b,a)|0;xh(b)}else g=3;do if((g|0)==3){if((i[b+75>>0]|0)!=(a|0)?(f=b+20|0,c=k[f>>2]|0,c>>>0<(k[b+16>>2]|0)>>>0):0){k[f>>2]=c+1;i[c>>0]=a;c=a&255;break}c=uh(b,a)|0}while(0);return c|0}function zh(a){a=a|0;var b=0,c=0;do if(a){if((k[a+76>>2]|0)<=-1){b=Jh(a)|0;break}c=(wh(a)|0)==0;b=Jh(a)|0;if(!c)xh(a)}else{if(!(k[1344]|0))b=0;else b=zh(k[1344]|0)|0;yb(5356);a=k[1338]|0;if(a)do{if((k[a+76>>2]|0)>-1)c=wh(a)|0;else c=0;if((k[a+20>>2]|0)>>>0>(k[a+28>>2]|0)>>>0)b=Jh(a)|0|b;if(c)xh(a);a=k[a+56>>2]|0}while((a|0)!=0);nb(5356)}while(0);return b|0}function Ah(a){a=a|0;var b=0,c=0;b=a+74|0;c=i[b>>0]|0;i[b>>0]=c+255|c;b=k[a>>2]|0;if(!(b&8)){k[a+8>>2]=0;k[a+4>>2]=0;b=k[a+44>>2]|0;k[a+28>>2]=b;k[a+20>>2]=b;k[a+16>>2]=b+(k[a+48>>2]|0);b=0}else{k[a>>2]=b|32;b=-1}return b|0}function Bh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;p=r;r=r+48|0;m=p+16|0;l=p;d=p+32|0;n=a+28|0;e=k[n>>2]|0;k[d>>2]=e;o=a+20|0;e=(k[o>>2]|0)-e|0;k[d+4>>2]=e;k[d+8>>2]=b;k[d+12>>2]=c;i=a+60|0;j=a+44|0;b=2;e=e+c|0;while(1){if(!(k[1332]|0)){k[m>>2]=k[i>>2];k[m+4>>2]=d;k[m+8>>2]=b;g=ih(Lb(146,m|0)|0)|0}else{Ab(18,a|0);k[l>>2]=k[i>>2];k[l+4>>2]=d;k[l+8>>2]=b;g=ih(Lb(146,l|0)|0)|0;ya(0)}if((e|0)==(g|0)){e=6;break}if((g|0)<0){e=8;break}e=e-g|0;f=k[d+4>>2]|0;if(g>>>0<=f>>>0)if((b|0)==2){k[n>>2]=(k[n>>2]|0)+g;h=f;b=2}else h=f;else{h=k[j>>2]|0;k[n>>2]=h;k[o>>2]=h;h=k[d+12>>2]|0;g=g-f|0;d=d+8|0;b=b+-1|0}k[d>>2]=(k[d>>2]|0)+g;k[d+4>>2]=h-g}if((e|0)==6){m=k[j>>2]|0;k[a+16>>2]=m+(k[a+48>>2]|0);a=m;k[n>>2]=a;k[o>>2]=a}else if((e|0)==8){k[a+16>>2]=0;k[n>>2]=0;k[o>>2]=0;k[a>>2]=k[a>>2]|32;if((b|0)==2)c=0;else c=c-(k[d+4>>2]|0)|0}r=p;return c|0}function Ch(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=c+16|0;e=k[d>>2]|0;if(!e)if(!(Ah(c)|0)){e=k[d>>2]|0;f=4}else d=0;else f=4;a:do if((f|0)==4){g=c+20|0;f=k[g>>2]|0;if((e-f|0)>>>0>>0){d=Pb[k[c+36>>2]&15](c,a,b)|0;break}b:do if((i[c+75>>0]|0)>-1){d=b;while(1){if(!d){e=f;d=0;break b}e=d+-1|0;if((i[a+e>>0]|0)==10)break;else d=e}if((Pb[k[c+36>>2]&15](c,a,d)|0)>>>0>>0)break a;b=b-d|0;a=a+d|0;e=k[g>>2]|0}else{e=f;d=0}while(0);ki(e|0,a|0,b|0)|0;k[g>>2]=(k[g>>2]|0)+b;d=d+b|0}while(0);return d|0}function Dh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=ha(c,b)|0;if((k[d+76>>2]|0)>-1){f=(wh(d)|0)==0;a=Ch(a,e,d)|0;if(!f)xh(d)}else a=Ch(a,e,d)|0;if((a|0)!=(e|0))c=(a>>>0)/(b>>>0)|0;return c|0}function Eh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;c=vh(a,b,e)|0;r=d;return c|0}function Fh(a){a=a|0;var b=0,c=0;b=r;r=r+16|0;c=b;k[c>>2]=k[a+60>>2];a=ih(zb(6,c|0)|0)|0;r=b;return a|0}function Gh(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Hh(a,b,0)|0;return a|0}function Hh(a,b,c){a=a|0;b=b|0;c=c|0;do if(a){if(b>>>0<128){i[a>>0]=b;a=1;break}if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;a=2;break}if(b>>>0<55296|(b&-8192|0)==57344){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;a=3;break}if((b+-65536|0)>>>0<1048576){i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;a=4;break}else{a=gh()|0;k[a>>2]=84;a=-1;break}}else a=1;while(0);return a|0}function Ih(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,m=0,n=0.0,o=0,q=0,s=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;ga=r;r=r+624|0;ba=ga+24|0;da=ga+16|0;ca=ga+588|0;Y=ga+576|0;aa=ga;V=ga+536|0;fa=ga+8|0;ea=ga+528|0;M=(a|0)!=0;N=V+40|0;U=N;V=V+39|0;W=fa+4|0;X=Y+12|0;Y=Y+11|0;Z=ca;_=X;$=_-Z|0;O=-2-Z|0;P=_+2|0;Q=ba+288|0;R=ca+9|0;S=R;T=ca+8|0;w=b;b=0;g=0;f=0;a:while(1){do if((b|0)>-1)if((g|0)>(2147483647-b|0)){b=gh()|0;k[b>>2]=75;b=-1;break}else{b=g+b|0;break}while(0);g=i[w>>0]|0;if(!(g<<24>>24)){K=245;break}else h=w;b:while(1){switch(g<<24>>24){case 37:{g=h;K=9;break b}case 0:{g=h;break b}default:{}}J=h+1|0;g=i[J>>0]|0;h=J}c:do if((K|0)==9)while(1){K=0;if((i[g+1>>0]|0)!=37)break c;h=h+1|0;g=g+2|0;if((i[g>>0]|0)==37)K=9;else break}while(0);y=h-w|0;if(M?(k[a>>2]&32|0)==0:0)Ch(w,y,a)|0;if((h|0)!=(w|0)){w=g;g=y;continue}o=g+1|0;h=i[o>>0]|0;m=(h<<24>>24)+-48|0;if(m>>>0<10){J=(i[g+2>>0]|0)==36;g=J?g+3|0:o;h=i[g>>0]|0;u=J?m:-1;f=J?1:f}else{u=-1;g=o}m=h<<24>>24;d:do if((m&-32|0)==32){o=0;do{if(!(1<>24)+-32|o;g=g+1|0;h=i[g>>0]|0;m=h<<24>>24}while((m&-32|0)==32)}else o=0;while(0);do if(h<<24>>24==42){m=g+1|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+2>>0]|0)==36:0){k[e+(h<<2)>>2]=10;f=1;g=g+3|0;h=k[d+((i[m>>0]|0)+-48<<3)>>2]|0}else{if(f){b=-1;break a}if(!M){g=m;x=o;f=0;J=0;break}f=(k[c>>2]|0)+(4-1)&~(4-1);h=k[f>>2]|0;k[c>>2]=f+4;f=0;g=m}if((h|0)<0){x=o|8192;J=0-h|0}else{x=o;J=h}}else{m=(h<<24>>24)+-48|0;if(m>>>0<10){h=0;do{h=(h*10|0)+m|0;g=g+1|0;m=(i[g>>0]|0)+-48|0}while(m>>>0<10);if((h|0)<0){b=-1;break a}else{x=o;J=h}}else{x=o;J=0}}while(0);e:do if((i[g>>0]|0)==46){m=g+1|0;h=i[m>>0]|0;if(h<<24>>24!=42){o=(h<<24>>24)+-48|0;if(o>>>0<10){g=m;h=0}else{g=m;o=0;break}while(1){h=(h*10|0)+o|0;g=g+1|0;o=(i[g>>0]|0)+-48|0;if(o>>>0>=10){o=h;break e}}}m=g+2|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+3>>0]|0)==36:0){k[e+(h<<2)>>2]=10;g=g+4|0;o=k[d+((i[m>>0]|0)+-48<<3)>>2]|0;break}if(f){b=-1;break a}if(M){g=(k[c>>2]|0)+(4-1)&~(4-1);o=k[g>>2]|0;k[c>>2]=g+4;g=m}else{g=m;o=0}}else o=-1;while(0);s=0;while(1){h=(i[g>>0]|0)+-65|0;if(h>>>0>57){b=-1;break a}q=g+1|0;h=i[324427+(s*58|0)+h>>0]|0;m=h&255;if((m+-1|0)>>>0<8){g=q;s=m}else{I=q;q=h;break}}if(!(q<<24>>24)){b=-1;break}h=(u|0)>-1;do if(q<<24>>24==19)if(h){b=-1;break a}else K=52;else{if(h){k[e+(u<<2)>>2]=m;G=d+(u<<3)|0;H=k[G+4>>2]|0;K=aa;k[K>>2]=k[G>>2];k[K+4>>2]=H;K=52;break}if(!M){b=0;break a}Lh(aa,m,c)}while(0);if((K|0)==52?(K=0,!M):0){w=I;g=y;continue}u=i[g>>0]|0;u=(s|0)!=0&(u&15|0)==3?u&-33:u;m=x&-65537;H=(x&8192|0)==0?x:m;f:do switch(u|0){case 110:switch(s|0){case 0:{k[k[aa>>2]>>2]=b;w=I;g=y;continue a}case 1:{k[k[aa>>2]>>2]=b;w=I;g=y;continue a}case 2:{w=k[aa>>2]|0;k[w>>2]=b;k[w+4>>2]=((b|0)<0)<<31>>31;w=I;g=y;continue a}case 3:{j[k[aa>>2]>>1]=b;w=I;g=y;continue a}case 4:{i[k[aa>>2]>>0]=b;w=I;g=y;continue a}case 6:{k[k[aa>>2]>>2]=b;w=I;g=y;continue a}case 7:{w=k[aa>>2]|0;k[w>>2]=b;k[w+4>>2]=((b|0)<0)<<31>>31;w=I;g=y;continue a}default:{w=I;g=y;continue a}}case 112:{s=H|8;o=o>>>0>8?o:8;u=120;K=64;break}case 88:case 120:{s=H;K=64;break}case 111:{m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;if((h|0)==0&(m|0)==0)g=N;else{g=N;do{g=g+-1|0;i[g>>0]=h&7|48;h=ji(h|0,m|0,3)|0;m=L}while(!((h|0)==0&(m|0)==0))}if(!(H&8)){h=H;s=0;q=324907;K=77}else{s=U-g+1|0;h=H;o=(o|0)<(s|0)?s:o;s=0;q=324907;K=77}break}case 105:case 100:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;if((h|0)<0){g=fi(0,0,g|0,h|0)|0;h=L;m=aa;k[m>>2]=g;k[m+4>>2]=h;m=1;q=324907;K=76;break f}if(!(H&2048)){q=H&1;m=q;q=(q|0)==0?324907:324909;K=76}else{m=1;q=324908;K=76}break}case 117:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;m=0;q=324907;K=76;break}case 99:{i[V>>0]=k[aa>>2];w=V;h=1;s=0;u=324907;g=N;break}case 109:{g=gh()|0;g=hh(k[g>>2]|0)|0;K=82;break}case 115:{g=k[aa>>2]|0;g=(g|0)!=0?g:324917;K=82;break}case 67:{k[fa>>2]=k[aa>>2];k[W>>2]=0;k[aa>>2]=fa;o=-1;K=86;break}case 83:{if(!o){Nh(a,32,J,0,H);g=0;K=98}else K=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{n=+p[aa>>3];k[da>>2]=0;p[t>>3]=n;if((k[t+4>>2]|0)>=0)if(!(H&2048)){G=H&1;F=G;G=(G|0)==0?324925:324930}else{F=1;G=324927}else{n=-n;F=1;G=324924}p[t>>3]=n;E=k[t+4>>2]&2146435072;do if(E>>>0<2146435072|(E|0)==2146435072&0<0){v=+ph(n,da)*2.0;h=v!=0.0;if(h)k[da>>2]=(k[da>>2]|0)+-1;C=u|32;if((C|0)==97){w=u&32;y=(w|0)==0?G:G+9|0;x=F|2;g=12-o|0;do if(!(o>>>0>11|(g|0)==0)){n=8.0;do{g=g+-1|0;n=n*16.0}while((g|0)!=0);if((i[y>>0]|0)==45){n=-(n+(-v-n));break}else{n=v+n-n;break}}else n=v;while(0);h=k[da>>2]|0;g=(h|0)<0?0-h|0:h;g=Mh(g,((g|0)<0)<<31>>31,X)|0;if((g|0)==(X|0)){i[Y>>0]=48;g=Y}i[g+-1>>0]=(h>>31&2)+43;s=g+-2|0;i[s>>0]=u+15;q=(o|0)<1;m=(H&8|0)==0;h=ca;while(1){G=~~n;g=h+1|0;i[h>>0]=l[324891+G>>0]|w;n=(n-+(G|0))*16.0;do if((g-Z|0)==1){if(m&(q&n==0.0))break;i[g>>0]=46;g=h+2|0}while(0);if(!(n!=0.0))break;else h=g}o=(o|0)!=0&(O+g|0)<(o|0)?P+o-s|0:$-s+g|0;m=o+x|0;Nh(a,32,J,m,H);if(!(k[a>>2]&32))Ch(y,x,a)|0;Nh(a,48,J,m,H^65536);g=g-Z|0;if(!(k[a>>2]&32))Ch(ca,g,a)|0;h=_-s|0;Nh(a,48,o-(g+h)|0,0,0);if(!(k[a>>2]&32))Ch(s,h,a)|0;Nh(a,32,J,m,H^8192);g=(m|0)<(J|0)?J:m;break}g=(o|0)<0?6:o;if(h){h=(k[da>>2]|0)+-28|0;k[da>>2]=h;n=v*268435456.0}else{n=v;h=k[da>>2]|0}E=(h|0)<0?ba:Q;D=E;h=E;do{B=~~n>>>0;k[h>>2]=B;h=h+4|0;n=(n-+(B>>>0))*1.0e9}while(n!=0.0);m=h;h=k[da>>2]|0;if((h|0)>0){q=E;while(1){s=(h|0)>29?29:h;o=m+-4|0;do if(o>>>0>>0)o=q;else{h=0;do{B=hi(k[o>>2]|0,0,s|0)|0;B=ii(B|0,L|0,h|0,0)|0;h=L;A=ui(B|0,h|0,1e9,0)|0;k[o>>2]=A;h=ti(B|0,h|0,1e9,0)|0;o=o+-4|0}while(o>>>0>=q>>>0);if(!h){o=q;break}o=q+-4|0;k[o>>2]=h}while(0);while(1){if(m>>>0<=o>>>0)break;h=m+-4|0;if(!(k[h>>2]|0))m=h;else break}h=(k[da>>2]|0)-s|0;k[da>>2]=h;if((h|0)>0)q=o;else break}}else o=E;if((h|0)<0){y=((g+25|0)/9|0)+1|0;z=(C|0)==102;w=o;while(1){x=0-h|0;x=(x|0)>9?9:x;do if(w>>>0>>0){h=(1<>>x;o=0;s=w;do{B=k[s>>2]|0;k[s>>2]=(B>>>x)+o;o=ha(B&h,q)|0;s=s+4|0}while(s>>>0>>0);h=(k[w>>2]|0)==0?w+4|0:w;if(!o){o=h;break}k[m>>2]=o;o=h;m=m+4|0}else o=(k[w>>2]|0)==0?w+4|0:w;while(0);h=z?E:o;m=(m-h>>2|0)>(y|0)?h+(y<<2)|0:m;h=(k[da>>2]|0)+x|0;k[da>>2]=h;if((h|0)>=0){w=o;break}else w=o}}else w=o;do if(w>>>0>>0){h=(D-w>>2)*9|0;q=k[w>>2]|0;if(q>>>0<10)break;else o=10;do{o=o*10|0;h=h+1|0}while(q>>>0>=o>>>0)}else h=0;while(0);A=(C|0)==103;B=(g|0)!=0;o=g-((C|0)!=102?h:0)+((B&A)<<31>>31)|0;if((o|0)<(((m-D>>2)*9|0)+-9|0)){s=o+9216|0;z=(s|0)/9|0;o=E+(z+-1023<<2)|0;s=((s|0)%9|0)+1|0;if((s|0)<9){q=10;do{q=q*10|0;s=s+1|0}while((s|0)!=9)}else q=10;x=k[o>>2]|0;y=(x>>>0)%(q>>>0)|0;if((y|0)==0?(E+(z+-1022<<2)|0)==(m|0):0)q=w;else K=163;do if((K|0)==163){K=0;v=(((x>>>0)/(q>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;s=(q|0)/2|0;do if(y>>>0>>0)n=.5;else{if((y|0)==(s|0)?(E+(z+-1022<<2)|0)==(m|0):0){n=1.0;break}n=1.5}while(0);do if(F){if((i[G>>0]|0)!=45)break;v=-v;n=-n}while(0);s=x-y|0;k[o>>2]=s;if(!(v+n!=v)){q=w;break}C=s+q|0;k[o>>2]=C;if(C>>>0>999999999){h=w;while(1){q=o+-4|0;k[o>>2]=0;if(q>>>0>>0){h=h+-4|0;k[h>>2]=0}C=(k[q>>2]|0)+1|0;k[q>>2]=C;if(C>>>0>999999999)o=q;else{w=h;o=q;break}}}h=(D-w>>2)*9|0;s=k[w>>2]|0;if(s>>>0<10){q=w;break}else q=10;do{q=q*10|0;h=h+1|0}while(s>>>0>=q>>>0);q=w}while(0);C=o+4|0;w=q;m=m>>>0>C>>>0?C:m}y=0-h|0;while(1){if(m>>>0<=w>>>0){z=0;C=m;break}o=m+-4|0;if(!(k[o>>2]|0))m=o;else{z=1;C=m;break}}do if(A){g=(B&1^1)+g|0;if((g|0)>(h|0)&(h|0)>-5){u=u+-1|0;g=g+-1-h|0}else{u=u+-2|0;g=g+-1|0}m=H&8;if(m)break;do if(z){m=k[C+-4>>2]|0;if(!m){o=9;break}if(!((m>>>0)%10|0)){q=10;o=0}else{o=0;break}do{q=q*10|0;o=o+1|0}while(((m>>>0)%(q>>>0)|0|0)==0)}else o=9;while(0);m=((C-D>>2)*9|0)+-9|0;if((u|32|0)==102){m=m-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}else{m=m+h-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}}else m=H&8;while(0);x=g|m;q=(x|0)!=0&1;s=(u|32|0)==102;if(s){h=(h|0)>0?h:0;u=0}else{o=(h|0)<0?y:h;o=Mh(o,((o|0)<0)<<31>>31,X)|0;if((_-o|0)<2)do{o=o+-1|0;i[o>>0]=48}while((_-o|0)<2);i[o+-1>>0]=(h>>31&2)+43;D=o+-2|0;i[D>>0]=u;h=_-D|0;u=D}y=F+1+g+q+h|0;Nh(a,32,J,y,H);if(!(k[a>>2]&32))Ch(G,F,a)|0;Nh(a,48,J,y,H^65536);do if(s){o=w>>>0>E>>>0?E:w;h=o;do{m=Mh(k[h>>2]|0,0,R)|0;do if((h|0)==(o|0)){if((m|0)!=(R|0))break;i[T>>0]=48;m=T}else{if(m>>>0<=ca>>>0)break;do{m=m+-1|0;i[m>>0]=48}while(m>>>0>ca>>>0)}while(0);if(!(k[a>>2]&32))Ch(m,S-m|0,a)|0;h=h+4|0}while(h>>>0<=E>>>0);do if(x){if(k[a>>2]&32)break;Ch(324959,1,a)|0}while(0);if((g|0)>0&h>>>0>>0){m=h;while(1){h=Mh(k[m>>2]|0,0,R)|0;if(h>>>0>ca>>>0)do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0);if(!(k[a>>2]&32))Ch(h,(g|0)>9?9:g,a)|0;m=m+4|0;h=g+-9|0;if(!((g|0)>9&m>>>0>>0)){g=h;break}else g=h}}Nh(a,48,g+9|0,9,0)}else{s=z?C:w+4|0;if((g|0)>-1){q=(m|0)==0;o=w;do{h=Mh(k[o>>2]|0,0,R)|0;if((h|0)==(R|0)){i[T>>0]=48;h=T}do if((o|0)==(w|0)){m=h+1|0;if(!(k[a>>2]&32))Ch(h,1,a)|0;if(q&(g|0)<1){h=m;break}if(k[a>>2]&32){h=m;break}Ch(324959,1,a)|0;h=m}else{if(h>>>0<=ca>>>0)break;do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0)}while(0);m=S-h|0;if(!(k[a>>2]&32))Ch(h,(g|0)>(m|0)?m:g,a)|0;g=g-m|0;o=o+4|0}while(o>>>0>>0&(g|0)>-1)}Nh(a,48,g+18|0,18,0);if(k[a>>2]&32)break;Ch(u,_-u|0,a)|0}while(0);Nh(a,32,J,y,H^8192);g=(y|0)<(J|0)?J:y}else{s=(u&32|0)!=0;q=n!=n|0.0!=0.0;h=q?0:F;o=h+3|0;Nh(a,32,J,o,m);g=k[a>>2]|0;if(!(g&32)){Ch(G,h,a)|0;g=k[a>>2]|0}if(!(g&32))Ch(q?(s?324951:324955):s?324943:324947,3,a)|0;Nh(a,32,J,o,H^8192);g=(o|0)<(J|0)?J:o}while(0);w=I;continue a}default:{m=H;h=o;s=0;u=324907;g=N}}while(0);g:do if((K|0)==64){m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;q=u&32;if(!((h|0)==0&(m|0)==0)){g=N;do{g=g+-1|0;i[g>>0]=l[324891+(h&15)>>0]|q;h=ji(h|0,m|0,4)|0;m=L}while(!((h|0)==0&(m|0)==0));K=aa;if((s&8|0)==0|(k[K>>2]|0)==0&(k[K+4>>2]|0)==0){h=s;s=0;q=324907;K=77}else{h=s;s=2;q=324907+(u>>4)|0;K=77}}else{g=N;h=s;s=0;q=324907;K=77}}else if((K|0)==76){g=Mh(g,h,N)|0;h=H;s=m;K=77}else if((K|0)==82){K=0;H=jh(g,0,o)|0;G=(H|0)==0;w=g;h=G?o:H-g|0;s=0;u=324907;g=G?g+o|0:H}else if((K|0)==86){K=0;h=0;g=0;q=k[aa>>2]|0;while(1){m=k[q>>2]|0;if(!m)break;g=Gh(ea,m)|0;if((g|0)<0|g>>>0>(o-h|0)>>>0)break;h=g+h|0;if(o>>>0>h>>>0)q=q+4|0;else break}if((g|0)<0){b=-1;break a}Nh(a,32,J,h,H);if(!h){g=0;K=98}else{m=0;o=k[aa>>2]|0;while(1){g=k[o>>2]|0;if(!g){g=h;K=98;break g}g=Gh(ea,g)|0;m=g+m|0;if((m|0)>(h|0)){g=h;K=98;break g}if(!(k[a>>2]&32))Ch(ea,g,a)|0;if(m>>>0>=h>>>0){g=h;K=98;break}else o=o+4|0}}}while(0);if((K|0)==98){K=0;Nh(a,32,J,g,H^8192);w=I;g=(J|0)>(g|0)?J:g;continue}if((K|0)==77){K=0;m=(o|0)>-1?h&-65537:h;h=aa;h=(k[h>>2]|0)!=0|(k[h+4>>2]|0)!=0;if((o|0)!=0|h){h=(h&1^1)+(U-g)|0;w=g;h=(o|0)>(h|0)?o:h;u=q;g=N}else{w=N;h=0;u=q;g=N}}q=g-w|0;h=(h|0)<(q|0)?q:h;o=s+h|0;g=(J|0)<(o|0)?o:J;Nh(a,32,g,o,m);if(!(k[a>>2]&32))Ch(u,s,a)|0;Nh(a,48,g,o,m^65536);Nh(a,48,h,q,0);if(!(k[a>>2]&32))Ch(w,q,a)|0;Nh(a,32,g,o,m^8192);w=I}h:do if((K|0)==245)if(!a)if(f){b=1;while(1){f=k[e+(b<<2)>>2]|0;if(!f)break;Lh(d+(b<<3)|0,f,c);b=b+1|0;if((b|0)>=10){b=1;break h}}if((b|0)<10)while(1){if(k[e+(b<<2)>>2]|0){b=-1;break h}b=b+1|0;if((b|0)>=10){b=1;break}}else b=1}else b=0;while(0);r=ga;return b|0}function Jh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;b=a+20|0;f=a+28|0;if((k[b>>2]|0)>>>0>(k[f>>2]|0)>>>0?(Pb[k[a+36>>2]&15](a,0,0)|0,(k[b>>2]|0)==0):0)b=-1;else{g=a+4|0;c=k[g>>2]|0;d=a+8|0;e=k[d>>2]|0;if(c>>>0>>0)Pb[k[a+40>>2]&15](a,c-e|0,1)|0;k[a+16>>2]=0;k[f>>2]=0;k[b>>2]=0;k[d>>2]=0;k[g>>2]=0;b=0}return b|0}function Kh(a){a=a|0;if(!(k[a+68>>2]|0))xh(a);return}function Lh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;k[a>>2]=b;break a}case 10:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=0;break a}case 12:{d=(k[c>>2]|0)+(8-1)&~(8-1);b=d;e=k[b>>2]|0;b=k[b+4>>2]|0;k[c>>2]=d+8;d=a;k[d>>2]=e;k[d+4>>2]=b;break a}case 13:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&65535)<<16>>16;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 14:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&65535;k[e+4>>2]=0;break a}case 15:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&255)<<24>>24;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 16:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&255;k[e+4>>2]=0;break a}case 17:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}case 18:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}default:break a}while(0);while(0);return}function Mh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(b>>>0>0|(b|0)==0&a>>>0>4294967295)while(1){d=ui(a|0,b|0,10,0)|0;c=c+-1|0;i[c>>0]=d|48;d=ti(a|0,b|0,10,0)|0;if(b>>>0>9|(b|0)==9&a>>>0>4294967295){a=d;b=L}else{a=d;break}}if(a)while(1){c=c+-1|0;i[c>>0]=(a>>>0)%10|0|48;if(a>>>0<10)break;else a=(a>>>0)/10|0}return c|0}function Nh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=r;r=r+256|0;g=h;do if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;gi(g|0,b|0,(e>>>0>256?256:e)|0)|0;b=k[a>>2]|0;f=(b&32|0)==0;if(e>>>0>255){d=c-d|0;do{if(f){Ch(g,256,a)|0;b=k[a>>2]|0}e=e+-256|0;f=(b&32|0)==0}while(e>>>0>255);if(f)e=d&255;else break}else if(!f)break;Ch(g,e,a)|0}while(0);r=h;return}function Oh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;h=k[1402]|0;c=h>>>a;if(c&3){a=(c&1^1)+a|0;d=a<<1;c=5648+(d<<2)|0;d=5648+(d+2<<2)|0;e=k[d>>2]|0;f=e+8|0;g=k[f>>2]|0;do if((c|0)!=(g|0)){if(g>>>0<(k[1406]|0)>>>0)Fa();b=g+12|0;if((k[b>>2]|0)==(e|0)){k[b>>2]=c;k[d>>2]=g;break}else Fa()}else k[1402]=h&~(1<>2]=M|3;M=e+(M|4)|0;k[M>>2]=k[M>>2]|1;M=f;return M|0}g=k[1404]|0;if(o>>>0>g>>>0){if(c){d=2<>>12&16;d=d>>>i;e=d>>>5&8;d=d>>>e;f=d>>>2&4;d=d>>>f;c=d>>>1&2;d=d>>>c;a=d>>>1&1;a=(e|i|f|c|a)+(d>>>a)|0;d=a<<1;c=5648+(d<<2)|0;d=5648+(d+2<<2)|0;f=k[d>>2]|0;i=f+8|0;e=k[i>>2]|0;do if((c|0)!=(e|0)){if(e>>>0<(k[1406]|0)>>>0)Fa();b=e+12|0;if((k[b>>2]|0)==(f|0)){k[b>>2]=c;k[d>>2]=e;j=k[1404]|0;break}else Fa()}else{k[1402]=h&~(1<>2]=o|3;h=f+o|0;k[f+(o|4)>>2]=g|1;k[f+M>>2]=g;if(j){e=k[1407]|0;c=j>>>3;b=c<<1;d=5648+(b<<2)|0;a=k[1402]|0;c=1<>2]|0;if(b>>>0<(k[1406]|0)>>>0)Fa();else{l=a;m=b}}else{k[1402]=a|c;l=5648+(b+2<<2)|0;m=d}k[l>>2]=e;k[m+12>>2]=e;k[e+8>>2]=m;k[e+12>>2]=d}k[1404]=g;k[1407]=h;M=i;return M|0}a=k[1403]|0;if(a){c=(a&0-a)+-1|0;L=c>>>12&16;c=c>>>L;K=c>>>5&8;c=c>>>K;M=c>>>2&4;c=c>>>M;a=c>>>1&2;c=c>>>a;d=c>>>1&1;d=k[5912+((K|L|M|a|d)+(c>>>d)<<2)>>2]|0;c=(k[d+4>>2]&-8)-o|0;a=d;while(1){b=k[a+16>>2]|0;if(!b){b=k[a+20>>2]|0;if(!b){i=c;break}}a=(k[b+4>>2]&-8)-o|0;M=a>>>0>>0;c=M?a:c;a=b;d=M?b:d}f=k[1406]|0;if(d>>>0>>0)Fa();h=d+o|0;if(d>>>0>=h>>>0)Fa();g=k[d+24>>2]|0;c=k[d+12>>2]|0;do if((c|0)==(d|0)){a=d+20|0;b=k[a>>2]|0;if(!b){a=d+16|0;b=k[a>>2]|0;if(!b){n=0;break}}while(1){c=b+20|0;e=k[c>>2]|0;if(e){b=e;a=c;continue}c=b+16|0;e=k[c>>2]|0;if(!e)break;else{b=e;a=c}}if(a>>>0>>0)Fa();else{k[a>>2]=0;n=b;break}}else{e=k[d+8>>2]|0;if(e>>>0>>0)Fa();b=e+12|0;if((k[b>>2]|0)!=(d|0))Fa();a=c+8|0;if((k[a>>2]|0)==(d|0)){k[b>>2]=c;k[a>>2]=e;n=c;break}else Fa()}while(0);do if(g){b=k[d+28>>2]|0;a=5912+(b<<2)|0;if((d|0)==(k[a>>2]|0)){k[a>>2]=n;if(!n){k[1403]=k[1403]&~(1<>>0<(k[1406]|0)>>>0)Fa();b=g+16|0;if((k[b>>2]|0)==(d|0))k[b>>2]=n;else k[g+20>>2]=n;if(!n)break}a=k[1406]|0;if(n>>>0>>0)Fa();k[n+24>>2]=g;b=k[d+16>>2]|0;do if(b)if(b>>>0>>0)Fa();else{k[n+16>>2]=b;k[b+24>>2]=n;break}while(0);b=k[d+20>>2]|0;if(b)if(b>>>0<(k[1406]|0)>>>0)Fa();else{k[n+20>>2]=b;k[b+24>>2]=n;break}}while(0);if(i>>>0<16){M=i+o|0;k[d+4>>2]=M|3;M=d+(M+4)|0;k[M>>2]=k[M>>2]|1}else{k[d+4>>2]=o|3;k[d+(o|4)>>2]=i|1;k[d+(i+o)>>2]=i;b=k[1404]|0;if(b){f=k[1407]|0;c=b>>>3;b=c<<1;e=5648+(b<<2)|0;a=k[1402]|0;c=1<>2]|0;if(a>>>0<(k[1406]|0)>>>0)Fa();else{p=b;q=a}}else{k[1402]=a|c;p=5648+(b+2<<2)|0;q=e}k[p>>2]=f;k[q+12>>2]=f;k[f+8>>2]=q;k[f+12>>2]=e}k[1404]=i;k[1407]=h}M=d+8|0;return M|0}else q=o}else q=o}else if(a>>>0<=4294967231){a=a+11|0;m=a&-8;l=k[1403]|0;if(l){c=0-m|0;a=a>>>8;if(a)if(m>>>0>16777215)j=31;else{q=(a+1048320|0)>>>16&8;v=a<>>16&4;v=v<>>16&2;j=14-(p|q|j)+(v<>>15)|0;j=m>>>(j+7|0)&1|j<<1}else j=0;a=k[5912+(j<<2)>>2]|0;a:do if(!a){e=0;a=0;v=86}else{g=c;e=0;h=m<<((j|0)==31?0:25-(j>>>1)|0);i=a;a=0;while(1){f=k[i+4>>2]&-8;c=f-m|0;if(c>>>0>>0)if((f|0)==(m|0)){f=i;a=i;v=90;break a}else a=i;else c=g;v=k[i+20>>2]|0;i=k[i+16+(h>>>31<<2)>>2]|0;e=(v|0)==0|(v|0)==(i|0)?e:v;if(!i){v=86;break}else{g=c;h=h<<1}}}while(0);if((v|0)==86){if((e|0)==0&(a|0)==0){a=2<>>12&16;a=a>>>n;l=a>>>5&8;a=a>>>l;p=a>>>2&4;a=a>>>p;q=a>>>1&2;a=a>>>q;e=a>>>1&1;e=k[5912+((l|n|p|q|e)+(a>>>e)<<2)>>2]|0;a=0}if(!e){h=c;i=a}else{f=e;v=90}}if((v|0)==90)while(1){v=0;q=(k[f+4>>2]&-8)-m|0;e=q>>>0>>0;c=e?q:c;a=e?f:a;e=k[f+16>>2]|0;if(e){f=e;v=90;continue}f=k[f+20>>2]|0;if(!f){h=c;i=a;break}else v=90}if((i|0)!=0?h>>>0<((k[1404]|0)-m|0)>>>0:0){e=k[1406]|0;if(i>>>0>>0)Fa();g=i+m|0;if(i>>>0>=g>>>0)Fa();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){a=i+20|0;b=k[a>>2]|0;if(!b){a=i+16|0;b=k[a>>2]|0;if(!b){o=0;break}}while(1){c=b+20|0;d=k[c>>2]|0;if(d){b=d;a=c;continue}c=b+16|0;d=k[c>>2]|0;if(!d)break;else{b=d;a=c}}if(a>>>0>>0)Fa();else{k[a>>2]=0;o=b;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)Fa();b=d+12|0;if((k[b>>2]|0)!=(i|0))Fa();a=c+8|0;if((k[a>>2]|0)==(i|0)){k[b>>2]=c;k[a>>2]=d;o=c;break}else Fa()}while(0);do if(f){b=k[i+28>>2]|0;a=5912+(b<<2)|0;if((i|0)==(k[a>>2]|0)){k[a>>2]=o;if(!o){k[1403]=k[1403]&~(1<>>0<(k[1406]|0)>>>0)Fa();b=f+16|0;if((k[b>>2]|0)==(i|0))k[b>>2]=o;else k[f+20>>2]=o;if(!o)break}a=k[1406]|0;if(o>>>0>>0)Fa();k[o+24>>2]=f;b=k[i+16>>2]|0;do if(b)if(b>>>0>>0)Fa();else{k[o+16>>2]=b;k[b+24>>2]=o;break}while(0);b=k[i+20>>2]|0;if(b)if(b>>>0<(k[1406]|0)>>>0)Fa();else{k[o+20>>2]=b;k[b+24>>2]=o;break}}while(0);b:do if(h>>>0>=16){k[i+4>>2]=m|3;k[i+(m|4)>>2]=h|1;k[i+(h+m)>>2]=h;b=h>>>3;if(h>>>0<256){a=b<<1;d=5648+(a<<2)|0;c=k[1402]|0;b=1<>2]|0;if(a>>>0<(k[1406]|0)>>>0)Fa();else{s=b;t=a}}else{k[1402]=c|b;s=5648+(a+2<<2)|0;t=d}k[s>>2]=g;k[t+12>>2]=g;k[i+(m+8)>>2]=t;k[i+(m+12)>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=5912+(d<<2)|0;k[i+(m+28)>>2]=d;k[i+(m+20)>>2]=0;k[i+(m+16)>>2]=0;a=k[1403]|0;c=1<>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break}b=k[b>>2]|0;c:do if((k[b+4>>2]&-8|0)!=(h|0)){d=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(h|0)){y=c;break c}else{d=d<<1;b=c}}if(a>>>0<(k[1406]|0)>>>0)Fa();else{k[a>>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break b}}else y=b;while(0);b=y+8|0;a=k[b>>2]|0;M=k[1406]|0;if(a>>>0>=M>>>0&y>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[i+(m+8)>>2]=a;k[i+(m+12)>>2]=y;k[i+(m+24)>>2]=0;break}else Fa()}else{M=h+m|0;k[i+4>>2]=M|3;M=i+(M+4)|0;k[M>>2]=k[M>>2]|1}while(0);M=i+8|0;return M|0}else q=m}else q=m}else q=-1;while(0);c=k[1404]|0;if(c>>>0>=q>>>0){b=c-q|0;a=k[1407]|0;if(b>>>0>15){k[1407]=a+q;k[1404]=b;k[a+(q+4)>>2]=b|1;k[a+c>>2]=b;k[a+4>>2]=q|3}else{k[1404]=0;k[1407]=0;k[a+4>>2]=c|3;M=a+(c+4)|0;k[M>>2]=k[M>>2]|1}M=a+8|0;return M|0}a=k[1405]|0;if(a>>>0>q>>>0){L=a-q|0;k[1405]=L;M=k[1408]|0;k[1408]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}do if(!(k[1520]|0)){a=_a(30)|0;if(!(a+-1&a)){k[1522]=a;k[1521]=a;k[1523]=-1;k[1524]=-1;k[1525]=0;k[1513]=0;y=(Db(0)|0)&-16^1431655768;k[1520]=y;break}else Fa()}while(0);i=q+48|0;h=k[1522]|0;j=q+47|0;g=h+j|0;h=0-h|0;l=g&h;if(l>>>0<=q>>>0){M=0;return M|0}a=k[1512]|0;if((a|0)!=0?(t=k[1510]|0,y=t+l|0,y>>>0<=t>>>0|y>>>0>a>>>0):0){M=0;return M|0}d:do if(!(k[1513]&4)){a=k[1408]|0;e:do if(a){e=6056;while(1){c=k[e>>2]|0;if(c>>>0<=a>>>0?(r=e+4|0,(c+(k[r>>2]|0)|0)>>>0>a>>>0):0){f=e;a=r;break}e=k[e+8>>2]|0;if(!e){v=174;break e}}c=g-(k[1405]|0)&h;if(c>>>0<2147483647){e=Ua(c|0)|0;y=(e|0)==((k[f>>2]|0)+(k[a>>2]|0)|0);a=y?c:0;if(y){if((e|0)!=(-1|0)){w=e;p=a;v=194;break d}}else v=184}else a=0}else v=174;while(0);do if((v|0)==174){f=Ua(0)|0;if((f|0)!=(-1|0)){a=f;c=k[1521]|0;e=c+-1|0;if(!(e&a))c=l;else c=l-a+(e+a&0-c)|0;a=k[1510]|0;e=a+c|0;if(c>>>0>q>>>0&c>>>0<2147483647){y=k[1512]|0;if((y|0)!=0?e>>>0<=a>>>0|e>>>0>y>>>0:0){a=0;break}e=Ua(c|0)|0;y=(e|0)==(f|0);a=y?c:0;if(y){w=f;p=a;v=194;break d}else v=184}else a=0}else a=0}while(0);f:do if((v|0)==184){f=0-c|0;do if(i>>>0>c>>>0&(c>>>0<2147483647&(e|0)!=(-1|0))?(u=k[1522]|0,u=j-c+u&0-u,u>>>0<2147483647):0)if((Ua(u|0)|0)==(-1|0)){Ua(f|0)|0;break f}else{c=u+c|0;break}while(0);if((e|0)!=(-1|0)){w=e;p=c;v=194;break d}}while(0);k[1513]=k[1513]|4;v=191}else{a=0;v=191}while(0);if((((v|0)==191?l>>>0<2147483647:0)?(w=Ua(l|0)|0,x=Ua(0)|0,w>>>0>>0&((w|0)!=(-1|0)&(x|0)!=(-1|0))):0)?(z=x-w|0,A=z>>>0>(q+40|0)>>>0,A):0){p=A?z:a;v=194}if((v|0)==194){a=(k[1510]|0)+p|0;k[1510]=a;if(a>>>0>(k[1511]|0)>>>0)k[1511]=a;g=k[1408]|0;g:do if(g){f=6056;do{a=k[f>>2]|0;c=f+4|0;e=k[c>>2]|0;if((w|0)==(a+e|0)){B=a;C=c;D=e;E=f;v=204;break}f=k[f+8>>2]|0}while((f|0)!=0);if(((v|0)==204?(k[E+12>>2]&8|0)==0:0)?g>>>0>>0&g>>>0>=B>>>0:0){k[C>>2]=D+p;M=(k[1405]|0)+p|0;L=g+8|0;L=(L&7|0)==0?0:0-L&7;K=M-L|0;k[1408]=g+L;k[1405]=K;k[g+(L+4)>>2]=K|1;k[g+(M+4)>>2]=40;k[1409]=k[1524];break}a=k[1406]|0;if(w>>>0>>0){k[1406]=w;a=w}c=w+p|0;f=6056;while(1){if((k[f>>2]|0)==(c|0)){e=f;c=f;v=212;break}f=k[f+8>>2]|0;if(!f){c=6056;break}}if((v|0)==212)if(!(k[c+12>>2]&8)){k[e>>2]=w;n=c+4|0;k[n>>2]=(k[n>>2]|0)+p;n=w+8|0;n=(n&7|0)==0?0:0-n&7;j=w+(p+8)|0;j=(j&7|0)==0?0:0-j&7;b=w+(j+p)|0;m=n+q|0;o=w+m|0;l=b-(w+n)-q|0;k[w+(n+4)>>2]=q|3;h:do if((b|0)!=(g|0)){if((b|0)==(k[1407]|0)){M=(k[1404]|0)+l|0;k[1404]=M;k[1407]=o;k[w+(m+4)>>2]=M|1;k[w+(M+m)>>2]=M;break}h=p+4|0;c=k[w+(h+j)>>2]|0;if((c&3|0)==1){i=c&-8;f=c>>>3;i:do if(c>>>0>=256){g=k[w+((j|24)+p)>>2]|0;d=k[w+(p+12+j)>>2]|0;do if((d|0)==(b|0)){e=j|16;d=w+(h+e)|0;c=k[d>>2]|0;if(!c){d=w+(e+p)|0;c=k[d>>2]|0;if(!c){J=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Fa();else{k[d>>2]=0;J=c;break}}else{e=k[w+((j|8)+p)>>2]|0;if(e>>>0>>0)Fa();a=e+12|0;if((k[a>>2]|0)!=(b|0))Fa();c=d+8|0;if((k[c>>2]|0)==(b|0)){k[a>>2]=d;k[c>>2]=e;J=d;break}else Fa()}while(0);if(!g)break;a=k[w+(p+28+j)>>2]|0;c=5912+(a<<2)|0;do if((b|0)!=(k[c>>2]|0)){if(g>>>0<(k[1406]|0)>>>0)Fa();a=g+16|0;if((k[a>>2]|0)==(b|0))k[a>>2]=J;else k[g+20>>2]=J;if(!J)break i}else{k[c>>2]=J;if(J)break;k[1403]=k[1403]&~(1<>>0>>0)Fa();k[J+24>>2]=g;b=j|16;a=k[w+(b+p)>>2]|0;do if(a)if(a>>>0>>0)Fa();else{k[J+16>>2]=a;k[a+24>>2]=J;break}while(0);b=k[w+(h+b)>>2]|0;if(!b)break;if(b>>>0<(k[1406]|0)>>>0)Fa();else{k[J+20>>2]=b;k[b+24>>2]=J;break}}else{d=k[w+((j|8)+p)>>2]|0;e=k[w+(p+12+j)>>2]|0;c=5648+(f<<1<<2)|0;do if((d|0)!=(c|0)){if(d>>>0>>0)Fa();if((k[d+12>>2]|0)==(b|0))break;Fa()}while(0);if((e|0)==(d|0)){k[1402]=k[1402]&~(1<>>0>>0)Fa();a=e+8|0;if((k[a>>2]|0)==(b|0)){F=a;break}Fa()}while(0);k[d+12>>2]=e;k[F>>2]=d}while(0);b=w+((i|j)+p)|0;e=i+l|0}else e=l;b=b+4|0;k[b>>2]=k[b>>2]&-2;k[w+(m+4)>>2]=e|1;k[w+(e+m)>>2]=e;b=e>>>3;if(e>>>0<256){a=b<<1;d=5648+(a<<2)|0;c=k[1402]|0;b=1<>2]|0;if(a>>>0>=(k[1406]|0)>>>0){K=b;L=a;break}Fa()}while(0);k[K>>2]=o;k[L+12>>2]=o;k[w+(m+8)>>2]=L;k[w+(m+12)>>2]=d;break}b=e>>>8;do if(!b)d=0;else{if(e>>>0>16777215){d=31;break}K=(b+1048320|0)>>>16&8;L=b<>>16&4;L=L<>>16&2;d=14-(J|K|d)+(L<>>15)|0;d=e>>>(d+7|0)&1|d<<1}while(0);b=5912+(d<<2)|0;k[w+(m+28)>>2]=d;k[w+(m+20)>>2]=0;k[w+(m+16)>>2]=0;a=k[1403]|0;c=1<>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break}b=k[b>>2]|0;j:do if((k[b+4>>2]&-8|0)!=(e|0)){d=e<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(e|0)){M=c;break j}else{d=d<<1;b=c}}if(a>>>0<(k[1406]|0)>>>0)Fa();else{k[a>>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break h}}else M=b;while(0);b=M+8|0;a=k[b>>2]|0;L=k[1406]|0;if(a>>>0>=L>>>0&M>>>0>=L>>>0){k[a+12>>2]=o;k[b>>2]=o;k[w+(m+8)>>2]=a;k[w+(m+12)>>2]=M;k[w+(m+24)>>2]=0;break}else Fa()}else{M=(k[1405]|0)+l|0;k[1405]=M;k[1408]=o;k[w+(m+4)>>2]=M|1}while(0);M=w+(n|8)|0;return M|0}else c=6056;while(1){a=k[c>>2]|0;if(a>>>0<=g>>>0?(b=k[c+4>>2]|0,d=a+b|0,d>>>0>g>>>0):0)break;c=k[c+8>>2]|0}e=a+(b+-39)|0;a=a+(b+-47+((e&7|0)==0?0:0-e&7))|0;e=g+16|0;a=a>>>0>>0?g:a;b=a+8|0;c=w+8|0;c=(c&7|0)==0?0:0-c&7;M=p+-40-c|0;k[1408]=w+c;k[1405]=M;k[w+(c+4)>>2]=M|1;k[w+(p+-36)>>2]=40;k[1409]=k[1524];c=a+4|0;k[c>>2]=27;k[b>>2]=k[1514];k[b+4>>2]=k[1515];k[b+8>>2]=k[1516];k[b+12>>2]=k[1517];k[1514]=w;k[1515]=p;k[1517]=0;k[1516]=b;b=a+28|0;k[b>>2]=7;if((a+32|0)>>>0>>0)do{M=b;b=b+4|0;k[b>>2]=7}while((M+8|0)>>>0>>0);if((a|0)!=(g|0)){f=a-g|0;k[c>>2]=k[c>>2]&-2;k[g+4>>2]=f|1;k[a>>2]=f;b=f>>>3;if(f>>>0<256){a=b<<1;d=5648+(a<<2)|0;c=k[1402]|0;b=1<>2]|0;if(a>>>0<(k[1406]|0)>>>0)Fa();else{G=b;H=a}}else{k[1402]=c|b;G=5648+(a+2<<2)|0;H=d}k[G>>2]=g;k[H+12>>2]=g;k[g+8>>2]=H;k[g+12>>2]=d;break}b=f>>>8;if(b)if(f>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=f>>>(d+7|0)&1|d<<1}else d=0;c=5912+(d<<2)|0;k[g+28>>2]=d;k[g+20>>2]=0;k[e>>2]=0;b=k[1403]|0;a=1<>2]=g;k[g+24>>2]=c;k[g+12>>2]=g;k[g+8>>2]=g;break}b=k[c>>2]|0;k:do if((k[b+4>>2]&-8|0)!=(f|0)){d=f<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(f|0)){I=c;break k}else{d=d<<1;b=c}}if(a>>>0<(k[1406]|0)>>>0)Fa();else{k[a>>2]=g;k[g+24>>2]=b;k[g+12>>2]=g;k[g+8>>2]=g;break g}}else I=b;while(0);b=I+8|0;a=k[b>>2]|0;M=k[1406]|0;if(a>>>0>=M>>>0&I>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[g+8>>2]=a;k[g+12>>2]=I;k[g+24>>2]=0;break}else Fa()}}else{M=k[1406]|0;if((M|0)==0|w>>>0>>0)k[1406]=w;k[1514]=w;k[1515]=p;k[1517]=0;k[1411]=k[1520];k[1410]=-1;b=0;do{M=b<<1;L=5648+(M<<2)|0;k[5648+(M+3<<2)>>2]=L;k[5648+(M+2<<2)>>2]=L;b=b+1|0}while((b|0)!=32);M=w+8|0;M=(M&7|0)==0?0:0-M&7;L=p+-40-M|0;k[1408]=w+M;k[1405]=L;k[w+(M+4)>>2]=L|1;k[w+(p+-36)>>2]=40;k[1409]=k[1524]}while(0);b=k[1405]|0;if(b>>>0>q>>>0){L=b-q|0;k[1405]=L;M=k[1408]|0;k[1408]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}}M=gh()|0;k[M>>2]=12;M=0;return M|0}function Ph(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!a)return;b=a+-8|0;h=k[1406]|0;if(b>>>0>>0)Fa();c=k[a+-4>>2]|0;d=c&3;if((d|0)==1)Fa();o=c&-8;q=a+(o+-8)|0;do if(!(c&1)){b=k[b>>2]|0;if(!d)return;i=-8-b|0;l=a+i|0;m=b+o|0;if(l>>>0>>0)Fa();if((l|0)==(k[1407]|0)){b=a+(o+-4)|0;c=k[b>>2]|0;if((c&3|0)!=3){u=l;f=m;break}k[1404]=m;k[b>>2]=c&-2;k[a+(i+4)>>2]=m|1;k[q>>2]=m;return}e=b>>>3;if(b>>>0<256){d=k[a+(i+8)>>2]|0;c=k[a+(i+12)>>2]|0;b=5648+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0>>0)Fa();if((k[d+12>>2]|0)!=(l|0))Fa()}if((c|0)==(d|0)){k[1402]=k[1402]&~(1<>>0>>0)Fa();b=c+8|0;if((k[b>>2]|0)==(l|0))g=b;else Fa()}else g=c+8|0;k[d+12>>2]=c;k[g>>2]=d;u=l;f=m;break}g=k[a+(i+24)>>2]|0;d=k[a+(i+12)>>2]|0;do if((d|0)==(l|0)){c=a+(i+20)|0;b=k[c>>2]|0;if(!b){c=a+(i+16)|0;b=k[c>>2]|0;if(!b){j=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0>>0)Fa();else{k[c>>2]=0;j=b;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Fa();b=e+12|0;if((k[b>>2]|0)!=(l|0))Fa();c=d+8|0;if((k[c>>2]|0)==(l|0)){k[b>>2]=d;k[c>>2]=e;j=d;break}else Fa()}while(0);if(g){b=k[a+(i+28)>>2]|0;c=5912+(b<<2)|0;if((l|0)==(k[c>>2]|0)){k[c>>2]=j;if(!j){k[1403]=k[1403]&~(1<>>0<(k[1406]|0)>>>0)Fa();b=g+16|0;if((k[b>>2]|0)==(l|0))k[b>>2]=j;else k[g+20>>2]=j;if(!j){u=l;f=m;break}}c=k[1406]|0;if(j>>>0>>0)Fa();k[j+24>>2]=g;b=k[a+(i+16)>>2]|0;do if(b)if(b>>>0>>0)Fa();else{k[j+16>>2]=b;k[b+24>>2]=j;break}while(0);b=k[a+(i+20)>>2]|0;if(b)if(b>>>0<(k[1406]|0)>>>0)Fa();else{k[j+20>>2]=b;k[b+24>>2]=j;u=l;f=m;break}else{u=l;f=m}}else{u=l;f=m}}else{u=b;f=o}while(0);if(u>>>0>=q>>>0)Fa();b=a+(o+-4)|0;c=k[b>>2]|0;if(!(c&1))Fa();if(!(c&2)){if((q|0)==(k[1408]|0)){t=(k[1405]|0)+f|0;k[1405]=t;k[1408]=u;k[u+4>>2]=t|1;if((u|0)!=(k[1407]|0))return;k[1407]=0;k[1404]=0;return}if((q|0)==(k[1407]|0)){t=(k[1404]|0)+f|0;k[1404]=t;k[1407]=u;k[u+4>>2]=t|1;k[u+t>>2]=t;return}f=(c&-8)+f|0;e=c>>>3;do if(c>>>0>=256){g=k[a+(o+16)>>2]|0;b=k[a+(o|4)>>2]|0;do if((b|0)==(q|0)){c=a+(o+12)|0;b=k[c>>2]|0;if(!b){c=a+(o+8)|0;b=k[c>>2]|0;if(!b){p=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0<(k[1406]|0)>>>0)Fa();else{k[c>>2]=0;p=b;break}}else{c=k[a+o>>2]|0;if(c>>>0<(k[1406]|0)>>>0)Fa();d=c+12|0;if((k[d>>2]|0)!=(q|0))Fa();e=b+8|0;if((k[e>>2]|0)==(q|0)){k[d>>2]=b;k[e>>2]=c;p=b;break}else Fa()}while(0);if(g){b=k[a+(o+20)>>2]|0;c=5912+(b<<2)|0;if((q|0)==(k[c>>2]|0)){k[c>>2]=p;if(!p){k[1403]=k[1403]&~(1<>>0<(k[1406]|0)>>>0)Fa();b=g+16|0;if((k[b>>2]|0)==(q|0))k[b>>2]=p;else k[g+20>>2]=p;if(!p)break}c=k[1406]|0;if(p>>>0>>0)Fa();k[p+24>>2]=g;b=k[a+(o+8)>>2]|0;do if(b)if(b>>>0>>0)Fa();else{k[p+16>>2]=b;k[b+24>>2]=p;break}while(0);b=k[a+(o+12)>>2]|0;if(b)if(b>>>0<(k[1406]|0)>>>0)Fa();else{k[p+20>>2]=b;k[b+24>>2]=p;break}}}else{d=k[a+o>>2]|0;c=k[a+(o|4)>>2]|0;b=5648+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0<(k[1406]|0)>>>0)Fa();if((k[d+12>>2]|0)!=(q|0))Fa()}if((c|0)==(d|0)){k[1402]=k[1402]&~(1<>>0<(k[1406]|0)>>>0)Fa();b=c+8|0;if((k[b>>2]|0)==(q|0))n=b;else Fa()}else n=c+8|0;k[d+12>>2]=c;k[n>>2]=d}while(0);k[u+4>>2]=f|1;k[u+f>>2]=f;if((u|0)==(k[1407]|0)){k[1404]=f;return}}else{k[b>>2]=c&-2;k[u+4>>2]=f|1;k[u+f>>2]=f}b=f>>>3;if(f>>>0<256){c=b<<1;e=5648+(c<<2)|0;d=k[1402]|0;b=1<>2]|0;if(c>>>0<(k[1406]|0)>>>0)Fa();else{r=b;s=c}}else{k[1402]=d|b;r=5648+(c+2<<2)|0;s=e}k[r>>2]=u;k[s+12>>2]=u;k[u+8>>2]=s;k[u+12>>2]=e;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{r=(b+1048320|0)>>>16&8;s=b<>>16&4;s=s<>>16&2;e=14-(q|r|e)+(s<>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=5912+(e<<2)|0;k[u+28>>2]=e;k[u+20>>2]=0;k[u+16>>2]=0;c=k[1403]|0;d=1<>2]|0;b:do if((k[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){c=b+16+(e>>>31<<2)|0;d=k[c>>2]|0;if(!d)break;if((k[d+4>>2]&-8|0)==(f|0)){t=d;break b}else{e=e<<1;b=d}}if(c>>>0<(k[1406]|0)>>>0)Fa();else{k[c>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u;break a}}else t=b;while(0);b=t+8|0;c=k[b>>2]|0;s=k[1406]|0;if(c>>>0>=s>>>0&t>>>0>=s>>>0){k[c+12>>2]=u;k[b>>2]=u;k[u+8>>2]=c;k[u+12>>2]=t;k[u+24>>2]=0;break}else Fa()}else{k[1403]=c|d;k[b>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u}while(0);u=(k[1410]|0)+-1|0;k[1410]=u;if(!u)b=6064;else return;while(1){b=k[b>>2]|0;if(!b)break;else b=b+8|0}k[1410]=-1;return}function Qh(a,b){a=a|0;b=b|0;var c=0;if(a){c=ha(b,a)|0;if((b|a)>>>0>65535)c=((c>>>0)/(a>>>0)|0|0)==(b|0)?c:-1}else c=0;b=Oh(c)|0;if(!b)return b|0;if(!(k[b+-4>>2]&3))return b|0;gi(b|0,0,c|0)|0;return b|0}function Rh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:while(1){o=b;d=b+-4|0;b:while(1){n=a;f=o-n|0;g=f>>2;switch(g|0){case 1:case 0:break a;case 2:{e=a;r=4;break a}case 3:{b=d;r=6;break a}case 4:{b=d;r=7;break a}case 5:{b=d;r=8;break a}default:{}}if((f|0)<124){r=10;break a}e=(g|0)/2|0;j=a+(e<<2)|0;if((f|0)>3996){m=(g|0)/4|0;e=Vh(a,a+(m<<2)|0,j,a+(m+e<<2)|0,d,c)|0}else e=Th(a,j,d,c)|0;i=k[a>>2]|0;h=k[j>>2]|0;do if(i>>>0>>0)g=d;else{f=d;while(1){f=f+-4|0;if((a|0)==(f|0))break;g=k[f>>2]|0;if(g>>>0>>0){r=29;break}}if((r|0)==29){r=0;k[a>>2]=g;k[f>>2]=i;g=f;e=e+1|0;break}e=a+4|0;h=k[d>>2]|0;if(i>>>0>=h>>>0){if((e|0)==(d|0))break a;else g=a;while(1){f=k[e>>2]|0;if(i>>>0>>0)break;f=e+4|0;if((f|0)==(d|0))break a;else{g=e;e=f}}k[e>>2]=h;k[d>>2]=f;e=g+8|0}if((e|0)==(d|0))break a;else g=d;while(1){j=k[a>>2]|0;h=e;while(1){f=k[h>>2]|0;e=h+4|0;if(j>>>0>>0){i=f;break}else h=e}f=g;while(1){g=f+-4|0;f=k[g>>2]|0;if(j>>>0>>0)f=g;else break}if(h>>>0>=g>>>0){a=h;continue b}k[h>>2]=f;k[g>>2]=i}}while(0);f=a+4|0;c:do if(f>>>0>>0){m=j;while(1){j=k[m>>2]|0;i=f;while(1){h=k[i>>2]|0;f=i+4|0;if(h>>>0>>0)i=f;else{l=i;break}}do{g=g+-4|0;i=k[g>>2]|0}while(i>>>0>=j>>>0);j=g;g=i;if(l>>>0>j>>>0){g=l;f=m;break c}k[l>>2]=g;k[j>>2]=h;g=j;m=(m|0)==(l|0)?j:m;e=e+1|0}}else{g=f;f=j}while(0);if((g|0)!=(f|0)?(p=k[f>>2]|0,q=k[g>>2]|0,p>>>0>>0):0){k[g>>2]=p;k[f>>2]=q;e=e+1|0}if(!e){e=Sh(a,g,c)|0;f=g+4|0;if(Sh(f,b,c)|0){r=42;break}if(e){a=f;continue}}m=g;if((m-n|0)>=(o-m|0)){d=g;r=46;break}Rh(a,g,c);a=g+4|0}if((r|0)==42){r=0;if(e)break;else{b=g;continue}}else if((r|0)==46){r=0;Rh(d+4|0,b,c);b=d;continue}}if((r|0)==4){b=k[d>>2]|0;a=k[e>>2]|0;if(b>>>0>>0){k[e>>2]=b;k[d>>2]=a}}else if((r|0)==6)Th(a,a+4|0,b,c)|0;else if((r|0)==7)Uh(a,a+4|0,a+8|0,b,c)|0;else if((r|0)==8)Vh(a,a+4|0,a+8|0,a+12|0,b,c)|0;else if((r|0)==10)Wh(a,b,c);return}function Sh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;a:do switch(b-a>>2|0){case 1:case 0:{c=1;break}case 2:{c=b+-4|0;d=k[c>>2]|0;e=k[a>>2]|0;if(d>>>0>>0){k[a>>2]=d;k[c>>2]=e;c=1}else c=1;break}case 3:{Th(a,a+4|0,b+-4|0,c)|0;c=1;break}case 4:{Uh(a,a+4|0,a+8|0,b+-4|0,c)|0;c=1;break}case 5:{Vh(a,a+4|0,a+8|0,a+12|0,b+-4|0,c)|0;c=1;break}default:{e=a+8|0;Th(a,a+4|0,e,c)|0;c=a+12|0;if((c|0)==(b|0))c=1;else{d=0;while(1){h=k[c>>2]|0;f=k[e>>2]|0;if(h>>>0>>0){g=c;while(1){k[g>>2]=f;if((e|0)==(a|0)){e=a;break}g=e+-4|0;f=k[g>>2]|0;if(h>>>0>=f>>>0)break;else{i=e;e=g;g=i}}k[e>>2]=h;d=d+1|0;if((d|0)==8)break}e=c+4|0;if((e|0)==(b|0)){c=1;break a}else{i=c;c=e;e=i}}c=(c+4|0)==(b|0)}}}while(0);return c|0}function Th(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;d=k[b>>2]|0;g=k[a>>2]|0;e=k[c>>2]|0;f=e>>>0>>0;do if(d>>>0>>0){if(f){k[a>>2]=e;k[c>>2]=g;d=1;break}k[a>>2]=d;k[b>>2]=g;d=k[c>>2]|0;if(d>>>0>>0){k[b>>2]=d;k[c>>2]=g;d=2}else d=1}else if(f){k[b>>2]=e;k[c>>2]=d;d=k[b>>2]|0;e=k[a>>2]|0;if(d>>>0>>0){k[a>>2]=d;k[b>>2]=e;d=2}else d=1}else d=0;while(0);return d|0}function Uh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;e=Th(a,b,c,e)|0;f=k[d>>2]|0;g=k[c>>2]|0;if(f>>>0>>0){k[c>>2]=f;k[d>>2]=g;f=e+1|0;g=k[c>>2]|0;d=k[b>>2]|0;if(g>>>0>>0){k[b>>2]=g;k[c>>2]=d;g=k[b>>2]|0;f=k[a>>2]|0;if(g>>>0>>0){k[a>>2]=g;k[b>>2]=f;e=e+3|0}else e=e+2|0}else e=f}return e|0}function Vh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;f=Uh(a,b,c,d,f)|0;g=k[e>>2]|0;h=k[d>>2]|0;if(g>>>0>>0){k[d>>2]=g;k[e>>2]=h;g=f+1|0;h=k[d>>2]|0;e=k[c>>2]|0;if(h>>>0>>0){k[c>>2]=h;k[d>>2]=e;h=f+2|0;e=k[c>>2]|0;g=k[b>>2]|0;if(e>>>0>>0){k[b>>2]=e;k[c>>2]=g;g=k[b>>2]|0;h=k[a>>2]|0;if(g>>>0>>0){k[a>>2]=g;k[b>>2]=h;f=f+4|0}else f=f+3|0}else f=h}else f=g}return f|0}function Wh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=a+8|0;Th(a,a+4|0,d,c)|0;c=a+12|0;if((c|0)!=(b|0)){g=c;c=d;while(1){f=k[g>>2]|0;d=k[c>>2]|0;if(f>>>0>>0){e=g;while(1){k[e>>2]=d;if((c|0)==(a|0)){c=a;break}e=c+-4|0;d=k[e>>2]|0;if(f>>>0>=d>>>0)break;else{h=c;c=e;e=h}}k[c>>2]=f}c=g+4|0;if((c|0)==(b|0))break;else{h=g;g=c;c=h}}}return}function Xh(a,b){a=a|0;b=b|0;k[a>>2]=5136;Yh(a+4|0,b);return}function Yh(a,b){a=a|0;b=b|0;var c=0,d=0;d=kh(b)|0;c=og(d+13|0)|0;k[c>>2]=d;k[c+4>>2]=d;k[c+8>>2]=0;c=c+12|0;ki(c|0,b|0,d+1|0)|0;k[a>>2]=c;return}function Zh(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+16|0;b=i+8|0;g=i+4|0;c=i;k[g>>2]=a;do if(a>>>0>=212){f=(a>>>0)/210|0;d=f*210|0;k[c>>2]=a-d;b=(_h(6296,6488,c,b)|0)-6296>>2;e=b;b=(k[6296+(b<<2)>>2]|0)+d|0;a:while(1){d=5;while(1){if(d>>>0>=47){d=211;h=8;break}c=k[6104+(d<<2)>>2]|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=106;break a}if((b|0)==(ha(a,c)|0))break;else d=d+1|0}b:do if((h|0)==8)while(1){h=0;c=(b>>>0)/(d>>>0)|0;if(c>>>0>>0){h=105;break a}if((b|0)==(ha(c,d)|0))break b;c=d+10|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+12|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+16|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+18|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+22|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+28|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+30|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+36|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+40|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+42|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+46|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+52|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+58|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+60|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+66|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+70|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+72|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+78|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+82|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+88|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+96|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+100|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+102|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+106|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+108|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+112|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+120|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+126|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+130|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+136|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+138|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+142|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+148|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+150|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+156|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+162|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+166|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+168|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+172|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+178|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+180|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+186|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+190|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+192|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+196|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+198|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break b;c=d+208|0;a=(b>>>0)/(c>>>0)|0;if(a>>>0>>0){h=105;break a}if((b|0)==(ha(a,c)|0))break;else{d=d+210|0;h=8}}while(0);d=e+1|0;b=(d|0)==48;d=b?0:d;b=(b&1)+f|0;e=d;f=b;b=(k[6296+(d<<2)>>2]|0)+(b*210|0)|0}if((h|0)==105){k[g>>2]=b;break}else if((h|0)==106){k[g>>2]=b;break}}else{b=_h(6104,6296,g,b)|0;b=k[b>>2]|0}while(0);r=i;return b|0}function _h(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=k[c>>2]|0;d=a;c=b-a>>2;a:while(1){while(1){if(!c)break a;a=(c|0)/2|0;if((k[d+(a<<2)>>2]|0)>>>0>>0)break;else c=a}d=d+(a+1<<2)|0;c=c+-1-a|0}return d|0}function $h(a,b){a=a|0;b=b|0;if(!(i[b>>0]&1)){k[a>>2]=k[b>>2];k[a+4>>2]=k[b+4>>2];k[a+8>>2]=k[b+8>>2]}else ai(a,k[b+8>>2]|0,k[b+4>>2]|0);return}function ai(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(c>>>0>4294967279)lg(a);if(c>>>0<11){i[a>>0]=c<<1;a=a+1|0}else{e=c+16&-16;d=og(e)|0;k[a+8>>2]=d;k[a>>2]=e|1;k[a+4>>2]=c;a=d}ki(a|0,b|0,c|0)|0;i[a+c>>0]=0;return}function bi(a){a=a|0;if(i[a>>0]&1)rg(k[a+8>>2]|0);return}function ci(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i[a>>0]|0;if(!(d&1))e=10;else{d=k[a>>2]|0;e=(d&-2)+-1|0;d=d&255}if(!(d&1))f=(d&255)>>>1;else f=k[a+4>>2]|0;if((e-f|0)>>>0>=c>>>0){if(c){if(!(d&1))e=a+1|0;else e=k[a+8>>2]|0;ki(e+f|0,b|0,c|0)|0;d=f+c|0;if(!(i[a>>0]&1))i[a>>0]=d<<1;else k[a+4>>2]=d;i[e+d>>0]=0}}else di(a,e,c-e+f|0,f,f,0,c,b);return a|0}function di(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,l=0,m=0;if((-18-b|0)>>>0>>0)lg(a);if(!(i[a>>0]&1))m=a+1|0;else m=k[a+8>>2]|0;if(b>>>0<2147483623){j=c+b|0;l=b<<1;j=j>>>0>>0?l:j;j=j>>>0<11?11:j+16&-16}else j=-17;l=og(j)|0;if(e)ki(l|0,m|0,e|0)|0;if(g)ki(l+e|0,h|0,g|0)|0;c=d-f|0;if((c|0)!=(e|0))ki(l+(g+e)|0,m+(f+e)|0,c-e|0)|0;if((b|0)!=10)rg(m);k[a+8>>2]=l;k[a>>2]=j|1;b=c+g|0;k[a+4>>2]=b;i[l+b>>0]=0;return}function ei(){}function fi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (L=d,a-c>>>0|0)|0}function gi(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a+c|0;if((c|0)>=20){b=b&255;f=a&3;g=b|b<<8|b<<16|b<<24;e=d&~3;if(f){f=a+4-f|0;while((a|0)<(f|0)){i[a>>0]=b;a=a+1|0}}while((a|0)<(e|0)){k[a>>2]=g;a=a+4|0}}while((a|0)<(d|0)){i[a>>0]=b;a=a+1|0}return a-c|0}function hi(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b<>>32-c;return a<>>0;return (L=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function ji(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>>c;return a>>>c|(b&(1<>>c-32|0}function ki(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((c|0)>=4096)return Wa(a|0,b|0,c|0)|0;d=a|0;if((a&3)==(b&3)){while(a&3){if(!c)return d|0;i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}while((c|0)>=4){k[a>>2]=k[b>>2];a=a+4|0;b=b+4|0;c=c-4|0}}while((c|0)>0){i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}return d|0}function li(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((b|0)<(a|0)&(a|0)<(b+c|0)){d=a;b=b+c|0;a=a+c|0;while((c|0)>0){a=a-1|0;b=b-1|0;c=c-1|0;i[a>>0]=i[b>>0]|0}a=d}else ki(a,b,c)|0;return a|0}function mi(a){a=a|0;return (a&255)<<24|(a>>8&255)<<16|(a>>16&255)<<8|a>>>24|0}function ni(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>c;return a>>>c|(b&(1<>c-32|0}function oi(a){a=a|0;var b=0;b=i[v+(a&255)>>0]|0;if((b|0)<8)return b|0;b=i[v+(a>>8&255)>>0]|0;if((b|0)<8)return b+8|0;b=i[v+(a>>16&255)>>0]|0;if((b|0)<8)return b+16|0;return (i[v+(a>>>24)>>0]|0)+24|0}function pi(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=ha(e,f)|0;d=a>>>16;a=(c>>>16)+(ha(e,d)|0)|0;e=b>>>16;b=ha(e,f)|0;return (L=(a>>>16)+(ha(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function qi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=fi(j^a,i^b,j,i)|0;g=L;a=f^j;b=e^i;return fi((vi(h,g,fi(f^c,e^d,f,e)|0,L,0)|0)^a,L^b,a,b)|0}function ri(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=r;r=r+16|0;h=e|0;g=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;j=d>>31|((d|0)<0?-1:0)<<1;i=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;a=fi(g^a,f^b,g,f)|0;b=L;vi(a,b,fi(j^c,i^d,j,i)|0,L,h)|0;d=fi(k[h>>2]^g,k[h+4>>2]^f,g,f)|0;c=L;r=e;return (L=c,d)|0}function si(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=pi(e,f)|0;a=L;return (L=(ha(b,f)|0)+(ha(d,e)|0)+a|a&0,c|0|0)|0}function ti(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return vi(a,b,c,d,0)|0}function ui(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=r;r=r+16|0;e=f|0;vi(a,b,c,d,e)|0;r=f;return (L=k[e+4>>2]|0,k[e>>2]|0)|0}function vi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;l=a;i=b;j=i;g=c;n=d;h=n;if(!j){f=(e|0)!=0;if(!h){if(f){k[e>>2]=(l>>>0)%(g>>>0);k[e+4>>2]=0}n=0;e=(l>>>0)/(g>>>0)>>>0;return (L=n,e)|0}else{if(!f){n=0;e=0;return (L=n,e)|0}k[e>>2]=a|0;k[e+4>>2]=b&0;n=0;e=0;return (L=n,e)|0}}f=(h|0)==0;do if(g){if(!f){f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=31){m=f+1|0;h=31-f|0;b=f-31>>31;g=m;a=l>>>(m>>>0)&b|j<>>(m>>>0)&b;f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;n=0;e=0;return (L=n,e)|0}f=g-1|0;if(f&g){h=(ja(g|0)|0)+33-(ja(j|0)|0)|0;p=64-h|0;m=32-h|0;i=m>>31;o=h-32|0;b=o>>31;g=h;a=m-1>>31&j>>>(o>>>0)|(j<>>(h>>>0))&b;b=b&j>>>(h>>>0);f=l<>>(o>>>0))&i|l<>31;break}if(e){k[e>>2]=f&l;k[e+4>>2]=0}if((g|0)==1){o=i|b&0;p=a|0|0;return (L=o,p)|0}else{p=oi(g|0)|0;o=j>>>(p>>>0)|0;p=j<<32-p|l>>>(p>>>0)|0;return (L=o,p)|0}}else{if(f){if(e){k[e>>2]=(j>>>0)%(g>>>0);k[e+4>>2]=0}o=0;p=(j>>>0)/(g>>>0)>>>0;return (L=o,p)|0}if(!l){if(e){k[e>>2]=0;k[e+4>>2]=(j>>>0)%(h>>>0)}o=0;p=(j>>>0)/(h>>>0)>>>0;return (L=o,p)|0}f=h-1|0;if(!(f&h)){if(e){k[e>>2]=a|0;k[e+4>>2]=f&j|b&0}o=0;p=j>>>((oi(h|0)|0)>>>0);return (L=o,p)|0}f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=30){b=f+1|0;h=31-f|0;g=b;a=j<>>(b>>>0);b=j>>>(b>>>0);f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;o=0;p=0;return (L=o,p)|0}while(0);if(!g){j=h;i=0;h=0}else{m=c|0|0;l=n|d&0;j=ii(m|0,l|0,-1,-1)|0;c=L;i=h;h=0;do{d=i;i=f>>>31|i<<1;f=h|f<<1;d=a<<1|d>>>31|0;n=a>>>31|b<<1|0;fi(j,c,d,n)|0;p=L;o=p>>31|((p|0)<0?-1:0)<<1;h=o&1;a=fi(d,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=L;g=g-1|0}while((g|0)!=0);j=i;i=0}g=0;if(e){k[e>>2]=a;k[e+4>>2]=b}o=(f|0)>>>31|(j|g)<<1|(g<<1|f>>>31)&0|i;p=(f<<1|0>>>31)&-2|h;return (L=o,p)|0}function wi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Pb[a&15](b|0,c|0,d|0)|0}function xi(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Qb[a&3](b|0,c|0,d|0,e|0,f|0)}function yi(a){a=a|0;return Rb[a&1]()|0}function zi(a,b){a=a|0;b=b|0;Sb[a&31](b|0)}function Ai(a,b,c){a=a|0;b=b|0;c=c|0;Tb[a&1](b|0,c|0)}function Bi(a,b){a=a|0;b=b|0;return Ub[a&7](b|0)|0}function Ci(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Vb[a&1](b|0,c|0,d|0)}function Di(a){a=a|0;Wb[a&3]()}function Ei(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Xb[a&1](b|0,c|0,d|0,e|0)|0}function Fi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Yb[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Gi(a,b,c){a=a|0;b=b|0;c=c|0;return Zb[a&1](b|0,c|0)|0}function Hi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;_b[a&3](b|0,c|0,d|0,e|0)}function Ii(a,b,c){a=a|0;b=b|0;c=c|0;ka(0);return 0}function Ji(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ka(1)}function Ki(){ka(2);return 0}function Li(a){a=a|0;ka(3)}function Mi(a,b){a=a|0;b=b|0;ka(4)}function Ni(a){a=a|0;ka(5);return 0}function Oi(a,b,c){a=a|0;b=b|0;c=c|0;ka(6)}function Pi(){ka(7)}function Qi(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ka(8);return 0}function Ri(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ka(9)}function Si(a,b){a=a|0;b=b|0;ka(10);return 0}function Ti(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ka(11)} + +// EMSCRIPTEN_END_FUNCS +var Pb=[Ii,ag,cg,Mg,Ng,Bh,th,sh,jc,Ii,Ii,Ii,Ii,Ii,Ii,Ii];var Qb=[Ji,Zg,Yg,Vg];var Rb=[Ki,ic];var Sb=[Li,dg,eg,fg,gg,tg,ug,Ag,Bg,Dg,Fg,Ig,Gg,Hg,Jg,Kg,Lg,fh,Kh,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li,Li];var Tb=[Mi,kc];var Ub=[Ni,vg,Cg,Fh,lc,Ni,Ni,Ni];var Vb=[Oi,nc];var Wb=[Pi,bh,ch,Pi];var Xb=[Qi,mc];var Yb=[Ri,ah,$g,_g];var Zb=[Si,Gf];var _b=[Ti,Pg,Qg,Sg];return{_i64Subtract:fi,_fflush:zh,_i64Add:ii,_memmove:li,_memset:gi,_malloc:Oh,_memcpy:ki,___getTypeName:hg,_llvm_bswap_i32:mi,_bitshift64Lshr:ji,_free:Ph,___errno_location:gh,_bitshift64Shl:hi,__GLOBAL__sub_I_fallback_cc:oc,__GLOBAL__sub_I_bind_cpp:jg,runPostSets:ei,_emscripten_replace_memory:Ob,stackAlloc:$b,stackSave:ac,stackRestore:bc,establishStackSpace:cc,setThrew:dc,setTempRet0:gc,getTempRet0:hc,dynCall_iiii:wi,dynCall_viiiii:xi,dynCall_i:yi,dynCall_vi:zi,dynCall_vii:Ai,dynCall_ii:Bi,dynCall_viii:Ci,dynCall_v:Di,dynCall_iiiii:Ei,dynCall_viiiiii:Fi,dynCall_iii:Gi,dynCall_viiii:Hi}}) + + +// EMSCRIPTEN_END_ASM +(Module.asmGlobalArg,Module.asmLibraryArg,buffer);var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var __GLOBAL__sub_I_bind_cpp=Module["__GLOBAL__sub_I_bind_cpp"]=asm["__GLOBAL__sub_I_bind_cpp"];var _fflush=Module["_fflush"]=asm["_fflush"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _memmove=Module["_memmove"]=asm["_memmove"];var _memset=Module["_memset"]=asm["_memset"];var _malloc=Module["_malloc"]=asm["_malloc"];var __GLOBAL__sub_I_fallback_cc=Module["__GLOBAL__sub_I_fallback_cc"]=asm["__GLOBAL__sub_I_fallback_cc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var ___getTypeName=Module["___getTypeName"]=asm["___getTypeName"];var ___errno_location=Module["___errno_location"]=asm["___errno_location"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=asm["_llvm_bswap_i32"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_i=Module["dynCall_i"]=asm["dynCall_i"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_vii=Module["dynCall_vii"]=asm["dynCall_vii"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_iiiii=Module["dynCall_iiiii"]=asm["dynCall_iiiii"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_iii=Module["dynCall_iii"]=asm["dynCall_iii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run();module.exports=Module;Module.inspect=(function(){return"[Module]"}) + + + + diff --git a/packages/字体精简工具/node_modules/ttf2woff2/package.json b/packages/字体精简工具/node_modules/ttf2woff2/package.json new file mode 100644 index 0000000..4a65996 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/package.json @@ -0,0 +1,87 @@ +{ + "_from": "ttf2woff2@3.0.0", + "_id": "ttf2woff2@3.0.0", + "_inBundle": false, + "_integrity": "sha1-r7ZKYD9i85ZoC9D8M7MS3gyILuY=", + "_location": "/ttf2woff2", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "ttf2woff2@3.0.0", + "name": "ttf2woff2", + "escapedName": "ttf2woff2", + "rawSpec": "3.0.0", + "saveSpec": null, + "fetchSpec": "3.0.0" + }, + "_requiredBy": [ + "/fontmin" + ], + "_resolved": "https://registry.npm.taobao.org/ttf2woff2/download/ttf2woff2-3.0.0.tgz", + "_shasum": "afb64a603f62f396680bd0fc33b312de0c882ee6", + "_spec": "ttf2woff2@3.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\fontmin", + "author": { + "name": "Nicolas Froidure" + }, + "bin": { + "ttf2woff2": "bin/ttf2woff2.js" + }, + "browser": "jssrc/index.js", + "bugs": { + "url": "https://github.com/nfroidure/ttf2woff2/issues" + }, + "bundleDependencies": false, + "dependencies": { + "bindings": "^1.3.0", + "bufferstreams": "^2.0.1", + "nan": "^2.10.0", + "node-gyp": "^4.0.0" + }, + "deprecated": false, + "description": "Convert TTF files to WOFF2 ones.", + "devDependencies": { + "coveralls": "^3.0.1", + "eslint": "^4.19.1", + "eslint-config-simplifield": "^7.1.0", + "istanbul": "^0.4.5", + "miniquery": "^1.1.2", + "mocha": "^5.2.0", + "mocha-lcov-reporter": "^1.3.0" + }, + "directories": { + "test": "tests" + }, + "engines": { + "node": ">= 4.0.0" + }, + "gypfile": true, + "homepage": "https://github.com/nfroidure/ttf2woff2", + "keywords": [ + "ttf", + "woff2", + "fonts" + ], + "license": "MIT", + "main": "src/index.js", + "name": "ttf2woff2", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/nfroidure/ttf2woff2.git" + }, + "scripts": { + "cli": "env NPM_RUN_CLI=1", + "configure": "node-gyp configure", + "cover": "istanbul cover --report html _mocha -- tests/*.mocha.js -R spec -t 5000", + "coveralls": "istanbul cover _mocha --report lcovonly -- tests/*.mocha.js -R spec -t 5000 && cat ./coverage/lcov.info | coveralls && rm -rf ./coverage", + "emcc": "miniquery -p \"targets.#.sources.#\" ./binding.gyp | grep -v \"csrc/addon.cc\" | xargs emcc --bind -o jssrc/ttf2woff2.js -O3 --memory-init-file 0 -s \"TOTAL_MEMORY=536870912\" -s \"ALLOW_MEMORY_GROWTH=1\" --post-js jssrc/post.js csrc/fallback.cc", + "emcc-debug": "miniquery -p \"targets.#.sources.#\" ./binding.gyp | grep -v \"csrc/addon.cc\" | xargs emcc --bind -o jssrc/ttf2woff2.js -s \"ALLOW_MEMORY_GROWTH=1\" -s \"ASSERTIONS=1\" --post-js jssrc/post.js csrc/fallback.cc", + "install": "((node-gyp configure && node-gyp build) > builderror.log) || (exit 0)", + "lint": "eslint src/*.js tests/*.src jssrc/index.js", + "make": "node-gyp build", + "preversion": "npm run lint && npm test", + "test": "mocha tests/*.mocha.js" + }, + "version": "3.0.0" +} diff --git a/packages/字体精简工具/node_modules/ttf2woff2/src/index.js b/packages/字体精简工具/node_modules/ttf2woff2/src/index.js new file mode 100644 index 0000000..37feecd --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/src/index.js @@ -0,0 +1,7 @@ +'use strict'; + +try { + module.exports = require('bindings')('addon.node').convert; +} catch (err) { + module.exports = require('../jssrc/index.js'); +} diff --git a/packages/字体精简工具/node_modules/ttf2woff2/tests/cli.mocha.js b/packages/字体精简工具/node_modules/ttf2woff2/tests/cli.mocha.js new file mode 100644 index 0000000..9425233 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/tests/cli.mocha.js @@ -0,0 +1,19 @@ +var fs = require('fs'); +var assert = require('assert'); + +describe('Testing CLI', function() { + + it("should work", function(done) { + this.timeout(5000); + assert.deepEqual( + (require('child_process').execSync)( + 'node ' + __dirname + '/../bin/ttf2woff2.js', { + input: fs.readFileSync(__dirname + '/expected/iconsfont.ttf') + } + ), + fs.readFileSync(__dirname + '/expected/iconsfont.woff2') + ); + done(); + }); + +}); diff --git a/packages/字体精简工具/node_modules/ttf2woff2/tests/expected/iconsfont.ttf b/packages/字体精简工具/node_modules/ttf2woff2/tests/expected/iconsfont.ttf new file mode 100644 index 0000000..54bbcb4 Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/tests/expected/iconsfont.ttf differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/tests/expected/iconsfont.woff2 b/packages/字体精简工具/node_modules/ttf2woff2/tests/expected/iconsfont.woff2 new file mode 100644 index 0000000..7680b2c Binary files /dev/null and b/packages/字体精简工具/node_modules/ttf2woff2/tests/expected/iconsfont.woff2 differ diff --git a/packages/字体精简工具/node_modules/ttf2woff2/tests/tests.mocha.js b/packages/字体精简工具/node_modules/ttf2woff2/tests/tests.mocha.js new file mode 100644 index 0000000..da5cdd1 --- /dev/null +++ b/packages/字体精简工具/node_modules/ttf2woff2/tests/tests.mocha.js @@ -0,0 +1,50 @@ +var fs = require('fs'); +var assert = require('assert'); + +describe('ttf2woff2', function() { + + it('should work from the main endpoint', function(done) { + this.timeout(10000); + var ttf2woff2 = require('../src/index'); + var inputContent = fs.readFileSync(__dirname + '/expected/iconsfont.ttf'); + var outputContent = ttf2woff2(inputContent); + + assert.equal(outputContent.length, 1072); + assert.equal(outputContent[1071], 0); + assert.deepEqual( + outputContent, + fs.readFileSync(__dirname + '/expected/iconsfont.woff2') + ); + done(); + }); + + it('should work from the native build', function(done) { + var ttf2woff2 = require('bindings')('addon.node').convert; + var inputContent = fs.readFileSync(__dirname + '/expected/iconsfont.ttf'); + var outputContent = ttf2woff2(inputContent); + + assert.equal(outputContent.length, 1072); + assert.equal(outputContent[1071], 0); + assert.deepEqual( + outputContent, + fs.readFileSync(__dirname + '/expected/iconsfont.woff2') + ); + done(); + }); + + it('should work from the emscripten endpoint', function(done) { + this.timeout(10000); + var ttf2woff2 = require('../jssrc/index.js'); + var inputContent = fs.readFileSync(__dirname + '/expected/iconsfont.ttf'); + var outputContent = ttf2woff2(inputContent); + + assert.equal(outputContent.length, 1072); + assert.equal(outputContent[1071], 0); + assert.deepEqual( + outputContent, + fs.readFileSync(__dirname + '/expected/iconsfont.woff2') + ); + done(); + }); + +}); diff --git a/packages/字体精简工具/node_modules/tunnel-agent/LICENSE b/packages/字体精简工具/node_modules/tunnel-agent/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/packages/字体精简工具/node_modules/tunnel-agent/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/tunnel-agent/README.md b/packages/字体精简工具/node_modules/tunnel-agent/README.md new file mode 100644 index 0000000..bb533d5 --- /dev/null +++ b/packages/字体精简工具/node_modules/tunnel-agent/README.md @@ -0,0 +1,4 @@ +tunnel-agent +============ + +HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module. diff --git a/packages/字体精简工具/node_modules/tunnel-agent/index.js b/packages/字体精简工具/node_modules/tunnel-agent/index.js new file mode 100644 index 0000000..3ee9abc --- /dev/null +++ b/packages/字体精简工具/node_modules/tunnel-agent/index.js @@ -0,0 +1,244 @@ +'use strict' + +var net = require('net') + , tls = require('tls') + , http = require('http') + , https = require('https') + , events = require('events') + , assert = require('assert') + , util = require('util') + , Buffer = require('safe-buffer').Buffer + ; + +exports.httpOverHttp = httpOverHttp +exports.httpsOverHttp = httpsOverHttp +exports.httpOverHttps = httpOverHttps +exports.httpsOverHttps = httpsOverHttps + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + return agent +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + agent.createSocket = createSecureSocket + agent.defaultPort = 443 + return agent +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + return agent +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + agent.createSocket = createSecureSocket + agent.defaultPort = 443 + return agent +} + + +function TunnelingAgent(options) { + var self = this + self.options = options || {} + self.proxyOptions = self.options.proxy || {} + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets + self.requests = [] + self.sockets = [] + + self.on('free', function onFree(socket, host, port) { + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i] + if (pending.host === host && pending.port === port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1) + pending.request.onSocket(socket) + return + } + } + socket.destroy() + self.removeSocket(socket) + }) +} +util.inherits(TunnelingAgent, events.EventEmitter) + +TunnelingAgent.prototype.addRequest = function addRequest(req, options) { + var self = this + + // Legacy API: addRequest(req, host, port, path) + if (typeof options === 'string') { + options = { + host: options, + port: arguments[2], + path: arguments[3] + }; + } + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push({host: options.host, port: options.port, request: req}) + return + } + + // If we are under maxSockets create a new one. + self.createConnection({host: options.host, port: options.port, request: req}) +} + +TunnelingAgent.prototype.createConnection = function createConnection(pending) { + var self = this + + self.createSocket(pending, function(socket) { + socket.on('free', onFree) + socket.on('close', onCloseOrRemove) + socket.on('agentRemove', onCloseOrRemove) + pending.request.onSocket(socket) + + function onFree() { + self.emit('free', socket, pending.host, pending.port) + } + + function onCloseOrRemove(err) { + self.removeSocket(socket) + socket.removeListener('free', onFree) + socket.removeListener('close', onCloseOrRemove) + socket.removeListener('agentRemove', onCloseOrRemove) + } + }) +} + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this + var placeholder = {} + self.sockets.push(placeholder) + + var connectOptions = mergeOptions({}, self.proxyOptions, + { method: 'CONNECT' + , path: options.host + ':' + options.port + , agent: false + } + ) + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {} + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + Buffer.from(connectOptions.proxyAuth).toString('base64') + } + + debug('making CONNECT request') + var connectReq = self.request(connectOptions) + connectReq.useChunkedEncodingByDefault = false // for v0.6 + connectReq.once('response', onResponse) // for v0.6 + connectReq.once('upgrade', onUpgrade) // for v0.6 + connectReq.once('connect', onConnect) // for v0.7 or later + connectReq.once('error', onError) + connectReq.end() + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head) + }) + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners() + socket.removeAllListeners() + + if (res.statusCode === 200) { + assert.equal(head.length, 0) + debug('tunneling connection has established') + self.sockets[self.sockets.indexOf(placeholder)] = socket + cb(socket) + } else { + debug('tunneling socket could not be established, statusCode=%d', res.statusCode) + var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } + } + + function onError(cause) { + connectReq.removeAllListeners() + + debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) + var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } +} + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) return + + this.sockets.splice(pos, 1) + + var pending = this.requests.shift() + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createConnection(pending) + } +} + +function createSecureSocket(options, cb) { + var self = this + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, mergeOptions({}, self.options, + { servername: options.host + , socket: socket + } + )) + self.sockets[self.sockets.indexOf(socket)] = secureSocket + cb(secureSocket) + }) +} + + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i] + if (typeof overrides === 'object') { + var keys = Object.keys(overrides) + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j] + if (overrides[k] !== undefined) { + target[k] = overrides[k] + } + } + } + } + return target +} + + +var debug +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments) + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0] + } else { + args.unshift('TUNNEL:') + } + console.error.apply(console, args) + } +} else { + debug = function() {} +} +exports.debug = debug // for test diff --git a/packages/字体精简工具/node_modules/tunnel-agent/package.json b/packages/字体精简工具/node_modules/tunnel-agent/package.json new file mode 100644 index 0000000..113586b --- /dev/null +++ b/packages/字体精简工具/node_modules/tunnel-agent/package.json @@ -0,0 +1,55 @@ +{ + "_from": "tunnel-agent@^0.6.0", + "_id": "tunnel-agent@0.6.0", + "_inBundle": false, + "_integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "_location": "/tunnel-agent", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "tunnel-agent@^0.6.0", + "name": "tunnel-agent", + "escapedName": "tunnel-agent", + "rawSpec": "^0.6.0", + "saveSpec": null, + "fetchSpec": "^0.6.0" + }, + "_requiredBy": [ + "/request" + ], + "_resolved": "https://registry.nlark.com/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "_shasum": "27a5dea06b36b04a0a9966774b290868f0fc40fd", + "_spec": "tunnel-agent@^0.6.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\request", + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com", + "url": "http://www.futurealoof.com" + }, + "bugs": { + "url": "https://github.com/mikeal/tunnel-agent/issues" + }, + "bundleDependencies": false, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "deprecated": false, + "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.", + "devDependencies": {}, + "engines": { + "node": "*" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/mikeal/tunnel-agent#readme", + "license": "Apache-2.0", + "main": "index.js", + "name": "tunnel-agent", + "optionalDependencies": {}, + "repository": { + "url": "git+https://github.com/mikeal/tunnel-agent.git" + }, + "version": "0.6.0" +} diff --git a/packages/字体精简工具/node_modules/tweetnacl/.npmignore b/packages/字体精简工具/node_modules/tweetnacl/.npmignore new file mode 100644 index 0000000..7d98dcb --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/.npmignore @@ -0,0 +1,4 @@ +.eslintrc +.travis.yml +bower.json +test diff --git a/packages/字体精简工具/node_modules/tweetnacl/AUTHORS.md b/packages/字体精简工具/node_modules/tweetnacl/AUTHORS.md new file mode 100644 index 0000000..6d74d40 --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/AUTHORS.md @@ -0,0 +1,28 @@ +List of TweetNaCl.js authors +============================ + + Alphabetical order by first name. + Format: Name (GitHub username or URL) + +* AndSDev (@AndSDev) +* Devi Mandiri (@devi) +* Dmitry Chestnykh (@dchest) + +List of authors of third-party public domain code from which TweetNaCl.js code was derived +========================================================================================== + +[TweetNaCl](http://tweetnacl.cr.yp.to/) +-------------------------------------- + +* Bernard van Gastel +* Daniel J. Bernstein +* Peter Schwabe +* Sjaak Smetsers +* Tanja Lange +* Wesley Janssen + + +[Poly1305-donna](https://github.com/floodyberry/poly1305-donna) +-------------------------------------------------------------- + +* Andrew Moon (@floodyberry) diff --git a/packages/字体精简工具/node_modules/tweetnacl/CHANGELOG.md b/packages/字体精简工具/node_modules/tweetnacl/CHANGELOG.md new file mode 100644 index 0000000..92a4fdc --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/CHANGELOG.md @@ -0,0 +1,221 @@ +TweetNaCl.js Changelog +====================== + + +v0.14.5 +------- + +* Fixed incomplete return types in TypeScript typings. +* Replaced COPYING.txt with LICENSE file, which now has public domain dedication + text from The Unlicense. License fields in package.json and bower.json have + been set to "Unlicense". The project was and will be in the public domain -- + this change just makes it easier for automated tools to know about this fact by + using the widely recognized and SPDX-compatible template for public domain + dedication. + + +v0.14.4 +------- + +* Added TypeScript type definitions (contributed by @AndSDev). +* Improved benchmarking code. + + +v0.14.3 +------- + +Fixed a bug in the fast version of Poly1305 and brought it back. + +Thanks to @floodyberry for promptly responding and fixing the original C code: + +> "The issue was not properly detecting if st->h was >= 2^130 - 5, coupled with +> [testing mistake] not catching the failure. The chance of the bug affecting +> anything in the real world is essentially zero luckily, but it's good to have +> it fixed." + +https://github.com/floodyberry/poly1305-donna/issues/2#issuecomment-202698577 + + +v0.14.2 +------- + +Switched Poly1305 fast version back to original (slow) version due to a bug. + + +v0.14.1 +------- + +No code changes, just tweaked packaging and added COPYING.txt. + + +v0.14.0 +------- + +* **Breaking change!** All functions from `nacl.util` have been removed. These + functions are no longer available: + + nacl.util.decodeUTF8 + nacl.util.encodeUTF8 + nacl.util.decodeBase64 + nacl.util.encodeBase64 + + If want to continue using them, you can include + package: + + + + + or + + var nacl = require('tweetnacl'); + nacl.util = require('tweetnacl-util'); + + However it is recommended to use better packages that have wider + compatibility and better performance. Functions from `nacl.util` were never + intended to be robust solution for string conversion and were included for + convenience: cryptography library is not the right place for them. + + Currently calling these functions will throw error pointing to + `tweetnacl-util-js` (in the next version this error message will be removed). + +* Improved detection of available random number generators, making it possible + to use `nacl.randomBytes` and related functions in Web Workers without + changes. + +* Changes to testing (see README). + + +v0.13.3 +------- + +No code changes. + +* Reverted license field in package.json to "Public domain". + +* Fixed typo in README. + + +v0.13.2 +------- + +* Fixed undefined variable bug in fast version of Poly1305. No worries, this + bug was *never* triggered. + +* Specified CC0 public domain dedication. + +* Updated development dependencies. + + +v0.13.1 +------- + +* Exclude `crypto` and `buffer` modules from browserify builds. + + +v0.13.0 +------- + +* Made `nacl-fast` the default version in NPM package. Now + `require("tweetnacl")` will use fast version; to get the original version, + use `require("tweetnacl/nacl.js")`. + +* Cleanup temporary array after generating random bytes. + + +v0.12.2 +------- + +* Improved performance of curve operations, making `nacl.scalarMult`, `nacl.box`, + `nacl.sign` and related functions up to 3x faster in `nacl-fast` version. + + +v0.12.1 +------- + +* Significantly improved performance of Salsa20 (~1.5x faster) and + Poly1305 (~3.5x faster) in `nacl-fast` version. + + +v0.12.0 +------- + +* Instead of using the given secret key directly, TweetNaCl.js now copies it to + a new array in `nacl.box.keyPair.fromSecretKey` and + `nacl.sign.keyPair.fromSecretKey`. + + +v0.11.2 +------- + +* Added new constant: `nacl.sign.seedLength`. + + +v0.11.1 +------- + +* Even faster hash for both short and long inputs (in `nacl-fast`). + + +v0.11.0 +------- + +* Implement `nacl.sign.keyPair.fromSeed` to enable creation of sign key pairs + deterministically from a 32-byte seed. (It behaves like + [libsodium's](http://doc.libsodium.org/public-key_cryptography/public-key_signatures.html) + `crypto_sign_seed_keypair`: the seed becomes a secret part of the secret key.) + +* Fast version now has an improved hash implementation that is 2x-5x faster. + +* Fixed benchmarks, which may have produced incorrect measurements. + + +v0.10.1 +------- + +* Exported undocumented `nacl.lowlevel.crypto_core_hsalsa20`. + + +v0.10.0 +------- + +* **Signature API breaking change!** `nacl.sign` and `nacl.sign.open` now deal + with signed messages, and new `nacl.sign.detached` and + `nacl.sign.detached.verify` are available. + + Previously, `nacl.sign` returned a signature, and `nacl.sign.open` accepted a + message and "detached" signature. This was unlike NaCl's API, which dealt with + signed messages (concatenation of signature and message). + + The new API is: + + nacl.sign(message, secretKey) -> signedMessage + nacl.sign.open(signedMessage, publicKey) -> message | null + + Since detached signatures are common, two new API functions were introduced: + + nacl.sign.detached(message, secretKey) -> signature + nacl.sign.detached.verify(message, signature, publicKey) -> true | false + + (Note that it's `verify`, not `open`, and it returns a boolean value, unlike + `open`, which returns an "unsigned" message.) + +* NPM package now comes without `test` directory to keep it small. + + +v0.9.2 +------ + +* Improved documentation. +* Fast version: increased theoretical message size limit from 2^32-1 to 2^52 + bytes in Poly1305 (and thus, secretbox and box). However this has no impact + in practice since JavaScript arrays or ArrayBuffers are limited to 32-bit + indexes, and most implementations won't allocate more than a gigabyte or so. + (Obviously, there are no tests for the correctness of implementation.) Also, + it's not recommended to use messages that large without splitting them into + smaller packets anyway. + + +v0.9.1 +------ + +* Initial release diff --git a/packages/字体精简工具/node_modules/tweetnacl/LICENSE b/packages/字体精简工具/node_modules/tweetnacl/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/packages/字体精简工具/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md b/packages/字体精简工具/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..a8eb4a9 --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,20 @@ +# Important! + +If your contribution is not trivial (not a typo fix, etc.), we can only accept +it if you dedicate your copyright for the contribution to the public domain. +Make sure you understand what it means (see http://unlicense.org/)! If you +agree, please add yourself to AUTHORS.md file, and include the following text +to your pull request description or a comment in it: + +------------------------------------------------------------------------------ + + I dedicate any and all copyright interest in this software to the + public domain. I make this dedication for the benefit of the public at + large and to the detriment of my heirs and successors. I intend this + dedication to be an overt act of relinquishment in perpetuity of all + present and future rights to this software under copyright law. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. diff --git a/packages/字体精简工具/node_modules/tweetnacl/README.md b/packages/字体精简工具/node_modules/tweetnacl/README.md new file mode 100644 index 0000000..ffb6871 --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/README.md @@ -0,0 +1,459 @@ +TweetNaCl.js +============ + +Port of [TweetNaCl](http://tweetnacl.cr.yp.to) / [NaCl](http://nacl.cr.yp.to/) +to JavaScript for modern browsers and Node.js. Public domain. + +[![Build Status](https://travis-ci.org/dchest/tweetnacl-js.svg?branch=master) +](https://travis-ci.org/dchest/tweetnacl-js) + +Demo: + +**:warning: The library is stable and API is frozen, however it has not been +independently reviewed. If you can help reviewing it, please [contact +me](mailto:dmitry@codingrobots.com).** + +Documentation +============= + +* [Overview](#overview) +* [Installation](#installation) +* [Usage](#usage) + * [Public-key authenticated encryption (box)](#public-key-authenticated-encryption-box) + * [Secret-key authenticated encryption (secretbox)](#secret-key-authenticated-encryption-secretbox) + * [Scalar multiplication](#scalar-multiplication) + * [Signatures](#signatures) + * [Hashing](#hashing) + * [Random bytes generation](#random-bytes-generation) + * [Constant-time comparison](#constant-time-comparison) +* [System requirements](#system-requirements) +* [Development and testing](#development-and-testing) +* [Benchmarks](#benchmarks) +* [Contributors](#contributors) +* [Who uses it](#who-uses-it) + + +Overview +-------- + +The primary goal of this project is to produce a translation of TweetNaCl to +JavaScript which is as close as possible to the original C implementation, plus +a thin layer of idiomatic high-level API on top of it. + +There are two versions, you can use either of them: + +* `nacl.js` is the port of TweetNaCl with minimum differences from the + original + high-level API. + +* `nacl-fast.js` is like `nacl.js`, but with some functions replaced with + faster versions. + + +Installation +------------ + +You can install TweetNaCl.js via a package manager: + +[Bower](http://bower.io): + + $ bower install tweetnacl + +[NPM](https://www.npmjs.org/): + + $ npm install tweetnacl + +or [download source code](https://github.com/dchest/tweetnacl-js/releases). + + +Usage +----- + +All API functions accept and return bytes as `Uint8Array`s. If you need to +encode or decode strings, use functions from + or one of the more robust codec +packages. + +In Node.js v4 and later `Buffer` objects are backed by `Uint8Array`s, so you +can freely pass them to TweetNaCl.js functions as arguments. The returned +objects are still `Uint8Array`s, so if you need `Buffer`s, you'll have to +convert them manually; make sure to convert using copying: `new Buffer(array)`, +instead of sharing: `new Buffer(array.buffer)`, because some functions return +subarrays of their buffers. + + +### Public-key authenticated encryption (box) + +Implements *curve25519-xsalsa20-poly1305*. + +#### nacl.box.keyPair() + +Generates a new random key pair for box and returns it as an object with +`publicKey` and `secretKey` members: + + { + publicKey: ..., // Uint8Array with 32-byte public key + secretKey: ... // Uint8Array with 32-byte secret key + } + + +#### nacl.box.keyPair.fromSecretKey(secretKey) + +Returns a key pair for box with public key corresponding to the given secret +key. + +#### nacl.box(message, nonce, theirPublicKey, mySecretKey) + +Encrypt and authenticates message using peer's public key, our secret key, and +the given nonce, which must be unique for each distinct message for a key pair. + +Returns an encrypted and authenticated message, which is +`nacl.box.overheadLength` longer than the original message. + +#### nacl.box.open(box, nonce, theirPublicKey, mySecretKey) + +Authenticates and decrypts the given box with peer's public key, our secret +key, and the given nonce. + +Returns the original message, or `false` if authentication fails. + +#### nacl.box.before(theirPublicKey, mySecretKey) + +Returns a precomputed shared key which can be used in `nacl.box.after` and +`nacl.box.open.after`. + +#### nacl.box.after(message, nonce, sharedKey) + +Same as `nacl.box`, but uses a shared key precomputed with `nacl.box.before`. + +#### nacl.box.open.after(box, nonce, sharedKey) + +Same as `nacl.box.open`, but uses a shared key precomputed with `nacl.box.before`. + +#### nacl.box.publicKeyLength = 32 + +Length of public key in bytes. + +#### nacl.box.secretKeyLength = 32 + +Length of secret key in bytes. + +#### nacl.box.sharedKeyLength = 32 + +Length of precomputed shared key in bytes. + +#### nacl.box.nonceLength = 24 + +Length of nonce in bytes. + +#### nacl.box.overheadLength = 16 + +Length of overhead added to box compared to original message. + + +### Secret-key authenticated encryption (secretbox) + +Implements *xsalsa20-poly1305*. + +#### nacl.secretbox(message, nonce, key) + +Encrypt and authenticates message using the key and the nonce. The nonce must +be unique for each distinct message for this key. + +Returns an encrypted and authenticated message, which is +`nacl.secretbox.overheadLength` longer than the original message. + +#### nacl.secretbox.open(box, nonce, key) + +Authenticates and decrypts the given secret box using the key and the nonce. + +Returns the original message, or `false` if authentication fails. + +#### nacl.secretbox.keyLength = 32 + +Length of key in bytes. + +#### nacl.secretbox.nonceLength = 24 + +Length of nonce in bytes. + +#### nacl.secretbox.overheadLength = 16 + +Length of overhead added to secret box compared to original message. + + +### Scalar multiplication + +Implements *curve25519*. + +#### nacl.scalarMult(n, p) + +Multiplies an integer `n` by a group element `p` and returns the resulting +group element. + +#### nacl.scalarMult.base(n) + +Multiplies an integer `n` by a standard group element and returns the resulting +group element. + +#### nacl.scalarMult.scalarLength = 32 + +Length of scalar in bytes. + +#### nacl.scalarMult.groupElementLength = 32 + +Length of group element in bytes. + + +### Signatures + +Implements [ed25519](http://ed25519.cr.yp.to). + +#### nacl.sign.keyPair() + +Generates new random key pair for signing and returns it as an object with +`publicKey` and `secretKey` members: + + { + publicKey: ..., // Uint8Array with 32-byte public key + secretKey: ... // Uint8Array with 64-byte secret key + } + +#### nacl.sign.keyPair.fromSecretKey(secretKey) + +Returns a signing key pair with public key corresponding to the given +64-byte secret key. The secret key must have been generated by +`nacl.sign.keyPair` or `nacl.sign.keyPair.fromSeed`. + +#### nacl.sign.keyPair.fromSeed(seed) + +Returns a new signing key pair generated deterministically from a 32-byte seed. +The seed must contain enough entropy to be secure. This method is not +recommended for general use: instead, use `nacl.sign.keyPair` to generate a new +key pair from a random seed. + +#### nacl.sign(message, secretKey) + +Signs the message using the secret key and returns a signed message. + +#### nacl.sign.open(signedMessage, publicKey) + +Verifies the signed message and returns the message without signature. + +Returns `null` if verification failed. + +#### nacl.sign.detached(message, secretKey) + +Signs the message using the secret key and returns a signature. + +#### nacl.sign.detached.verify(message, signature, publicKey) + +Verifies the signature for the message and returns `true` if verification +succeeded or `false` if it failed. + +#### nacl.sign.publicKeyLength = 32 + +Length of signing public key in bytes. + +#### nacl.sign.secretKeyLength = 64 + +Length of signing secret key in bytes. + +#### nacl.sign.seedLength = 32 + +Length of seed for `nacl.sign.keyPair.fromSeed` in bytes. + +#### nacl.sign.signatureLength = 64 + +Length of signature in bytes. + + +### Hashing + +Implements *SHA-512*. + +#### nacl.hash(message) + +Returns SHA-512 hash of the message. + +#### nacl.hash.hashLength = 64 + +Length of hash in bytes. + + +### Random bytes generation + +#### nacl.randomBytes(length) + +Returns a `Uint8Array` of the given length containing random bytes of +cryptographic quality. + +**Implementation note** + +TweetNaCl.js uses the following methods to generate random bytes, +depending on the platform it runs on: + +* `window.crypto.getRandomValues` (WebCrypto standard) +* `window.msCrypto.getRandomValues` (Internet Explorer 11) +* `crypto.randomBytes` (Node.js) + +If the platform doesn't provide a suitable PRNG, the following functions, +which require random numbers, will throw exception: + +* `nacl.randomBytes` +* `nacl.box.keyPair` +* `nacl.sign.keyPair` + +Other functions are deterministic and will continue working. + +If a platform you are targeting doesn't implement secure random number +generator, but you somehow have a cryptographically-strong source of entropy +(not `Math.random`!), and you know what you are doing, you can plug it into +TweetNaCl.js like this: + + nacl.setPRNG(function(x, n) { + // ... copy n random bytes into x ... + }); + +Note that `nacl.setPRNG` *completely replaces* internal random byte generator +with the one provided. + + +### Constant-time comparison + +#### nacl.verify(x, y) + +Compares `x` and `y` in constant time and returns `true` if their lengths are +non-zero and equal, and their contents are equal. + +Returns `false` if either of the arguments has zero length, or arguments have +different lengths, or their contents differ. + + +System requirements +------------------- + +TweetNaCl.js supports modern browsers that have a cryptographically secure +pseudorandom number generator and typed arrays, including the latest versions +of: + +* Chrome +* Firefox +* Safari (Mac, iOS) +* Internet Explorer 11 + +Other systems: + +* Node.js + + +Development and testing +------------------------ + +Install NPM modules needed for development: + + $ npm install + +To build minified versions: + + $ npm run build + +Tests use minified version, so make sure to rebuild it every time you change +`nacl.js` or `nacl-fast.js`. + +### Testing + +To run tests in Node.js: + + $ npm run test-node + +By default all tests described here work on `nacl.min.js`. To test other +versions, set environment variable `NACL_SRC` to the file name you want to test. +For example, the following command will test fast minified version: + + $ NACL_SRC=nacl-fast.min.js npm run test-node + +To run full suite of tests in Node.js, including comparing outputs of +JavaScript port to outputs of the original C version: + + $ npm run test-node-all + +To prepare tests for browsers: + + $ npm run build-test-browser + +and then open `test/browser/test.html` (or `test/browser/test-fast.html`) to +run them. + +To run headless browser tests with `tape-run` (powered by Electron): + + $ npm run test-browser + +(If you get `Error: spawn ENOENT`, install *xvfb*: `sudo apt-get install xvfb`.) + +To run tests in both Node and Electron: + + $ npm test + +### Benchmarking + +To run benchmarks in Node.js: + + $ npm run bench + $ NACL_SRC=nacl-fast.min.js npm run bench + +To run benchmarks in a browser, open `test/benchmark/bench.html` (or +`test/benchmark/bench-fast.html`). + + +Benchmarks +---------- + +For reference, here are benchmarks from MacBook Pro (Retina, 13-inch, Mid 2014) +laptop with 2.6 GHz Intel Core i5 CPU (Intel) in Chrome 53/OS X and Xiaomi Redmi +Note 3 smartphone with 1.8 GHz Qualcomm Snapdragon 650 64-bit CPU (ARM) in +Chrome 52/Android: + +| | nacl.js Intel | nacl-fast.js Intel | nacl.js ARM | nacl-fast.js ARM | +| ------------- |:-------------:|:-------------------:|:-------------:|:-----------------:| +| salsa20 | 1.3 MB/s | 128 MB/s | 0.4 MB/s | 43 MB/s | +| poly1305 | 13 MB/s | 171 MB/s | 4 MB/s | 52 MB/s | +| hash | 4 MB/s | 34 MB/s | 0.9 MB/s | 12 MB/s | +| secretbox 1K | 1113 op/s | 57583 op/s | 334 op/s | 14227 op/s | +| box 1K | 145 op/s | 718 op/s | 37 op/s | 368 op/s | +| scalarMult | 171 op/s | 733 op/s | 56 op/s | 380 op/s | +| sign | 77 op/s | 200 op/s | 20 op/s | 61 op/s | +| sign.open | 39 op/s | 102 op/s | 11 op/s | 31 op/s | + +(You can run benchmarks on your devices by clicking on the links at the bottom +of the [home page](https://tweetnacl.js.org)). + +In short, with *nacl-fast.js* and 1024-byte messages you can expect to encrypt and +authenticate more than 57000 messages per second on a typical laptop or more than +14000 messages per second on a $170 smartphone, sign about 200 and verify 100 +messages per second on a laptop or 60 and 30 messages per second on a smartphone, +per CPU core (with Web Workers you can do these operations in parallel), +which is good enough for most applications. + + +Contributors +------------ + +See AUTHORS.md file. + + +Third-party libraries based on TweetNaCl.js +------------------------------------------- + +* [forward-secrecy](https://github.com/alax/forward-secrecy) — Axolotl ratchet implementation +* [nacl-stream](https://github.com/dchest/nacl-stream-js) - streaming encryption +* [tweetnacl-auth-js](https://github.com/dchest/tweetnacl-auth-js) — implementation of [`crypto_auth`](http://nacl.cr.yp.to/auth.html) +* [chloride](https://github.com/dominictarr/chloride) - unified API for various NaCl modules + + +Who uses it +----------- + +Some notable users of TweetNaCl.js: + +* [miniLock](http://minilock.io/) +* [Stellar](https://www.stellar.org/) diff --git a/packages/字体精简工具/node_modules/tweetnacl/nacl-fast.js b/packages/字体精简工具/node_modules/tweetnacl/nacl-fast.js new file mode 100644 index 0000000..5e4562f --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/nacl-fast.js @@ -0,0 +1,2388 @@ +(function(nacl) { +'use strict'; + +// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. +// Public domain. +// +// Implementation derived from TweetNaCl version 20140427. +// See for details: http://tweetnacl.cr.yp.to/ + +var gf = function(init) { + var i, r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; +}; + +// Pluggable, initialized in high-level API below. +var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; + +var _0 = new Uint8Array(16); +var _9 = new Uint8Array(32); _9[0] = 9; + +var gf0 = gf(), + gf1 = gf([1]), + _121665 = gf([0xdb41, 1]), + D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), + D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), + X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), + Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), + I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); + +function ts64(x, i, h, l) { + x[i] = (h >> 24) & 0xff; + x[i+1] = (h >> 16) & 0xff; + x[i+2] = (h >> 8) & 0xff; + x[i+3] = h & 0xff; + x[i+4] = (l >> 24) & 0xff; + x[i+5] = (l >> 16) & 0xff; + x[i+6] = (l >> 8) & 0xff; + x[i+7] = l & 0xff; +} + +function vn(x, xi, y, yi, n) { + var i,d = 0; + for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; + return (1 & ((d - 1) >>> 8)) - 1; +} + +function crypto_verify_16(x, xi, y, yi) { + return vn(x,xi,y,yi,16); +} + +function crypto_verify_32(x, xi, y, yi) { + return vn(x,xi,y,yi,32); +} + +function core_salsa20(o, p, k, c) { + var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, + j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, + j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, + j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, + j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, + j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, + j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, + j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, + j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, + j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, + j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, + j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, + j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, + j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, + j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, + j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; + + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; + + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u<<7 | u>>>(32-7); + u = x4 + x0 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x4 | 0; + x12 ^= u<<13 | u>>>(32-13); + u = x12 + x8 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x1 | 0; + x9 ^= u<<7 | u>>>(32-7); + u = x9 + x5 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x9 | 0; + x1 ^= u<<13 | u>>>(32-13); + u = x1 + x13 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x6 | 0; + x14 ^= u<<7 | u>>>(32-7); + u = x14 + x10 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x14 | 0; + x6 ^= u<<13 | u>>>(32-13); + u = x6 + x2 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x11 | 0; + x3 ^= u<<7 | u>>>(32-7); + u = x3 + x15 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x3 | 0; + x11 ^= u<<13 | u>>>(32-13); + u = x11 + x7 | 0; + x15 ^= u<<18 | u>>>(32-18); + + u = x0 + x3 | 0; + x1 ^= u<<7 | u>>>(32-7); + u = x1 + x0 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x1 | 0; + x3 ^= u<<13 | u>>>(32-13); + u = x3 + x2 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x4 | 0; + x6 ^= u<<7 | u>>>(32-7); + u = x6 + x5 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x6 | 0; + x4 ^= u<<13 | u>>>(32-13); + u = x4 + x7 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x9 | 0; + x11 ^= u<<7 | u>>>(32-7); + u = x11 + x10 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x11 | 0; + x9 ^= u<<13 | u>>>(32-13); + u = x9 + x8 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x14 | 0; + x12 ^= u<<7 | u>>>(32-7); + u = x12 + x15 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x12 | 0; + x14 ^= u<<13 | u>>>(32-13); + u = x14 + x13 | 0; + x15 ^= u<<18 | u>>>(32-18); + } + x0 = x0 + j0 | 0; + x1 = x1 + j1 | 0; + x2 = x2 + j2 | 0; + x3 = x3 + j3 | 0; + x4 = x4 + j4 | 0; + x5 = x5 + j5 | 0; + x6 = x6 + j6 | 0; + x7 = x7 + j7 | 0; + x8 = x8 + j8 | 0; + x9 = x9 + j9 | 0; + x10 = x10 + j10 | 0; + x11 = x11 + j11 | 0; + x12 = x12 + j12 | 0; + x13 = x13 + j13 | 0; + x14 = x14 + j14 | 0; + x15 = x15 + j15 | 0; + + o[ 0] = x0 >>> 0 & 0xff; + o[ 1] = x0 >>> 8 & 0xff; + o[ 2] = x0 >>> 16 & 0xff; + o[ 3] = x0 >>> 24 & 0xff; + + o[ 4] = x1 >>> 0 & 0xff; + o[ 5] = x1 >>> 8 & 0xff; + o[ 6] = x1 >>> 16 & 0xff; + o[ 7] = x1 >>> 24 & 0xff; + + o[ 8] = x2 >>> 0 & 0xff; + o[ 9] = x2 >>> 8 & 0xff; + o[10] = x2 >>> 16 & 0xff; + o[11] = x2 >>> 24 & 0xff; + + o[12] = x3 >>> 0 & 0xff; + o[13] = x3 >>> 8 & 0xff; + o[14] = x3 >>> 16 & 0xff; + o[15] = x3 >>> 24 & 0xff; + + o[16] = x4 >>> 0 & 0xff; + o[17] = x4 >>> 8 & 0xff; + o[18] = x4 >>> 16 & 0xff; + o[19] = x4 >>> 24 & 0xff; + + o[20] = x5 >>> 0 & 0xff; + o[21] = x5 >>> 8 & 0xff; + o[22] = x5 >>> 16 & 0xff; + o[23] = x5 >>> 24 & 0xff; + + o[24] = x6 >>> 0 & 0xff; + o[25] = x6 >>> 8 & 0xff; + o[26] = x6 >>> 16 & 0xff; + o[27] = x6 >>> 24 & 0xff; + + o[28] = x7 >>> 0 & 0xff; + o[29] = x7 >>> 8 & 0xff; + o[30] = x7 >>> 16 & 0xff; + o[31] = x7 >>> 24 & 0xff; + + o[32] = x8 >>> 0 & 0xff; + o[33] = x8 >>> 8 & 0xff; + o[34] = x8 >>> 16 & 0xff; + o[35] = x8 >>> 24 & 0xff; + + o[36] = x9 >>> 0 & 0xff; + o[37] = x9 >>> 8 & 0xff; + o[38] = x9 >>> 16 & 0xff; + o[39] = x9 >>> 24 & 0xff; + + o[40] = x10 >>> 0 & 0xff; + o[41] = x10 >>> 8 & 0xff; + o[42] = x10 >>> 16 & 0xff; + o[43] = x10 >>> 24 & 0xff; + + o[44] = x11 >>> 0 & 0xff; + o[45] = x11 >>> 8 & 0xff; + o[46] = x11 >>> 16 & 0xff; + o[47] = x11 >>> 24 & 0xff; + + o[48] = x12 >>> 0 & 0xff; + o[49] = x12 >>> 8 & 0xff; + o[50] = x12 >>> 16 & 0xff; + o[51] = x12 >>> 24 & 0xff; + + o[52] = x13 >>> 0 & 0xff; + o[53] = x13 >>> 8 & 0xff; + o[54] = x13 >>> 16 & 0xff; + o[55] = x13 >>> 24 & 0xff; + + o[56] = x14 >>> 0 & 0xff; + o[57] = x14 >>> 8 & 0xff; + o[58] = x14 >>> 16 & 0xff; + o[59] = x14 >>> 24 & 0xff; + + o[60] = x15 >>> 0 & 0xff; + o[61] = x15 >>> 8 & 0xff; + o[62] = x15 >>> 16 & 0xff; + o[63] = x15 >>> 24 & 0xff; +} + +function core_hsalsa20(o,p,k,c) { + var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, + j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, + j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, + j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, + j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, + j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, + j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, + j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, + j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, + j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, + j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, + j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, + j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, + j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, + j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, + j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; + + var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, + x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, + x15 = j15, u; + + for (var i = 0; i < 20; i += 2) { + u = x0 + x12 | 0; + x4 ^= u<<7 | u>>>(32-7); + u = x4 + x0 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x4 | 0; + x12 ^= u<<13 | u>>>(32-13); + u = x12 + x8 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x1 | 0; + x9 ^= u<<7 | u>>>(32-7); + u = x9 + x5 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x9 | 0; + x1 ^= u<<13 | u>>>(32-13); + u = x1 + x13 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x6 | 0; + x14 ^= u<<7 | u>>>(32-7); + u = x14 + x10 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x14 | 0; + x6 ^= u<<13 | u>>>(32-13); + u = x6 + x2 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x11 | 0; + x3 ^= u<<7 | u>>>(32-7); + u = x3 + x15 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x3 | 0; + x11 ^= u<<13 | u>>>(32-13); + u = x11 + x7 | 0; + x15 ^= u<<18 | u>>>(32-18); + + u = x0 + x3 | 0; + x1 ^= u<<7 | u>>>(32-7); + u = x1 + x0 | 0; + x2 ^= u<<9 | u>>>(32-9); + u = x2 + x1 | 0; + x3 ^= u<<13 | u>>>(32-13); + u = x3 + x2 | 0; + x0 ^= u<<18 | u>>>(32-18); + + u = x5 + x4 | 0; + x6 ^= u<<7 | u>>>(32-7); + u = x6 + x5 | 0; + x7 ^= u<<9 | u>>>(32-9); + u = x7 + x6 | 0; + x4 ^= u<<13 | u>>>(32-13); + u = x4 + x7 | 0; + x5 ^= u<<18 | u>>>(32-18); + + u = x10 + x9 | 0; + x11 ^= u<<7 | u>>>(32-7); + u = x11 + x10 | 0; + x8 ^= u<<9 | u>>>(32-9); + u = x8 + x11 | 0; + x9 ^= u<<13 | u>>>(32-13); + u = x9 + x8 | 0; + x10 ^= u<<18 | u>>>(32-18); + + u = x15 + x14 | 0; + x12 ^= u<<7 | u>>>(32-7); + u = x12 + x15 | 0; + x13 ^= u<<9 | u>>>(32-9); + u = x13 + x12 | 0; + x14 ^= u<<13 | u>>>(32-13); + u = x14 + x13 | 0; + x15 ^= u<<18 | u>>>(32-18); + } + + o[ 0] = x0 >>> 0 & 0xff; + o[ 1] = x0 >>> 8 & 0xff; + o[ 2] = x0 >>> 16 & 0xff; + o[ 3] = x0 >>> 24 & 0xff; + + o[ 4] = x5 >>> 0 & 0xff; + o[ 5] = x5 >>> 8 & 0xff; + o[ 6] = x5 >>> 16 & 0xff; + o[ 7] = x5 >>> 24 & 0xff; + + o[ 8] = x10 >>> 0 & 0xff; + o[ 9] = x10 >>> 8 & 0xff; + o[10] = x10 >>> 16 & 0xff; + o[11] = x10 >>> 24 & 0xff; + + o[12] = x15 >>> 0 & 0xff; + o[13] = x15 >>> 8 & 0xff; + o[14] = x15 >>> 16 & 0xff; + o[15] = x15 >>> 24 & 0xff; + + o[16] = x6 >>> 0 & 0xff; + o[17] = x6 >>> 8 & 0xff; + o[18] = x6 >>> 16 & 0xff; + o[19] = x6 >>> 24 & 0xff; + + o[20] = x7 >>> 0 & 0xff; + o[21] = x7 >>> 8 & 0xff; + o[22] = x7 >>> 16 & 0xff; + o[23] = x7 >>> 24 & 0xff; + + o[24] = x8 >>> 0 & 0xff; + o[25] = x8 >>> 8 & 0xff; + o[26] = x8 >>> 16 & 0xff; + o[27] = x8 >>> 24 & 0xff; + + o[28] = x9 >>> 0 & 0xff; + o[29] = x9 >>> 8 & 0xff; + o[30] = x9 >>> 16 & 0xff; + o[31] = x9 >>> 24 & 0xff; +} + +function crypto_core_salsa20(out,inp,k,c) { + core_salsa20(out,inp,k,c); +} + +function crypto_core_hsalsa20(out,inp,k,c) { + core_hsalsa20(out,inp,k,c); +} + +var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); + // "expand 32-byte k" + +function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i]; + } + return 0; +} + +function crypto_stream_salsa20(c,cpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = x[i]; + } + return 0; +} + +function crypto_stream(c,cpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i+16]; + return crypto_stream_salsa20(c,cpos,d,sn,s); +} + +function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + var sn = new Uint8Array(8); + for (var i = 0; i < 8; i++) sn[i] = n[i+16]; + return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s); +} + +/* +* Port of Andrew Moon's Poly1305-donna-16. Public domain. +* https://github.com/floodyberry/poly1305-donna +*/ + +var poly1305 = function(key) { + this.buffer = new Uint8Array(16); + this.r = new Uint16Array(10); + this.h = new Uint16Array(10); + this.pad = new Uint16Array(8); + this.leftover = 0; + this.fin = 0; + + var t0, t1, t2, t3, t4, t5, t6, t7; + + t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff; + t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; + t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; + this.r[5] = ((t4 >>> 1)) & 0x1ffe; + t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; + t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + this.r[9] = ((t7 >>> 5)) & 0x007f; + + this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; + this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; + this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; + this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; + this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; + this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; + this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; + this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; +}; + +poly1305.prototype.blocks = function(m, mpos, bytes) { + var hibit = this.fin ? 0 : (1 << 11); + var t0, t1, t2, t3, t4, t5, t6, t7, c; + var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; + + var h0 = this.h[0], + h1 = this.h[1], + h2 = this.h[2], + h3 = this.h[3], + h4 = this.h[4], + h5 = this.h[5], + h6 = this.h[6], + h7 = this.h[7], + h8 = this.h[8], + h9 = this.h[9]; + + var r0 = this.r[0], + r1 = this.r[1], + r2 = this.r[2], + r3 = this.r[3], + r4 = this.r[4], + r5 = this.r[5], + r6 = this.r[6], + r7 = this.r[7], + r8 = this.r[8], + r9 = this.r[9]; + + while (bytes >= 16) { + t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff; + t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; + t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; + t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; + t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; + h5 += ((t4 >>> 1)) & 0x1fff; + t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; + t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; + t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; + h9 += ((t7 >>> 5)) | hibit; + + c = 0; + + d0 = c; + d0 += h0 * r0; + d0 += h1 * (5 * r9); + d0 += h2 * (5 * r8); + d0 += h3 * (5 * r7); + d0 += h4 * (5 * r6); + c = (d0 >>> 13); d0 &= 0x1fff; + d0 += h5 * (5 * r5); + d0 += h6 * (5 * r4); + d0 += h7 * (5 * r3); + d0 += h8 * (5 * r2); + d0 += h9 * (5 * r1); + c += (d0 >>> 13); d0 &= 0x1fff; + + d1 = c; + d1 += h0 * r1; + d1 += h1 * r0; + d1 += h2 * (5 * r9); + d1 += h3 * (5 * r8); + d1 += h4 * (5 * r7); + c = (d1 >>> 13); d1 &= 0x1fff; + d1 += h5 * (5 * r6); + d1 += h6 * (5 * r5); + d1 += h7 * (5 * r4); + d1 += h8 * (5 * r3); + d1 += h9 * (5 * r2); + c += (d1 >>> 13); d1 &= 0x1fff; + + d2 = c; + d2 += h0 * r2; + d2 += h1 * r1; + d2 += h2 * r0; + d2 += h3 * (5 * r9); + d2 += h4 * (5 * r8); + c = (d2 >>> 13); d2 &= 0x1fff; + d2 += h5 * (5 * r7); + d2 += h6 * (5 * r6); + d2 += h7 * (5 * r5); + d2 += h8 * (5 * r4); + d2 += h9 * (5 * r3); + c += (d2 >>> 13); d2 &= 0x1fff; + + d3 = c; + d3 += h0 * r3; + d3 += h1 * r2; + d3 += h2 * r1; + d3 += h3 * r0; + d3 += h4 * (5 * r9); + c = (d3 >>> 13); d3 &= 0x1fff; + d3 += h5 * (5 * r8); + d3 += h6 * (5 * r7); + d3 += h7 * (5 * r6); + d3 += h8 * (5 * r5); + d3 += h9 * (5 * r4); + c += (d3 >>> 13); d3 &= 0x1fff; + + d4 = c; + d4 += h0 * r4; + d4 += h1 * r3; + d4 += h2 * r2; + d4 += h3 * r1; + d4 += h4 * r0; + c = (d4 >>> 13); d4 &= 0x1fff; + d4 += h5 * (5 * r9); + d4 += h6 * (5 * r8); + d4 += h7 * (5 * r7); + d4 += h8 * (5 * r6); + d4 += h9 * (5 * r5); + c += (d4 >>> 13); d4 &= 0x1fff; + + d5 = c; + d5 += h0 * r5; + d5 += h1 * r4; + d5 += h2 * r3; + d5 += h3 * r2; + d5 += h4 * r1; + c = (d5 >>> 13); d5 &= 0x1fff; + d5 += h5 * r0; + d5 += h6 * (5 * r9); + d5 += h7 * (5 * r8); + d5 += h8 * (5 * r7); + d5 += h9 * (5 * r6); + c += (d5 >>> 13); d5 &= 0x1fff; + + d6 = c; + d6 += h0 * r6; + d6 += h1 * r5; + d6 += h2 * r4; + d6 += h3 * r3; + d6 += h4 * r2; + c = (d6 >>> 13); d6 &= 0x1fff; + d6 += h5 * r1; + d6 += h6 * r0; + d6 += h7 * (5 * r9); + d6 += h8 * (5 * r8); + d6 += h9 * (5 * r7); + c += (d6 >>> 13); d6 &= 0x1fff; + + d7 = c; + d7 += h0 * r7; + d7 += h1 * r6; + d7 += h2 * r5; + d7 += h3 * r4; + d7 += h4 * r3; + c = (d7 >>> 13); d7 &= 0x1fff; + d7 += h5 * r2; + d7 += h6 * r1; + d7 += h7 * r0; + d7 += h8 * (5 * r9); + d7 += h9 * (5 * r8); + c += (d7 >>> 13); d7 &= 0x1fff; + + d8 = c; + d8 += h0 * r8; + d8 += h1 * r7; + d8 += h2 * r6; + d8 += h3 * r5; + d8 += h4 * r4; + c = (d8 >>> 13); d8 &= 0x1fff; + d8 += h5 * r3; + d8 += h6 * r2; + d8 += h7 * r1; + d8 += h8 * r0; + d8 += h9 * (5 * r9); + c += (d8 >>> 13); d8 &= 0x1fff; + + d9 = c; + d9 += h0 * r9; + d9 += h1 * r8; + d9 += h2 * r7; + d9 += h3 * r6; + d9 += h4 * r5; + c = (d9 >>> 13); d9 &= 0x1fff; + d9 += h5 * r4; + d9 += h6 * r3; + d9 += h7 * r2; + d9 += h8 * r1; + d9 += h9 * r0; + c += (d9 >>> 13); d9 &= 0x1fff; + + c = (((c << 2) + c)) | 0; + c = (c + d0) | 0; + d0 = c & 0x1fff; + c = (c >>> 13); + d1 += c; + + h0 = d0; + h1 = d1; + h2 = d2; + h3 = d3; + h4 = d4; + h5 = d5; + h6 = d6; + h7 = d7; + h8 = d8; + h9 = d9; + + mpos += 16; + bytes -= 16; + } + this.h[0] = h0; + this.h[1] = h1; + this.h[2] = h2; + this.h[3] = h3; + this.h[4] = h4; + this.h[5] = h5; + this.h[6] = h6; + this.h[7] = h7; + this.h[8] = h8; + this.h[9] = h9; +}; + +poly1305.prototype.finish = function(mac, macpos) { + var g = new Uint16Array(10); + var c, mask, f, i; + + if (this.leftover) { + i = this.leftover; + this.buffer[i++] = 1; + for (; i < 16; i++) this.buffer[i] = 0; + this.fin = 1; + this.blocks(this.buffer, 0, 16); + } + + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + for (i = 2; i < 10; i++) { + this.h[i] += c; + c = this.h[i] >>> 13; + this.h[i] &= 0x1fff; + } + this.h[0] += (c * 5); + c = this.h[0] >>> 13; + this.h[0] &= 0x1fff; + this.h[1] += c; + c = this.h[1] >>> 13; + this.h[1] &= 0x1fff; + this.h[2] += c; + + g[0] = this.h[0] + 5; + c = g[0] >>> 13; + g[0] &= 0x1fff; + for (i = 1; i < 10; i++) { + g[i] = this.h[i] + c; + c = g[i] >>> 13; + g[i] &= 0x1fff; + } + g[9] -= (1 << 13); + + mask = (c ^ 1) - 1; + for (i = 0; i < 10; i++) g[i] &= mask; + mask = ~mask; + for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; + + this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff; + this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff; + this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff; + this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff; + this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; + this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff; + this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff; + this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff; + + f = this.h[0] + this.pad[0]; + this.h[0] = f & 0xffff; + for (i = 1; i < 8; i++) { + f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; + this.h[i] = f & 0xffff; + } + + mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff; + mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff; + mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff; + mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff; + mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff; + mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff; + mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff; + mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff; + mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff; + mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff; + mac[macpos+10] = (this.h[5] >>> 0) & 0xff; + mac[macpos+11] = (this.h[5] >>> 8) & 0xff; + mac[macpos+12] = (this.h[6] >>> 0) & 0xff; + mac[macpos+13] = (this.h[6] >>> 8) & 0xff; + mac[macpos+14] = (this.h[7] >>> 0) & 0xff; + mac[macpos+15] = (this.h[7] >>> 8) & 0xff; +}; + +poly1305.prototype.update = function(m, mpos, bytes) { + var i, want; + + if (this.leftover) { + want = (16 - this.leftover); + if (want > bytes) + want = bytes; + for (i = 0; i < want; i++) + this.buffer[this.leftover + i] = m[mpos+i]; + bytes -= want; + mpos += want; + this.leftover += want; + if (this.leftover < 16) + return; + this.blocks(this.buffer, 0, 16); + this.leftover = 0; + } + + if (bytes >= 16) { + want = bytes - (bytes % 16); + this.blocks(m, mpos, want); + mpos += want; + bytes -= want; + } + + if (bytes) { + for (i = 0; i < bytes; i++) + this.buffer[this.leftover + i] = m[mpos+i]; + this.leftover += bytes; + } +}; + +function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s = new poly1305(k); + s.update(m, mpos, n); + s.finish(out, outpos); + return 0; +} + +function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { + var x = new Uint8Array(16); + crypto_onetimeauth(x,0,m,mpos,n,k); + return crypto_verify_16(h,hpos,x,0); +} + +function crypto_secretbox(c,m,d,n,k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c,0,m,0,d,n,k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; +} + +function crypto_secretbox_open(m,c,d,n,k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x,0,32,n,k); + if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; + crypto_stream_xor(m,0,c,0,d,n,k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; +} + +function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i]|0; +} + +function car25519(o) { + var i, v, c = 1; + for (i = 0; i < 16; i++) { + v = o[i] + c + 65535; + c = Math.floor(v / 65536); + o[i] = v - c * 65536; + } + o[0] += c-1 + 37 * (c-1); +} + +function sel25519(p, q, b) { + var t, c = ~(b-1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } +} + +function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); + m[i-1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); + b = (m[15]>>16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1-b); + } + for (i = 0; i < 16; i++) { + o[2*i] = t[i] & 0xff; + o[2*i+1] = t[i]>>8; + } +} + +function neq25519(a, b) { + var c = new Uint8Array(32), d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); +} + +function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; +} + +function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); + o[15] &= 0x7fff; +} + +function A(o, a, b) { + for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; +} + +function Z(o, a, b) { + for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; +} + +function M(o, a, b) { + var v, c, + t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, + t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, + t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, + t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, + b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7], + b8 = b[8], + b9 = b[9], + b10 = b[10], + b11 = b[11], + b12 = b[12], + b13 = b[13], + b14 = b[14], + b15 = b[15]; + + v = a[0]; + t0 += v * b0; + t1 += v * b1; + t2 += v * b2; + t3 += v * b3; + t4 += v * b4; + t5 += v * b5; + t6 += v * b6; + t7 += v * b7; + t8 += v * b8; + t9 += v * b9; + t10 += v * b10; + t11 += v * b11; + t12 += v * b12; + t13 += v * b13; + t14 += v * b14; + t15 += v * b15; + v = a[1]; + t1 += v * b0; + t2 += v * b1; + t3 += v * b2; + t4 += v * b3; + t5 += v * b4; + t6 += v * b5; + t7 += v * b6; + t8 += v * b7; + t9 += v * b8; + t10 += v * b9; + t11 += v * b10; + t12 += v * b11; + t13 += v * b12; + t14 += v * b13; + t15 += v * b14; + t16 += v * b15; + v = a[2]; + t2 += v * b0; + t3 += v * b1; + t4 += v * b2; + t5 += v * b3; + t6 += v * b4; + t7 += v * b5; + t8 += v * b6; + t9 += v * b7; + t10 += v * b8; + t11 += v * b9; + t12 += v * b10; + t13 += v * b11; + t14 += v * b12; + t15 += v * b13; + t16 += v * b14; + t17 += v * b15; + v = a[3]; + t3 += v * b0; + t4 += v * b1; + t5 += v * b2; + t6 += v * b3; + t7 += v * b4; + t8 += v * b5; + t9 += v * b6; + t10 += v * b7; + t11 += v * b8; + t12 += v * b9; + t13 += v * b10; + t14 += v * b11; + t15 += v * b12; + t16 += v * b13; + t17 += v * b14; + t18 += v * b15; + v = a[4]; + t4 += v * b0; + t5 += v * b1; + t6 += v * b2; + t7 += v * b3; + t8 += v * b4; + t9 += v * b5; + t10 += v * b6; + t11 += v * b7; + t12 += v * b8; + t13 += v * b9; + t14 += v * b10; + t15 += v * b11; + t16 += v * b12; + t17 += v * b13; + t18 += v * b14; + t19 += v * b15; + v = a[5]; + t5 += v * b0; + t6 += v * b1; + t7 += v * b2; + t8 += v * b3; + t9 += v * b4; + t10 += v * b5; + t11 += v * b6; + t12 += v * b7; + t13 += v * b8; + t14 += v * b9; + t15 += v * b10; + t16 += v * b11; + t17 += v * b12; + t18 += v * b13; + t19 += v * b14; + t20 += v * b15; + v = a[6]; + t6 += v * b0; + t7 += v * b1; + t8 += v * b2; + t9 += v * b3; + t10 += v * b4; + t11 += v * b5; + t12 += v * b6; + t13 += v * b7; + t14 += v * b8; + t15 += v * b9; + t16 += v * b10; + t17 += v * b11; + t18 += v * b12; + t19 += v * b13; + t20 += v * b14; + t21 += v * b15; + v = a[7]; + t7 += v * b0; + t8 += v * b1; + t9 += v * b2; + t10 += v * b3; + t11 += v * b4; + t12 += v * b5; + t13 += v * b6; + t14 += v * b7; + t15 += v * b8; + t16 += v * b9; + t17 += v * b10; + t18 += v * b11; + t19 += v * b12; + t20 += v * b13; + t21 += v * b14; + t22 += v * b15; + v = a[8]; + t8 += v * b0; + t9 += v * b1; + t10 += v * b2; + t11 += v * b3; + t12 += v * b4; + t13 += v * b5; + t14 += v * b6; + t15 += v * b7; + t16 += v * b8; + t17 += v * b9; + t18 += v * b10; + t19 += v * b11; + t20 += v * b12; + t21 += v * b13; + t22 += v * b14; + t23 += v * b15; + v = a[9]; + t9 += v * b0; + t10 += v * b1; + t11 += v * b2; + t12 += v * b3; + t13 += v * b4; + t14 += v * b5; + t15 += v * b6; + t16 += v * b7; + t17 += v * b8; + t18 += v * b9; + t19 += v * b10; + t20 += v * b11; + t21 += v * b12; + t22 += v * b13; + t23 += v * b14; + t24 += v * b15; + v = a[10]; + t10 += v * b0; + t11 += v * b1; + t12 += v * b2; + t13 += v * b3; + t14 += v * b4; + t15 += v * b5; + t16 += v * b6; + t17 += v * b7; + t18 += v * b8; + t19 += v * b9; + t20 += v * b10; + t21 += v * b11; + t22 += v * b12; + t23 += v * b13; + t24 += v * b14; + t25 += v * b15; + v = a[11]; + t11 += v * b0; + t12 += v * b1; + t13 += v * b2; + t14 += v * b3; + t15 += v * b4; + t16 += v * b5; + t17 += v * b6; + t18 += v * b7; + t19 += v * b8; + t20 += v * b9; + t21 += v * b10; + t22 += v * b11; + t23 += v * b12; + t24 += v * b13; + t25 += v * b14; + t26 += v * b15; + v = a[12]; + t12 += v * b0; + t13 += v * b1; + t14 += v * b2; + t15 += v * b3; + t16 += v * b4; + t17 += v * b5; + t18 += v * b6; + t19 += v * b7; + t20 += v * b8; + t21 += v * b9; + t22 += v * b10; + t23 += v * b11; + t24 += v * b12; + t25 += v * b13; + t26 += v * b14; + t27 += v * b15; + v = a[13]; + t13 += v * b0; + t14 += v * b1; + t15 += v * b2; + t16 += v * b3; + t17 += v * b4; + t18 += v * b5; + t19 += v * b6; + t20 += v * b7; + t21 += v * b8; + t22 += v * b9; + t23 += v * b10; + t24 += v * b11; + t25 += v * b12; + t26 += v * b13; + t27 += v * b14; + t28 += v * b15; + v = a[14]; + t14 += v * b0; + t15 += v * b1; + t16 += v * b2; + t17 += v * b3; + t18 += v * b4; + t19 += v * b5; + t20 += v * b6; + t21 += v * b7; + t22 += v * b8; + t23 += v * b9; + t24 += v * b10; + t25 += v * b11; + t26 += v * b12; + t27 += v * b13; + t28 += v * b14; + t29 += v * b15; + v = a[15]; + t15 += v * b0; + t16 += v * b1; + t17 += v * b2; + t18 += v * b3; + t19 += v * b4; + t20 += v * b5; + t21 += v * b6; + t22 += v * b7; + t23 += v * b8; + t24 += v * b9; + t25 += v * b10; + t26 += v * b11; + t27 += v * b12; + t28 += v * b13; + t29 += v * b14; + t30 += v * b15; + + t0 += 38 * t16; + t1 += 38 * t17; + t2 += 38 * t18; + t3 += 38 * t19; + t4 += 38 * t20; + t5 += 38 * t21; + t6 += 38 * t22; + t7 += 38 * t23; + t8 += 38 * t24; + t9 += 38 * t25; + t10 += 38 * t26; + t11 += 38 * t27; + t12 += 38 * t28; + t13 += 38 * t29; + t14 += 38 * t30; + // t15 left as is + + // first car + c = 1; + v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; + v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; + v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; + v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; + v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; + v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; + v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; + v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; + v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; + v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; + v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; + v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; + v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; + v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; + v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; + v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; + t0 += c-1 + 37 * (c-1); + + // second car + c = 1; + v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; + v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; + v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; + v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; + v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; + v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; + v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; + v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; + v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; + v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; + v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; + v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; + v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; + v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; + v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; + v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; + t0 += c-1 + 37 * (c-1); + + o[ 0] = t0; + o[ 1] = t1; + o[ 2] = t2; + o[ 3] = t3; + o[ 4] = t4; + o[ 5] = t5; + o[ 6] = t6; + o[ 7] = t7; + o[ 8] = t8; + o[ 9] = t9; + o[10] = t10; + o[11] = t11; + o[12] = t12; + o[13] = t13; + o[14] = t14; + o[15] = t15; +} + +function S(o, a) { + M(o, a, a); +} + +function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { + S(c, c); + if(a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if(a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function crypto_scalarmult(q, n, p) { + var z = new Uint8Array(32); + var x = new Float64Array(80), r, i; + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31]=(n[31]&127)|64; + z[0]&=248; + unpack25519(x,p); + for (i = 0; i < 16; i++) { + b[i]=x[i]; + d[i]=a[i]=c[i]=0; + } + a[0]=d[0]=1; + for (i=254; i>=0; --i) { + r=(z[i>>>3]>>>(i&7))&1; + sel25519(a,b,r); + sel25519(c,d,r); + A(e,a,c); + Z(a,a,c); + A(c,b,d); + Z(b,b,d); + S(d,e); + S(f,a); + M(a,c,a); + M(c,b,e); + A(e,a,c); + Z(a,a,c); + S(b,a); + Z(c,d,f); + M(a,c,_121665); + A(a,a,d); + M(c,c,a); + M(a,d,f); + M(d,b,x); + S(b,e); + sel25519(a,b,r); + sel25519(c,d,r); + } + for (i = 0; i < 16; i++) { + x[i+16]=a[i]; + x[i+32]=c[i]; + x[i+48]=b[i]; + x[i+64]=d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32,x32); + M(x16,x16,x32); + pack25519(q,x16); + return 0; +} + +function crypto_scalarmult_base(q, n) { + return crypto_scalarmult(q, n, _9); +} + +function crypto_box_keypair(y, x) { + randombytes(x, 32); + return crypto_scalarmult_base(y, x); +} + +function crypto_box_beforenm(k, y, x) { + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); +} + +var crypto_box_afternm = crypto_secretbox; +var crypto_box_open_afternm = crypto_secretbox_open; + +function crypto_box(c, m, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); +} + +function crypto_box_open(m, c, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); +} + +var K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +]; + +function crypto_hashblocks_hl(hh, hl, m, n) { + var wh = new Int32Array(16), wl = new Int32Array(16), + bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, + bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, + th, tl, i, j, h, l, a, b, c, d; + + var ah0 = hh[0], + ah1 = hh[1], + ah2 = hh[2], + ah3 = hh[3], + ah4 = hh[4], + ah5 = hh[5], + ah6 = hh[6], + ah7 = hh[7], + + al0 = hl[0], + al1 = hl[1], + al2 = hl[2], + al3 = hl[3], + al4 = hl[4], + al5 = hl[5], + al6 = hl[6], + al7 = hl[7]; + + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) { + j = 8 * i + pos; + wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3]; + wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7]; + } + for (i = 0; i < 80; i++) { + bh0 = ah0; + bh1 = ah1; + bh2 = ah2; + bh3 = ah3; + bh4 = ah4; + bh5 = ah5; + bh6 = ah6; + bh7 = ah7; + + bl0 = al0; + bl1 = al1; + bl2 = al2; + bl3 = al3; + bl4 = al4; + bl5 = al5; + bl6 = al6; + bl7 = al7; + + // add + h = ah7; + l = al7; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + // Sigma1 + h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32)))); + l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32)))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // Ch + h = (ah4 & ah5) ^ (~ah4 & ah6); + l = (al4 & al5) ^ (~al4 & al6); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // K + h = K[i*2]; + l = K[i*2+1]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // w + h = wh[i%16]; + l = wl[i%16]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + th = c & 0xffff | d << 16; + tl = a & 0xffff | b << 16; + + // add + h = th; + l = tl; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + // Sigma0 + h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32)))); + l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32)))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // Maj + h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2); + l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + bh7 = (c & 0xffff) | (d << 16); + bl7 = (a & 0xffff) | (b << 16); + + // add + h = bh3; + l = bl3; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = th; + l = tl; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + bh3 = (c & 0xffff) | (d << 16); + bl3 = (a & 0xffff) | (b << 16); + + ah1 = bh0; + ah2 = bh1; + ah3 = bh2; + ah4 = bh3; + ah5 = bh4; + ah6 = bh5; + ah7 = bh6; + ah0 = bh7; + + al1 = bl0; + al2 = bl1; + al3 = bl2; + al4 = bl3; + al5 = bl4; + al6 = bl5; + al7 = bl6; + al0 = bl7; + + if (i%16 === 15) { + for (j = 0; j < 16; j++) { + // add + h = wh[j]; + l = wl[j]; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = wh[(j+9)%16]; + l = wl[(j+9)%16]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // sigma0 + th = wh[(j+1)%16]; + tl = wl[(j+1)%16]; + h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7); + l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + // sigma1 + th = wh[(j+14)%16]; + tl = wl[(j+14)%16]; + h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6); + l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6))); + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + wh[j] = (c & 0xffff) | (d << 16); + wl[j] = (a & 0xffff) | (b << 16); + } + } + } + + // add + h = ah0; + l = al0; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[0]; + l = hl[0]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[0] = ah0 = (c & 0xffff) | (d << 16); + hl[0] = al0 = (a & 0xffff) | (b << 16); + + h = ah1; + l = al1; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[1]; + l = hl[1]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[1] = ah1 = (c & 0xffff) | (d << 16); + hl[1] = al1 = (a & 0xffff) | (b << 16); + + h = ah2; + l = al2; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[2]; + l = hl[2]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[2] = ah2 = (c & 0xffff) | (d << 16); + hl[2] = al2 = (a & 0xffff) | (b << 16); + + h = ah3; + l = al3; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[3]; + l = hl[3]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[3] = ah3 = (c & 0xffff) | (d << 16); + hl[3] = al3 = (a & 0xffff) | (b << 16); + + h = ah4; + l = al4; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[4]; + l = hl[4]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[4] = ah4 = (c & 0xffff) | (d << 16); + hl[4] = al4 = (a & 0xffff) | (b << 16); + + h = ah5; + l = al5; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[5]; + l = hl[5]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[5] = ah5 = (c & 0xffff) | (d << 16); + hl[5] = al5 = (a & 0xffff) | (b << 16); + + h = ah6; + l = al6; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[6]; + l = hl[6]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[6] = ah6 = (c & 0xffff) | (d << 16); + hl[6] = al6 = (a & 0xffff) | (b << 16); + + h = ah7; + l = al7; + + a = l & 0xffff; b = l >>> 16; + c = h & 0xffff; d = h >>> 16; + + h = hh[7]; + l = hl[7]; + + a += l & 0xffff; b += l >>> 16; + c += h & 0xffff; d += h >>> 16; + + b += a >>> 16; + c += b >>> 16; + d += c >>> 16; + + hh[7] = ah7 = (c & 0xffff) | (d << 16); + hl[7] = al7 = (a & 0xffff) | (b << 16); + + pos += 128; + n -= 128; + } + + return n; +} + +function crypto_hash(out, m, n) { + var hh = new Int32Array(8), + hl = new Int32Array(8), + x = new Uint8Array(256), + i, b = n; + + hh[0] = 0x6a09e667; + hh[1] = 0xbb67ae85; + hh[2] = 0x3c6ef372; + hh[3] = 0xa54ff53a; + hh[4] = 0x510e527f; + hh[5] = 0x9b05688c; + hh[6] = 0x1f83d9ab; + hh[7] = 0x5be0cd19; + + hl[0] = 0xf3bcc908; + hl[1] = 0x84caa73b; + hl[2] = 0xfe94f82b; + hl[3] = 0x5f1d36f1; + hl[4] = 0xade682d1; + hl[5] = 0x2b3e6c1f; + hl[6] = 0xfb41bd6b; + hl[7] = 0x137e2179; + + crypto_hashblocks_hl(hh, hl, m, n); + n %= 128; + + for (i = 0; i < n; i++) x[i] = m[b-n+i]; + x[n] = 128; + + n = 256-128*(n<112?1:0); + x[n-9] = 0; + ts64(x, n-8, (b / 0x20000000) | 0, b << 3); + crypto_hashblocks_hl(hh, hl, x, n); + + for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]); + + return 0; +} + +function add(p, q) { + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(), + g = gf(), h = gf(), t = gf(); + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); +} + +function cswap(p, q, b) { + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } +} + +function pack(r, p) { + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; +} + +function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i/8)|0] >> (i&7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } +} + +function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); +} + +function crypto_sign_keypair(pk, sk, seeded) { + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; + + if (!seeded) randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p, d); + pack(pk, p); + + for (i = 0; i < 32; i++) sk[i+32] = pk[i]; + return 0; +} + +var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); + +function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i+1] += x[i] >> 8; + r[i] = x[i] & 255; + } +} + +function reduce(r) { + var x = new Float64Array(64), i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); +} + +// Note: difference from C - smlen returned, not passed as argument. +function crypto_sign(sm, m, n, sk) { + var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm.subarray(32), n+32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + + for (i = 32; i < 64; i++) sm[i] = sk[i]; + crypto_hash(h, sm, n + 64); + reduce(h); + + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i+j] += h[i] * d[j]; + } + } + + modL(sm.subarray(32), x); + return smlen; +} + +function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), + den = gf(), den2 = gf(), den4 = gf(), + den6 = gf(); + + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + + M(r[3], r[0], r[1]); + return 0; +} + +function crypto_sign_open(m, sm, n, pk) { + var i, mlen; + var t = new Uint8Array(32), h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; + + mlen = -1; + if (n < 64) return -1; + + if (unpackneg(q, pk)) return -1; + + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i+32] = pk[i]; + crypto_hash(h, m, n); + reduce(h); + scalarmult(p, q, h); + + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } + + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + mlen = n; + return mlen; +} + +var crypto_secretbox_KEYBYTES = 32, + crypto_secretbox_NONCEBYTES = 24, + crypto_secretbox_ZEROBYTES = 32, + crypto_secretbox_BOXZEROBYTES = 16, + crypto_scalarmult_BYTES = 32, + crypto_scalarmult_SCALARBYTES = 32, + crypto_box_PUBLICKEYBYTES = 32, + crypto_box_SECRETKEYBYTES = 32, + crypto_box_BEFORENMBYTES = 32, + crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, + crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, + crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, + crypto_sign_BYTES = 64, + crypto_sign_PUBLICKEYBYTES = 32, + crypto_sign_SECRETKEYBYTES = 64, + crypto_sign_SEEDBYTES = 32, + crypto_hash_BYTES = 64; + +nacl.lowlevel = { + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, + + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES +}; + +/* High-level API */ + +function checkLengths(k, n) { + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); +} + +function checkBoxLengths(pk, sk) { + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); +} + +function checkArrayTypes() { + var t, i; + for (i = 0; i < arguments.length; i++) { + if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') + throw new TypeError('unexpected type ' + t + ', use Uint8Array'); + } +} + +function cleanup(arr) { + for (var i = 0; i < arr.length; i++) arr[i] = 0; +} + +// TODO: Completely remove this in v0.15. +if (!nacl.util) { + nacl.util = {}; + nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { + throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); + }; +} + +nacl.randomBytes = function(n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; +}; + +nacl.secretbox = function(msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); +}; + +nacl.secretbox.open = function(box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return false; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; + return m.subarray(crypto_secretbox_ZEROBYTES); +}; + +nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; +nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; +nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; + +nacl.scalarMult = function(n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; +}; + +nacl.scalarMult.base = function(n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; +}; + +nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; +nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; + +nacl.box = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); +}; + +nacl.box.before = function(publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; +}; + +nacl.box.after = nacl.secretbox; + +nacl.box.open = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); +}; + +nacl.box.open.after = nacl.secretbox.open; + +nacl.box.keyPair = function() { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.box.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; +nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; +nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; +nacl.box.nonceLength = crypto_box_NONCEBYTES; +nacl.box.overheadLength = nacl.secretbox.overheadLength; + +nacl.sign = function(msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; +}; + +nacl.sign.open = function(signedMsg, publicKey) { + if (arguments.length !== 2) + throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; +}; + +nacl.sign.detached = function(msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; +}; + +nacl.sign.detached.verify = function(msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) + throw new Error('bad signature size'); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; + return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); +}; + +nacl.sign.keyPair = function() { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.sign.keyPair.fromSeed = function(seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) + throw new Error('bad seed size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; +nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; +nacl.sign.seedLength = crypto_sign_SEEDBYTES; +nacl.sign.signatureLength = crypto_sign_BYTES; + +nacl.hash = function(msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; +}; + +nacl.hash.hashLength = crypto_hash_BYTES; + +nacl.verify = function(x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return (vn(x, 0, y, 0, x.length) === 0) ? true : false; +}; + +nacl.setPRNG = function(fn) { + randombytes = fn; +}; + +(function() { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function(x, n) { + var i, v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } else if (typeof require !== 'undefined') { + // Node.js. + crypto = require('crypto'); + if (crypto && crypto.randomBytes) { + nacl.setPRNG(function(x, n) { + var i, v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } + } +})(); + +})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/packages/字体精简工具/node_modules/tweetnacl/nacl-fast.min.js b/packages/字体精简工具/node_modules/tweetnacl/nacl-fast.min.js new file mode 100644 index 0000000..8bc47da --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/nacl-fast.min.js @@ -0,0 +1,2 @@ +!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;i>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;d=d+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+c|0,B=B+u|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+v|0,L=L+b|0,z=z+g|0,R=R+_|0,P=P+A|0,r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=z>>>0&255,r[53]=z>>>8&255,r[54]=z>>>16&255,r[55]=z>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=P>>>0&255,r[61]=P>>>8&255,r[62]=P>>>16&255,r[63]=P>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,c=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,u=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=c,B=u,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;O<20;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=P>>>0&255,r[13]=P>>>8&255,r[14]=P>>>16&255,r[15]=P>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,c=new Uint8Array(16),u=new Uint8Array(64);for(s=0;s<16;s++)c[s]=0;for(s=0;s<8;s++)c[s]=i[s];for(;o>=64;){for(a(u,c,h,ur),s=0;s<64;s++)r[t+s]=n[e+s]^u[s];for(f=1,s=8;s<16;s++)f=f+(255&c[s])|0,c[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(u,c,h,ur),s=0;s=64;){for(a(s,f,o,ur),h=0;h<64;h++)r[t+h]=s[h];for(i=1,h=8;h<16;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,ur),h=0;h>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,_(h,i,1-o)}for(n=0;n<16;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function d(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;n<16;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;e<16;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,c=0,u=0,y=0,l=0,w=0,p=0,v=0,b=0,g=0,_=0,A=0,d=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,z=0,R=0,P=n[0],O=n[1],N=n[2],C=n[3],F=n[4],I=n[5],G=n[6],Z=n[7],j=n[8],q=n[9],V=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*P,h+=e*O,a+=e*N,f+=e*C,s+=e*F,c+=e*I,u+=e*G,y+=e*Z,l+=e*j,w+=e*q,p+=e*V,v+=e*X,b+=e*D,g+=e*H,_+=e*J,A+=e*Q,e=t[1],h+=e*P,a+=e*O,f+=e*N,s+=e*C,c+=e*F,u+=e*I,y+=e*G,l+=e*Z,w+=e*j,p+=e*q,v+=e*V,b+=e*X,g+=e*D,_+=e*H,A+=e*J,d+=e*Q,e=t[2],a+=e*P,f+=e*O,s+=e*N,c+=e*C,u+=e*F,y+=e*I,l+=e*G,w+=e*Z,p+=e*j,v+=e*q,b+=e*V,g+=e*X,_+=e*D,A+=e*H,d+=e*J,U+=e*Q,e=t[3],f+=e*P,s+=e*O,c+=e*N,u+=e*C,y+=e*F,l+=e*I,w+=e*G,p+=e*Z,v+=e*j,b+=e*q,g+=e*V,_+=e*X,A+=e*D,d+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*P,c+=e*O,u+=e*N,y+=e*C,l+=e*F,w+=e*I,p+=e*G,v+=e*Z,b+=e*j,g+=e*q,_+=e*V,A+=e*X,d+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],c+=e*P,u+=e*O,y+=e*N,l+=e*C,w+=e*F,p+=e*I,v+=e*G,b+=e*Z,g+=e*j,_+=e*q,A+=e*V,d+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],u+=e*P,y+=e*O,l+=e*N,w+=e*C,p+=e*F,v+=e*I,b+=e*G,g+=e*Z,_+=e*j,A+=e*q,d+=e*V,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*P,l+=e*O,w+=e*N,p+=e*C,v+=e*F,b+=e*I,g+=e*G,_+=e*Z,A+=e*j,d+=e*q,U+=e*V,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*P,w+=e*O,p+=e*N,v+=e*C,b+=e*F,g+=e*I,_+=e*G,A+=e*Z,d+=e*j,U+=e*q,E+=e*V,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*P,p+=e*O,v+=e*N,b+=e*C,g+=e*F,_+=e*I,A+=e*G,d+=e*Z,U+=e*j,E+=e*q,x+=e*V,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*P,v+=e*O,b+=e*N,g+=e*C,_+=e*F,A+=e*I,d+=e*G,U+=e*Z,E+=e*j,x+=e*q,M+=e*V,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],v+=e*P,b+=e*O,g+=e*N,_+=e*C,A+=e*F,d+=e*I,U+=e*G,E+=e*Z,x+=e*j,M+=e*q,m+=e*V,B+=e*X;S+=e*D;K+=e*H,T+=e*J,Y+=e*Q,e=t[12],b+=e*P,g+=e*O,_+=e*N,A+=e*C,d+=e*F,U+=e*I,E+=e*G,x+=e*Z,M+=e*j,m+=e*q,B+=e*V,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],g+=e*P,_+=e*O,A+=e*N,d+=e*C,U+=e*F,E+=e*I,x+=e*G,M+=e*Z,m+=e*j,B+=e*q,S+=e*V,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],_+=e*P,A+=e*O,d+=e*N,U+=e*C,E+=e*F,x+=e*I,M+=e*G,m+=e*Z,B+=e*j,S+=e*q,K+=e*V,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,z+=e*Q,e=t[15],A+=e*P,d+=e*O,U+=e*N,E+=e*C,x+=e*F,M+=e*I,m+=e*G,B+=e*Z,S+=e*j,K+=e*q,T+=e*V,Y+=e*X,k+=e*D,L+=e*H,z+=e*J,R+=e*Q,i+=38*d,h+=38*U,a+=38*E,f+=38*x,s+=38*M,c+=38*m,u+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,v+=38*k,b+=38*L,g+=38*z,_+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=c,r[6]=u,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=v,r[12]=b,r[13]=g;r[14]=_;r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function K(r,t){var n,e=$();for(n=0;n<16;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;n<16;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=$(),f=$(),s=$(),c=$(),u=$(),y=$();for(o=0;o<31;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;o<16;o++)f[o]=h[o],c[o]=a[o]=s[o]=0;for(a[0]=c[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,_(a,f,e),_(s,c,e),x(u,a,s),M(a,a,s),x(s,f,c),M(f,f,c),B(c,u),B(y,a),m(a,s,a),m(s,f,u),x(u,a,s),M(a,a,s),B(f,a),M(s,c,y),m(a,s,ir),x(a,a,c),m(s,s,a),m(a,c,y),m(c,f,h),B(f,u),_(a,f,e),_(s,c,e);for(o=0;o<16;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=c[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,nr)}function k(r,t){return rr(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,tr,e,ur)}function z(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lr(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),wr(r,t,n,e,h)}function P(r,t,n,e){for(var o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],z=r[2],R=r[3],P=r[4],O=r[5],N=r[6],C=r[7],F=t[0],I=t[1],G=t[2],Z=t[3],j=t[4],q=t[5],V=t[6],X=t[7],D=0;e>=128;){for(U=0;U<16;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;U<80;U++)if(o=k,i=L,h=z,a=R,f=P,s=O,c=N,u=C,y=F,l=I,w=G,p=Z,v=j,b=q,g=V,_=X,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(P>>>14|j<<18)^(P>>>18|j<<14)^(j>>>9|P<<23),M=(j>>>14|P<<18)^(j>>>18|P<<14)^(P>>>9|j<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=P&O^~P&N,M=j&q^~j&V,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=pr[2*U],M=pr[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,d=65535&m|B<<16,x=A,M=d,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&z^L&z,M=F&I^F&G^I&G,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,u=65535&S|K<<16,_=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=d,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,z=i,R=h,P=a,O=f,N=s,C=c,k=u,I=y,G=l,Z=w,j=p,q=v,V=b,X=g,F=_,U%16===15)for(E=0;E<16;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],d=Y[(E+1)%16],x=(A>>>1|d<<31)^(A>>>8|d<<24)^A>>>7,M=(d>>>1|A<<31)^(d>>>8|A<<24)^(d>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],d=Y[(E+14)%16],x=(A>>>19|d<<13)^(d>>>29|A<<3)^A>>>6,M=(d>>>19|A<<13)^(A>>>29|d<<3)^(d>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=z,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=z=65535&S|K<<16,t[2]=G=65535&m|B<<16,x=R,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=Z=65535&m|B<<16,x=P,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=P=65535&S|K<<16,t[4]=j=65535&m|B<<16,x=O,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=O=65535&S|K<<16,t[5]=q=65535&m|B<<16,x=N,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=N=65535&S|K<<16,t[6]=V=65535&m|B<<16,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=C=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function O(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,P(i,h,n,e),e%=128,o=0;o=0;--o)e=n[o/8|0]>>(7&o)&1,C(r,t,e),N(t,r),N(r,r),C(r,t,e)}function G(r,t){var n=[$(),$(),$(),$()];b(n[0],fr),b(n[1],sr),b(n[2],or),m(n[3],fr,sr),I(r,n,t)}function Z(r,t,n){var e,o=new Uint8Array(64),i=[$(),$(),$(),$()];for(n||rr(t,32),O(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,G(i,o),F(r,i),e=0;e<32;e++)t[e+32]=r[e];return 0}function j(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;o>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;o<32;o++)t[o]+=n-(t[31]>>4)*vr[o],n=t[o]>>8,t[o]&=255;for(o=0;o<32;o++)t[o]-=n*vr[o];for(e=0;e<32;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function q(r){var t,n=new Float64Array(64);for(t=0;t<64;t++)n[t]=r[t];for(t=0;t<64;t++)r[t]=0;j(r,n)}function V(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),c=[$(),$(),$(),$()];O(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var u=n+64;for(o=0;o>7&&M(r[0],er,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[$(),$(),$(),$()],c=[$(),$(),$(),$()];if(h=-1,n<64)return-1;if(X(c,e))return-1;for(i=0;i>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};yr.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,c,u,y,l,w,p,v,b,g,_,A,d,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],z=this.r[1],R=this.r[2],P=this.r[3],O=this.r[4],N=this.r[5],C=this.r[6],F=this.r[7],I=this.r[8],G=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),c=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|c<<8),k+=c>>>5|U,u=0,y=u,y+=E*L,y+=x*(5*G),y+=M*(5*I),y+=m*(5*F),y+=B*(5*C),u=y>>>13,y&=8191,y+=S*(5*N),y+=K*(5*O),y+=T*(5*P),y+=Y*(5*R),y+=k*(5*z),u+=y>>>13,y&=8191,l=u,l+=E*z,l+=x*L,l+=M*(5*G),l+=m*(5*I),l+=B*(5*F),u=l>>>13,l&=8191,l+=S*(5*C),l+=K*(5*N),l+=T*(5*O),l+=Y*(5*P),l+=k*(5*R),u+=l>>>13,l&=8191,w=u,w+=E*R,w+=x*z,w+=M*L,w+=m*(5*G),w+=B*(5*I),u=w>>>13,w&=8191,w+=S*(5*F),w+=K*(5*C),w+=T*(5*N),w+=Y*(5*O),w+=k*(5*P),u+=w>>>13,w&=8191,p=u,p+=E*P,p+=x*R,p+=M*z,p+=m*L,p+=B*(5*G),u=p>>>13,p&=8191,p+=S*(5*I),p+=K*(5*F),p+=T*(5*C),p+=Y*(5*N),p+=k*(5*O),u+=p>>>13,p&=8191,v=u,v+=E*O,v+=x*P,v+=M*R,v+=m*z,v+=B*L,u=v>>>13,v&=8191,v+=S*(5*G),v+=K*(5*I),v+=T*(5*F),v+=Y*(5*C),v+=k*(5*N),u+=v>>>13,v&=8191,b=u,b+=E*N,b+=x*O,b+=M*P,b+=m*R,b+=B*z,u=b>>>13,b&=8191,b+=S*L,b+=K*(5*G),b+=T*(5*I),b+=Y*(5*F),b+=k*(5*C),u+=b>>>13,b&=8191,g=u,g+=E*C,g+=x*N,g+=M*O,g+=m*P,g+=B*R,u=g>>>13,g&=8191,g+=S*z,g+=K*L,g+=T*(5*G),g+=Y*(5*I),g+=k*(5*F),u+=g>>>13,g&=8191,_=u,_+=E*F,_+=x*C,_+=M*N,_+=m*O,_+=B*P,u=_>>>13,_&=8191,_+=S*R,_+=K*z,_+=T*L,_+=Y*(5*G),_+=k*(5*I),u+=_>>>13,_&=8191,A=u,A+=E*I,A+=x*F,A+=M*C,A+=m*N,A+=B*O,u=A>>>13,A&=8191,A+=S*P,A+=K*R,A+=T*z,A+=Y*L,A+=k*(5*G),u+=A>>>13,A&=8191,d=u,d+=E*G,d+=x*I,d+=M*F,d+=m*C,d+=B*N,u=d>>>13,d&=8191,d+=S*O,d+=K*P,d+=T*R,d+=Y*z,d+=k*L,u+=d>>>13,d&=8191,u=(u<<2)+u|0,u=u+y|0,y=8191&u,u>>>=13,l+=u,E=y,x=l,M=w,m=p,B=v,S=b,K=g,T=_,Y=A,k=d,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},yr.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;i<16;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;i<10;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;i<10;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(1^n)-1,i=0;i<10;i++)h[i]&=e;for(e=~e,i=0;i<10;i++)this.h[i]=this.h[i]&e|h[i];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,i=1;i<8;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},yr.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;e=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;e=0},r.sign.keyPair=function(){var r=new Uint8Array(Tr),t=new Uint8Array(Yr);return Z(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Yr)throw new Error("bad secret key size");for(var t=new Uint8Array(Tr),n=0;n void): void; +} diff --git a/packages/字体精简工具/node_modules/tweetnacl/nacl.js b/packages/字体精简工具/node_modules/tweetnacl/nacl.js new file mode 100644 index 0000000..f72dd78 --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/nacl.js @@ -0,0 +1,1175 @@ +(function(nacl) { +'use strict'; + +// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. +// Public domain. +// +// Implementation derived from TweetNaCl version 20140427. +// See for details: http://tweetnacl.cr.yp.to/ + +var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; }; +var gf = function(init) { + var i, r = new Float64Array(16); + if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; + return r; +}; + +// Pluggable, initialized in high-level API below. +var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; + +var _0 = new Uint8Array(16); +var _9 = new Uint8Array(32); _9[0] = 9; + +var gf0 = gf(), + gf1 = gf([1]), + _121665 = gf([0xdb41, 1]), + D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), + D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), + X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), + Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), + I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); + +function L32(x, c) { return (x << c) | (x >>> (32 - c)); } + +function ld32(x, i) { + var u = x[i+3] & 0xff; + u = (u<<8)|(x[i+2] & 0xff); + u = (u<<8)|(x[i+1] & 0xff); + return (u<<8)|(x[i+0] & 0xff); +} + +function dl64(x, i) { + var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3]; + var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7]; + return new u64(h, l); +} + +function st32(x, j, u) { + var i; + for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; } +} + +function ts64(x, i, u) { + x[i] = (u.hi >> 24) & 0xff; + x[i+1] = (u.hi >> 16) & 0xff; + x[i+2] = (u.hi >> 8) & 0xff; + x[i+3] = u.hi & 0xff; + x[i+4] = (u.lo >> 24) & 0xff; + x[i+5] = (u.lo >> 16) & 0xff; + x[i+6] = (u.lo >> 8) & 0xff; + x[i+7] = u.lo & 0xff; +} + +function vn(x, xi, y, yi, n) { + var i,d = 0; + for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; + return (1 & ((d - 1) >>> 8)) - 1; +} + +function crypto_verify_16(x, xi, y, yi) { + return vn(x,xi,y,yi,16); +} + +function crypto_verify_32(x, xi, y, yi) { + return vn(x,xi,y,yi,32); +} + +function core(out,inp,k,c,h) { + var w = new Uint32Array(16), x = new Uint32Array(16), + y = new Uint32Array(16), t = new Uint32Array(4); + var i, j, m; + + for (i = 0; i < 4; i++) { + x[5*i] = ld32(c, 4*i); + x[1+i] = ld32(k, 4*i); + x[6+i] = ld32(inp, 4*i); + x[11+i] = ld32(k, 16+4*i); + } + + for (i = 0; i < 16; i++) y[i] = x[i]; + + for (i = 0; i < 20; i++) { + for (j = 0; j < 4; j++) { + for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16]; + t[1] ^= L32((t[0]+t[3])|0, 7); + t[2] ^= L32((t[1]+t[0])|0, 9); + t[3] ^= L32((t[2]+t[1])|0,13); + t[0] ^= L32((t[3]+t[2])|0,18); + for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m]; + } + for (m = 0; m < 16; m++) x[m] = w[m]; + } + + if (h) { + for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; + for (i = 0; i < 4; i++) { + x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0; + x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0; + } + for (i = 0; i < 4; i++) { + st32(out,4*i,x[5*i]); + st32(out,16+4*i,x[6+i]); + } + } else { + for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); + } +} + +function crypto_core_salsa20(out,inp,k,c) { + core(out,inp,k,c,false); + return 0; +} + +function crypto_core_hsalsa20(out,inp,k,c) { + core(out,inp,k,c,true); + return 0; +} + +var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); + // "expand 32-byte k" + +function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { + var z = new Uint8Array(16), x = new Uint8Array(64); + var u, i; + if (!b) return 0; + for (i = 0; i < 16; i++) z[i] = 0; + for (i = 0; i < 8; i++) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; + u = 1; + for (i = 8; i < 16; i++) { + u = u + (z[i] & 0xff) | 0; + z[i] = u & 0xff; + u >>>= 8; + } + b -= 64; + cpos += 64; + if (m) mpos += 64; + } + if (b > 0) { + crypto_core_salsa20(x,z,k,sigma); + for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; + } + return 0; +} + +function crypto_stream_salsa20(c,cpos,d,n,k) { + return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k); +} + +function crypto_stream(c,cpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s); +} + +function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { + var s = new Uint8Array(32); + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s); +} + +function add1305(h, c) { + var j, u = 0; + for (j = 0; j < 17; j++) { + u = (u + ((h[j] + c[j]) | 0)) | 0; + h[j] = u & 255; + u >>>= 8; + } +} + +var minusp = new Uint32Array([ + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 +]); + +function crypto_onetimeauth(out, outpos, m, mpos, n, k) { + var s, i, j, u; + var x = new Uint32Array(17), r = new Uint32Array(17), + h = new Uint32Array(17), c = new Uint32Array(17), + g = new Uint32Array(17); + for (j = 0; j < 17; j++) r[j]=h[j]=0; + for (j = 0; j < 16; j++) r[j]=k[j]; + r[3]&=15; + r[4]&=252; + r[7]&=15; + r[8]&=252; + r[11]&=15; + r[12]&=252; + r[15]&=15; + + while (n > 0) { + for (j = 0; j < 17; j++) c[j] = 0; + for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j]; + c[j] = 1; + mpos += j; n -= j; + add1305(h,c); + for (i = 0; i < 17; i++) { + x[i] = 0; + for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0; + } + for (i = 0; i < 17; i++) h[i] = x[i]; + u = 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; h[16] = u & 3; + u = (5 * (u >>> 2)) | 0; + for (j = 0; j < 16; j++) { + u = (u + h[j]) | 0; + h[j] = u & 255; + u >>>= 8; + } + u = (u + h[16]) | 0; h[16] = u; + } + + for (j = 0; j < 17; j++) g[j] = h[j]; + add1305(h,minusp); + s = (-(h[16] >>> 7) | 0); + for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); + + for (j = 0; j < 16; j++) c[j] = k[j + 16]; + c[16] = 0; + add1305(h,c); + for (j = 0; j < 16; j++) out[outpos+j] = h[j]; + return 0; +} + +function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { + var x = new Uint8Array(16); + crypto_onetimeauth(x,0,m,mpos,n,k); + return crypto_verify_16(h,hpos,x,0); +} + +function crypto_secretbox(c,m,d,n,k) { + var i; + if (d < 32) return -1; + crypto_stream_xor(c,0,m,0,d,n,k); + crypto_onetimeauth(c, 16, c, 32, d - 32, c); + for (i = 0; i < 16; i++) c[i] = 0; + return 0; +} + +function crypto_secretbox_open(m,c,d,n,k) { + var i; + var x = new Uint8Array(32); + if (d < 32) return -1; + crypto_stream(x,0,32,n,k); + if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; + crypto_stream_xor(m,0,c,0,d,n,k); + for (i = 0; i < 32; i++) m[i] = 0; + return 0; +} + +function set25519(r, a) { + var i; + for (i = 0; i < 16; i++) r[i] = a[i]|0; +} + +function car25519(o) { + var c; + var i; + for (i = 0; i < 16; i++) { + o[i] += 65536; + c = Math.floor(o[i] / 65536); + o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0); + o[i] -= (c * 65536); + } +} + +function sel25519(p, q, b) { + var t, c = ~(b-1); + for (var i = 0; i < 16; i++) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } +} + +function pack25519(o, n) { + var i, j, b; + var m = gf(), t = gf(); + for (i = 0; i < 16; i++) t[i] = n[i]; + car25519(t); + car25519(t); + car25519(t); + for (j = 0; j < 2; j++) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; i++) { + m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); + m[i-1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); + b = (m[15]>>16) & 1; + m[14] &= 0xffff; + sel25519(t, m, 1-b); + } + for (i = 0; i < 16; i++) { + o[2*i] = t[i] & 0xff; + o[2*i+1] = t[i]>>8; + } +} + +function neq25519(a, b) { + var c = new Uint8Array(32), d = new Uint8Array(32); + pack25519(c, a); + pack25519(d, b); + return crypto_verify_32(c, 0, d, 0); +} + +function par25519(a) { + var d = new Uint8Array(32); + pack25519(d, a); + return d[0] & 1; +} + +function unpack25519(o, n) { + var i; + for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); + o[15] &= 0x7fff; +} + +function A(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0; +} + +function Z(o, a, b) { + var i; + for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0; +} + +function M(o, a, b) { + var i, j, t = new Float64Array(31); + for (i = 0; i < 31; i++) t[i] = 0; + for (i = 0; i < 16; i++) { + for (j = 0; j < 16; j++) { + t[i+j] += a[i] * b[j]; + } + } + for (i = 0; i < 15; i++) { + t[i] += 38 * t[i+16]; + } + for (i = 0; i < 16; i++) o[i] = t[i]; + car25519(o); + car25519(o); +} + +function S(o, a) { + M(o, a, a); +} + +function inv25519(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 253; a >= 0; a--) { + S(c, c); + if(a !== 2 && a !== 4) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function pow2523(o, i) { + var c = gf(); + var a; + for (a = 0; a < 16; a++) c[a] = i[a]; + for (a = 250; a >= 0; a--) { + S(c, c); + if(a !== 1) M(c, c, i); + } + for (a = 0; a < 16; a++) o[a] = c[a]; +} + +function crypto_scalarmult(q, n, p) { + var z = new Uint8Array(32); + var x = new Float64Array(80), r, i; + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(); + for (i = 0; i < 31; i++) z[i] = n[i]; + z[31]=(n[31]&127)|64; + z[0]&=248; + unpack25519(x,p); + for (i = 0; i < 16; i++) { + b[i]=x[i]; + d[i]=a[i]=c[i]=0; + } + a[0]=d[0]=1; + for (i=254; i>=0; --i) { + r=(z[i>>>3]>>>(i&7))&1; + sel25519(a,b,r); + sel25519(c,d,r); + A(e,a,c); + Z(a,a,c); + A(c,b,d); + Z(b,b,d); + S(d,e); + S(f,a); + M(a,c,a); + M(c,b,e); + A(e,a,c); + Z(a,a,c); + S(b,a); + Z(c,d,f); + M(a,c,_121665); + A(a,a,d); + M(c,c,a); + M(a,d,f); + M(d,b,x); + S(b,e); + sel25519(a,b,r); + sel25519(c,d,r); + } + for (i = 0; i < 16; i++) { + x[i+16]=a[i]; + x[i+32]=c[i]; + x[i+48]=b[i]; + x[i+64]=d[i]; + } + var x32 = x.subarray(32); + var x16 = x.subarray(16); + inv25519(x32,x32); + M(x16,x16,x32); + pack25519(q,x16); + return 0; +} + +function crypto_scalarmult_base(q, n) { + return crypto_scalarmult(q, n, _9); +} + +function crypto_box_keypair(y, x) { + randombytes(x, 32); + return crypto_scalarmult_base(y, x); +} + +function crypto_box_beforenm(k, y, x) { + var s = new Uint8Array(32); + crypto_scalarmult(s, x, y); + return crypto_core_hsalsa20(k, _0, s, sigma); +} + +var crypto_box_afternm = crypto_secretbox; +var crypto_box_open_afternm = crypto_secretbox_open; + +function crypto_box(c, m, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_afternm(c, m, d, n, k); +} + +function crypto_box_open(m, c, d, n, y, x) { + var k = new Uint8Array(32); + crypto_box_beforenm(k, y, x); + return crypto_box_open_afternm(m, c, d, n, k); +} + +function add64() { + var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i; + for (i = 0; i < arguments.length; i++) { + l = arguments[i].lo; + h = arguments[i].hi; + a += (l & m16); b += (l >>> 16); + c += (h & m16); d += (h >>> 16); + } + + b += (a >>> 16); + c += (b >>> 16); + d += (c >>> 16); + + return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); +} + +function shr64(x, c) { + return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c))); +} + +function xor64() { + var l = 0, h = 0, i; + for (i = 0; i < arguments.length; i++) { + l ^= arguments[i].lo; + h ^= arguments[i].hi; + } + return new u64(h, l); +} + +function R(x, c) { + var h, l, c1 = 32 - c; + if (c < 32) { + h = (x.hi >>> c) | (x.lo << c1); + l = (x.lo >>> c) | (x.hi << c1); + } else if (c < 64) { + h = (x.lo >>> c) | (x.hi << c1); + l = (x.hi >>> c) | (x.lo << c1); + } + return new u64(h, l); +} + +function Ch(x, y, z) { + var h = (x.hi & y.hi) ^ (~x.hi & z.hi), + l = (x.lo & y.lo) ^ (~x.lo & z.lo); + return new u64(h, l); +} + +function Maj(x, y, z) { + var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), + l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo); + return new u64(h, l); +} + +function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); } +function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); } +function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); } +function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); } + +var K = [ + new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd), + new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc), + new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019), + new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118), + new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe), + new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2), + new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1), + new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694), + new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3), + new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65), + new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483), + new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5), + new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210), + new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4), + new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725), + new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70), + new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926), + new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df), + new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8), + new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b), + new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001), + new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30), + new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910), + new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8), + new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53), + new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8), + new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb), + new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3), + new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60), + new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec), + new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9), + new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b), + new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207), + new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178), + new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6), + new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b), + new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493), + new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c), + new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a), + new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817) +]; + +function crypto_hashblocks(x, m, n) { + var z = [], b = [], a = [], w = [], t, i, j; + + for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i); + + var pos = 0; + while (n >= 128) { + for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos); + for (i = 0; i < 80; i++) { + for (j = 0; j < 8; j++) b[j] = a[j]; + t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]); + b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); + b[3] = add64(b[3], t); + for (j = 0; j < 8; j++) a[(j+1)%8] = b[j]; + if (i%16 === 15) { + for (j = 0; j < 16; j++) { + w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16])); + } + } + } + + for (i = 0; i < 8; i++) { + a[i] = add64(a[i], z[i]); + z[i] = a[i]; + } + + pos += 128; + n -= 128; + } + + for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]); + return n; +} + +var iv = new Uint8Array([ + 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, + 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, + 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, + 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, + 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, + 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, + 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, + 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 +]); + +function crypto_hash(out, m, n) { + var h = new Uint8Array(64), x = new Uint8Array(256); + var i, b = n; + + for (i = 0; i < 64; i++) h[i] = iv[i]; + + crypto_hashblocks(h, m, n); + n %= 128; + + for (i = 0; i < 256; i++) x[i] = 0; + for (i = 0; i < n; i++) x[i] = m[b-n+i]; + x[n] = 128; + + n = 256-128*(n<112?1:0); + x[n-9] = 0; + ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3)); + crypto_hashblocks(h, x, n); + + for (i = 0; i < 64; i++) out[i] = h[i]; + + return 0; +} + +function add(p, q) { + var a = gf(), b = gf(), c = gf(), + d = gf(), e = gf(), f = gf(), + g = gf(), h = gf(), t = gf(); + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); +} + +function cswap(p, q, b) { + var i; + for (i = 0; i < 4; i++) { + sel25519(p[i], q[i], b); + } +} + +function pack(r, p) { + var tx = gf(), ty = gf(), zi = gf(); + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; +} + +function scalarmult(p, q, s) { + var b, i; + set25519(p[0], gf0); + set25519(p[1], gf1); + set25519(p[2], gf1); + set25519(p[3], gf0); + for (i = 255; i >= 0; --i) { + b = (s[(i/8)|0] >> (i&7)) & 1; + cswap(p, q, b); + add(q, p); + add(p, p); + cswap(p, q, b); + } +} + +function scalarbase(p, s) { + var q = [gf(), gf(), gf(), gf()]; + set25519(q[0], X); + set25519(q[1], Y); + set25519(q[2], gf1); + M(q[3], X, Y); + scalarmult(p, q, s); +} + +function crypto_sign_keypair(pk, sk, seeded) { + var d = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()]; + var i; + + if (!seeded) randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p, d); + pack(pk, p); + + for (i = 0; i < 32; i++) sk[i+32] = pk[i]; + return 0; +} + +var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); + +function modL(r, x) { + var carry, i, j, k; + for (i = 63; i >= 32; --i) { + carry = 0; + for (j = i - 32, k = i - 12; j < k; ++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry * 256; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + for (j = 0; j < 32; j++) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + for (j = 0; j < 32; j++) x[j] -= carry * L[j]; + for (i = 0; i < 32; i++) { + x[i+1] += x[i] >> 8; + r[i] = x[i] & 255; + } +} + +function reduce(r) { + var x = new Float64Array(64), i; + for (i = 0; i < 64; i++) x[i] = r[i]; + for (i = 0; i < 64; i++) r[i] = 0; + modL(r, x); +} + +// Note: difference from C - smlen returned, not passed as argument. +function crypto_sign(sm, m, n, sk) { + var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); + var i, j, x = new Float64Array(64); + var p = [gf(), gf(), gf(), gf()]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + var smlen = n + 64; + for (i = 0; i < n; i++) sm[64 + i] = m[i]; + for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm.subarray(32), n+32); + reduce(r); + scalarbase(p, r); + pack(sm, p); + + for (i = 32; i < 64; i++) sm[i] = sk[i]; + crypto_hash(h, sm, n + 64); + reduce(h); + + for (i = 0; i < 64; i++) x[i] = 0; + for (i = 0; i < 32; i++) x[i] = r[i]; + for (i = 0; i < 32; i++) { + for (j = 0; j < 32; j++) { + x[i+j] += h[i] * d[j]; + } + } + + modL(sm.subarray(32), x); + return smlen; +} + +function unpackneg(r, p) { + var t = gf(), chk = gf(), num = gf(), + den = gf(), den2 = gf(), den4 = gf(), + den6 = gf(); + + set25519(r[2], gf1); + unpack25519(r[1], p); + S(num, r[1]); + M(den, num, D); + Z(num, num, r[2]); + A(den, r[2], den); + + S(den2, den); + S(den4, den2); + M(den6, den4, den2); + M(t, den6, num); + M(t, t, den); + + pow2523(t, t); + M(t, t, num); + M(t, t, den); + M(t, t, den); + M(r[0], t, den); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) M(r[0], r[0], I); + + S(chk, r[0]); + M(chk, chk, den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); + + M(r[3], r[0], r[1]); + return 0; +} + +function crypto_sign_open(m, sm, n, pk) { + var i, mlen; + var t = new Uint8Array(32), h = new Uint8Array(64); + var p = [gf(), gf(), gf(), gf()], + q = [gf(), gf(), gf(), gf()]; + + mlen = -1; + if (n < 64) return -1; + + if (unpackneg(q, pk)) return -1; + + for (i = 0; i < n; i++) m[i] = sm[i]; + for (i = 0; i < 32; i++) m[i+32] = pk[i]; + crypto_hash(h, m, n); + reduce(h); + scalarmult(p, q, h); + + scalarbase(q, sm.subarray(32)); + add(p, q); + pack(t, p); + + n -= 64; + if (crypto_verify_32(sm, 0, t, 0)) { + for (i = 0; i < n; i++) m[i] = 0; + return -1; + } + + for (i = 0; i < n; i++) m[i] = sm[i + 64]; + mlen = n; + return mlen; +} + +var crypto_secretbox_KEYBYTES = 32, + crypto_secretbox_NONCEBYTES = 24, + crypto_secretbox_ZEROBYTES = 32, + crypto_secretbox_BOXZEROBYTES = 16, + crypto_scalarmult_BYTES = 32, + crypto_scalarmult_SCALARBYTES = 32, + crypto_box_PUBLICKEYBYTES = 32, + crypto_box_SECRETKEYBYTES = 32, + crypto_box_BEFORENMBYTES = 32, + crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, + crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, + crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, + crypto_sign_BYTES = 64, + crypto_sign_PUBLICKEYBYTES = 32, + crypto_sign_SECRETKEYBYTES = 64, + crypto_sign_SEEDBYTES = 32, + crypto_hash_BYTES = 64; + +nacl.lowlevel = { + crypto_core_hsalsa20: crypto_core_hsalsa20, + crypto_stream_xor: crypto_stream_xor, + crypto_stream: crypto_stream, + crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, + crypto_stream_salsa20: crypto_stream_salsa20, + crypto_onetimeauth: crypto_onetimeauth, + crypto_onetimeauth_verify: crypto_onetimeauth_verify, + crypto_verify_16: crypto_verify_16, + crypto_verify_32: crypto_verify_32, + crypto_secretbox: crypto_secretbox, + crypto_secretbox_open: crypto_secretbox_open, + crypto_scalarmult: crypto_scalarmult, + crypto_scalarmult_base: crypto_scalarmult_base, + crypto_box_beforenm: crypto_box_beforenm, + crypto_box_afternm: crypto_box_afternm, + crypto_box: crypto_box, + crypto_box_open: crypto_box_open, + crypto_box_keypair: crypto_box_keypair, + crypto_hash: crypto_hash, + crypto_sign: crypto_sign, + crypto_sign_keypair: crypto_sign_keypair, + crypto_sign_open: crypto_sign_open, + + crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, + crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, + crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, + crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, + crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, + crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, + crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, + crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, + crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, + crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, + crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, + crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, + crypto_sign_BYTES: crypto_sign_BYTES, + crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, + crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, + crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, + crypto_hash_BYTES: crypto_hash_BYTES +}; + +/* High-level API */ + +function checkLengths(k, n) { + if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); + if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); +} + +function checkBoxLengths(pk, sk) { + if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); + if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); +} + +function checkArrayTypes() { + var t, i; + for (i = 0; i < arguments.length; i++) { + if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') + throw new TypeError('unexpected type ' + t + ', use Uint8Array'); + } +} + +function cleanup(arr) { + for (var i = 0; i < arr.length; i++) arr[i] = 0; +} + +// TODO: Completely remove this in v0.15. +if (!nacl.util) { + nacl.util = {}; + nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { + throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); + }; +} + +nacl.randomBytes = function(n) { + var b = new Uint8Array(n); + randombytes(b, n); + return b; +}; + +nacl.secretbox = function(msg, nonce, key) { + checkArrayTypes(msg, nonce, key); + checkLengths(key, nonce); + var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); + var c = new Uint8Array(m.length); + for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; + crypto_secretbox(c, m, m.length, nonce, key); + return c.subarray(crypto_secretbox_BOXZEROBYTES); +}; + +nacl.secretbox.open = function(box, nonce, key) { + checkArrayTypes(box, nonce, key); + checkLengths(key, nonce); + var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); + var m = new Uint8Array(c.length); + for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; + if (c.length < 32) return false; + if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; + return m.subarray(crypto_secretbox_ZEROBYTES); +}; + +nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; +nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; +nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; + +nacl.scalarMult = function(n, p) { + checkArrayTypes(n, p); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult(q, n, p); + return q; +}; + +nacl.scalarMult.base = function(n) { + checkArrayTypes(n); + if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); + var q = new Uint8Array(crypto_scalarmult_BYTES); + crypto_scalarmult_base(q, n); + return q; +}; + +nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; +nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; + +nacl.box = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox(msg, nonce, k); +}; + +nacl.box.before = function(publicKey, secretKey) { + checkArrayTypes(publicKey, secretKey); + checkBoxLengths(publicKey, secretKey); + var k = new Uint8Array(crypto_box_BEFORENMBYTES); + crypto_box_beforenm(k, publicKey, secretKey); + return k; +}; + +nacl.box.after = nacl.secretbox; + +nacl.box.open = function(msg, nonce, publicKey, secretKey) { + var k = nacl.box.before(publicKey, secretKey); + return nacl.secretbox.open(msg, nonce, k); +}; + +nacl.box.open.after = nacl.secretbox.open; + +nacl.box.keyPair = function() { + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); + crypto_box_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.box.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_box_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); + crypto_scalarmult_base(pk, secretKey); + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; +nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; +nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; +nacl.box.nonceLength = crypto_box_NONCEBYTES; +nacl.box.overheadLength = nacl.secretbox.overheadLength; + +nacl.sign = function(msg, secretKey) { + checkArrayTypes(msg, secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); + crypto_sign(signedMsg, msg, msg.length, secretKey); + return signedMsg; +}; + +nacl.sign.open = function(signedMsg, publicKey) { + if (arguments.length !== 2) + throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); + checkArrayTypes(signedMsg, publicKey); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var tmp = new Uint8Array(signedMsg.length); + var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); + if (mlen < 0) return null; + var m = new Uint8Array(mlen); + for (var i = 0; i < m.length; i++) m[i] = tmp[i]; + return m; +}; + +nacl.sign.detached = function(msg, secretKey) { + var signedMsg = nacl.sign(msg, secretKey); + var sig = new Uint8Array(crypto_sign_BYTES); + for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; + return sig; +}; + +nacl.sign.detached.verify = function(msg, sig, publicKey) { + checkArrayTypes(msg, sig, publicKey); + if (sig.length !== crypto_sign_BYTES) + throw new Error('bad signature size'); + if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) + throw new Error('bad public key size'); + var sm = new Uint8Array(crypto_sign_BYTES + msg.length); + var m = new Uint8Array(crypto_sign_BYTES + msg.length); + var i; + for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; + for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; + return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); +}; + +nacl.sign.keyPair = function() { + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + crypto_sign_keypair(pk, sk); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.keyPair.fromSecretKey = function(secretKey) { + checkArrayTypes(secretKey); + if (secretKey.length !== crypto_sign_SECRETKEYBYTES) + throw new Error('bad secret key size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; + return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; +}; + +nacl.sign.keyPair.fromSeed = function(seed) { + checkArrayTypes(seed); + if (seed.length !== crypto_sign_SEEDBYTES) + throw new Error('bad seed size'); + var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); + var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); + for (var i = 0; i < 32; i++) sk[i] = seed[i]; + crypto_sign_keypair(pk, sk, true); + return {publicKey: pk, secretKey: sk}; +}; + +nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; +nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; +nacl.sign.seedLength = crypto_sign_SEEDBYTES; +nacl.sign.signatureLength = crypto_sign_BYTES; + +nacl.hash = function(msg) { + checkArrayTypes(msg); + var h = new Uint8Array(crypto_hash_BYTES); + crypto_hash(h, msg, msg.length); + return h; +}; + +nacl.hash.hashLength = crypto_hash_BYTES; + +nacl.verify = function(x, y) { + checkArrayTypes(x, y); + // Zero length arguments are considered not equal. + if (x.length === 0 || y.length === 0) return false; + if (x.length !== y.length) return false; + return (vn(x, 0, y, 0, x.length) === 0) ? true : false; +}; + +nacl.setPRNG = function(fn) { + randombytes = fn; +}; + +(function() { + // Initialize PRNG if environment provides CSPRNG. + // If not, methods calling randombytes will throw. + var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function(x, n) { + var i, v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } else if (typeof require !== 'undefined') { + // Node.js. + crypto = require('crypto'); + if (crypto && crypto.randomBytes) { + nacl.setPRNG(function(x, n) { + var i, v = crypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); + } + } +})(); + +})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/packages/字体精简工具/node_modules/tweetnacl/nacl.min.js b/packages/字体精简工具/node_modules/tweetnacl/nacl.min.js new file mode 100644 index 0000000..4484974 --- /dev/null +++ b/packages/字体精简工具/node_modules/tweetnacl/nacl.min.js @@ -0,0 +1 @@ +!function(r){"use strict";function n(r,n){return r<>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new sr(e,t)}function o(r,n,e){var t;for(t=0;t<4;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;i>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),l=new Uint32Array(16),s=new Uint32Array(16),h=new Uint32Array(4);for(u=0;u<4;u++)l[5*u]=e(a,4*u),l[1+u]=e(i,4*u),l[6+u]=e(t,4*u),l[11+u]=e(i,16+4*u);for(u=0;u<16;u++)s[u]=l[u];for(u=0;u<20;u++){for(c=0;c<4;c++){for(w=0;w<4;w++)h[w]=l[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;w<4;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;w<16;w++)l[w]=y[w]}if(f){for(u=0;u<16;u++)l[u]=l[u]+s[u]|0;for(u=0;u<4;u++)l[5*u]=l[5*u]-e(a,4*u)|0,l[6+u]=l[6+u]-e(t,4*u)|0;for(u=0;u<4;u++)o(r,4*u,l[5*u]),o(r,16+4*u,l[6+u])}else for(u=0;u<16;u++)o(r,4*u,l[u]+s[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function l(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;u<16;u++)c[u]=0;for(u=0;u<8;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Br),u=0;u<64;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;u<16;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Br),u=0;u>>=8}function b(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),l=new Uint32Array(17),s=new Uint32Array(17),h=new Uint32Array(17);for(u=0;u<17;u++)y[u]=l[u]=0;for(u=0;u<16;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;u<17;u++)s[u]=0;for(u=0;u<16&&u>>=8;for(c=c+l[16]|0,l[16]=3&c,c=5*(c>>>2)|0,u=0;u<16;u++)c=c+l[u]|0,l[u]=255&c,c>>>=8;c=c+l[16]|0,l[16]=c}for(u=0;u<17;u++)h[u]=l[u];for(v(l,Sr),a=0|-(l[16]>>>7),u=0;u<17;u++)l[u]^=a&(h[u]^l[u]);for(u=0;u<16;u++)s[u]=i[u+16];for(s[16]=0,v(l,s),u=0;u<16;u++)r[n+u]=l[u];return 0}function p(r,n,e,t,o,i){var a=new Uint8Array(16);return b(a,0,e,t,o,i),f(r,n,a,0)}function _(r,n,e,t,o){var i;if(e<32)return-1;for(g(r,0,n,0,e,t,o),b(r,16,r,32,e-32,r),i=0;i<16;i++)r[i]=0;return 0}function A(r,n,e,t,o){var i,a=new Uint8Array(32);if(e<32)return-1;if(h(a,0,32,t,o),0!==p(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;i<32;i++)r[i]=0;return 0}function U(r,n){var e;for(e=0;e<16;e++)r[e]=0|n[e]}function E(r){var n,e;for(e=0;e<16;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(e<15?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function d(r,n,e){for(var t,o=~(e-1),i=0;i<16;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hr(),a=hr();for(e=0;e<16;e++)a[e]=n[e];for(E(a),E(a),E(a),t=0;t<2;t++){for(i[0]=a[0]-65517,e=1;e<15;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(a,i,1-o)}for(e=0;e<16;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;e<16;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;t<16;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;t<31;t++)i[t]=0;for(t=0;t<16;t++)for(o=0;o<16;o++)i[t+o]+=n[t]*e[o];for(t=0;t<15;t++)i[t]+=38*i[t+16];for(t=0;t<16;t++)r[t]=i[t];E(r),E(r)}function L(r,n){Y(r,n,n)}function k(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function z(r,n){var e,t=hr();for(e=0;e<16;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;e<16;e++)r[e]=t[e]}function R(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hr(),u=hr(),c=hr(),w=hr(),y=hr(),l=hr();for(o=0;o<31;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;o<16;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,d(f,u,t),d(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(l,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,l),Y(f,c,Ar),K(f,f,w),Y(c,c,f),Y(f,w,l),Y(w,u,a),L(u,y),d(f,u,t),d(c,w,t);for(o=0;o<16;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var s=a.subarray(32),h=a.subarray(16);return k(s,s),Y(h,h,s),x(r,h),0}function P(r,n){return R(r,n,br)}function O(r,n){return gr(n,32),P(r,n)}function F(r,n,e){var t=new Uint8Array(32);return R(t,e,n),y(r,vr,t,Br)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Kr(r,n,e,t,a)}function C(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Tr(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new sr(i&f|a<<16,t&f|o<<16)}function G(r,n){return new sr(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function Z(){var r,n=0,e=0;for(r=0;r>>n|r.lo<>>n|r.hi<>>n|r.hi<>>n|r.lo<=128;){for(a=0;a<16;a++)y[a]=t(n,8*a+l);for(a=0;a<80;a++){for(f=0;f<8;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),q(w[4],w[5],w[6]),Yr[a],y[a%16]),c[7]=M(o,V(w[0]),I(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;f<8;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;f<16;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;a<8;a++)w[a]=M(w[a],u[a]),u[a]=w[a];l+=128,e-=128}for(a=0;a<8;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;t<64;t++)o[t]=Lr[t];for(J(o,n,e),e%=128,t=0;t<256;t++)a[t]=0;for(t=0;t=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function er(r,n){var e=[hr(),hr(),hr(),hr()];U(e[0],dr),U(e[1],xr),U(e[2],_r),Y(e[3],dr,xr),nr(r,e,n)}function tr(r,n,e){var t,o=new Uint8Array(64),i=[hr(),hr(),hr(),hr()];for(e||gr(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,er(i,o),rr(r,i),t=0;t<32;t++)n[t+32]=r[t];return 0}function or(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;o>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;o<32;o++)n[o]+=e-(n[31]>>4)*kr[o],e=n[o]>>8,n[o]&=255;for(o=0;o<32;o++)n[o]-=e*kr[o];for(t=0;t<32;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function ir(r){var n,e=new Float64Array(64);for(n=0;n<64;n++)e[n]=r[n];for(n=0;n<64;n++)r[n]=0;or(r,e)}function ar(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hr(),hr(),hr(),hr()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;o>7&&T(r[0],pr,r[0]),Y(r[3],r[0],r[1]),0)}function ur(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hr(),hr(),hr(),hr()],w=[hr(),hr(),hr(),hr()];if(i=-1,e<64)return-1;if(fr(w,t))return-1;for(o=0;o=0},r.sign.keyPair=function(){var r=new Uint8Array(Vr),n=new Uint8Array(Xr);return tr(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Xr)throw new Error("bad secret key size");for(var n=new Uint8Array(Vr),e=0;e/dev/null && browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null", + "lint": "eslint nacl.js nacl-fast.js test/*.js test/benchmark/*.js", + "test": "npm run test-node-all && npm run test-browser", + "test-browser": "NACL_SRC=${NACL_SRC:='nacl.min.js'} && npm run build-test-browser && cat $NACL_SRC test/browser/_bundle.js | tape-run | faucet", + "test-node": "tape test/*.js | faucet", + "test-node-all": "make -C test/c && tape test/*.js test/c/*.js | faucet" + }, + "types": "nacl.d.ts", + "version": "0.14.5" +} diff --git a/packages/字体精简工具/node_modules/typedarray/.travis.yml b/packages/字体精简工具/node_modules/typedarray/.travis.yml new file mode 100644 index 0000000..cc4dba2 --- /dev/null +++ b/packages/字体精简工具/node_modules/typedarray/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/packages/字体精简工具/node_modules/typedarray/LICENSE b/packages/字体精简工具/node_modules/typedarray/LICENSE new file mode 100644 index 0000000..11adfae --- /dev/null +++ b/packages/字体精简工具/node_modules/typedarray/LICENSE @@ -0,0 +1,35 @@ +/* + Copyright (c) 2010, Linden Research, Inc. + Copyright (c) 2012, Joshua Bell + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + $/LicenseInfo$ + */ + +// Original can be found at: +// https://bitbucket.org/lindenlab/llsd +// Modifications by Joshua Bell inexorabletash@gmail.com +// https://github.com/inexorabletash/polyfill + +// ES3/ES5 implementation of the Krhonos Typed Array Specification +// Ref: http://www.khronos.org/registry/typedarray/specs/latest/ +// Date: 2011-02-01 +// +// Variations: +// * Allows typed_array.get/set() as alias for subscripts (typed_array[]) diff --git a/packages/字体精简工具/node_modules/typedarray/example/tarray.js b/packages/字体精简工具/node_modules/typedarray/example/tarray.js new file mode 100644 index 0000000..8423d7c --- /dev/null +++ b/packages/字体精简工具/node_modules/typedarray/example/tarray.js @@ -0,0 +1,4 @@ +var Uint8Array = require('../').Uint8Array; +var ua = new Uint8Array(5); +ua[1] = 256 + 55; +console.log(ua[1]); diff --git a/packages/字体精简工具/node_modules/typedarray/index.js b/packages/字体精简工具/node_modules/typedarray/index.js new file mode 100644 index 0000000..5e54084 --- /dev/null +++ b/packages/字体精简工具/node_modules/typedarray/index.js @@ -0,0 +1,630 @@ +var undefined = (void 0); // Paranoia + +// Beyond this value, index getters/setters (i.e. array[0], array[1]) are so slow to +// create, and consume so much memory, that the browser appears frozen. +var MAX_ARRAY_LENGTH = 1e5; + +// Approximations of internal ECMAScript conversion functions +var ECMAScript = (function() { + // Stash a copy in case other scripts modify these + var opts = Object.prototype.toString, + ophop = Object.prototype.hasOwnProperty; + + return { + // Class returns internal [[Class]] property, used to avoid cross-frame instanceof issues: + Class: function(v) { return opts.call(v).replace(/^\[object *|\]$/g, ''); }, + HasProperty: function(o, p) { return p in o; }, + HasOwnProperty: function(o, p) { return ophop.call(o, p); }, + IsCallable: function(o) { return typeof o === 'function'; }, + ToInt32: function(v) { return v >> 0; }, + ToUint32: function(v) { return v >>> 0; } + }; +}()); + +// Snapshot intrinsics +var LN2 = Math.LN2, + abs = Math.abs, + floor = Math.floor, + log = Math.log, + min = Math.min, + pow = Math.pow, + round = Math.round; + +// ES5: lock down object properties +function configureProperties(obj) { + if (getOwnPropNames && defineProp) { + var props = getOwnPropNames(obj), i; + for (i = 0; i < props.length; i += 1) { + defineProp(obj, props[i], { + value: obj[props[i]], + writable: false, + enumerable: false, + configurable: false + }); + } + } +} + +// emulate ES5 getter/setter API using legacy APIs +// http://blogs.msdn.com/b/ie/archive/2010/09/07/transitioning-existing-code-to-the-es5-getter-setter-apis.aspx +// (second clause tests for Object.defineProperty() in IE<9 that only supports extending DOM prototypes, but +// note that IE<9 does not support __defineGetter__ or __defineSetter__ so it just renders the method harmless) +var defineProp +if (Object.defineProperty && (function() { + try { + Object.defineProperty({}, 'x', {}); + return true; + } catch (e) { + return false; + } + })()) { + defineProp = Object.defineProperty; +} else { + defineProp = function(o, p, desc) { + if (!o === Object(o)) throw new TypeError("Object.defineProperty called on non-object"); + if (ECMAScript.HasProperty(desc, 'get') && Object.prototype.__defineGetter__) { Object.prototype.__defineGetter__.call(o, p, desc.get); } + if (ECMAScript.HasProperty(desc, 'set') && Object.prototype.__defineSetter__) { Object.prototype.__defineSetter__.call(o, p, desc.set); } + if (ECMAScript.HasProperty(desc, 'value')) { o[p] = desc.value; } + return o; + }; +} + +var getOwnPropNames = Object.getOwnPropertyNames || function (o) { + if (o !== Object(o)) throw new TypeError("Object.getOwnPropertyNames called on non-object"); + var props = [], p; + for (p in o) { + if (ECMAScript.HasOwnProperty(o, p)) { + props.push(p); + } + } + return props; +}; + +// ES5: Make obj[index] an alias for obj._getter(index)/obj._setter(index, value) +// for index in 0 ... obj.length +function makeArrayAccessors(obj) { + if (!defineProp) { return; } + + if (obj.length > MAX_ARRAY_LENGTH) throw new RangeError("Array too large for polyfill"); + + function makeArrayAccessor(index) { + defineProp(obj, index, { + 'get': function() { return obj._getter(index); }, + 'set': function(v) { obj._setter(index, v); }, + enumerable: true, + configurable: false + }); + } + + var i; + for (i = 0; i < obj.length; i += 1) { + makeArrayAccessor(i); + } +} + +// Internal conversion functions: +// pack() - take a number (interpreted as Type), output a byte array +// unpack() - take a byte array, output a Type-like number + +function as_signed(value, bits) { var s = 32 - bits; return (value << s) >> s; } +function as_unsigned(value, bits) { var s = 32 - bits; return (value << s) >>> s; } + +function packI8(n) { return [n & 0xff]; } +function unpackI8(bytes) { return as_signed(bytes[0], 8); } + +function packU8(n) { return [n & 0xff]; } +function unpackU8(bytes) { return as_unsigned(bytes[0], 8); } + +function packU8Clamped(n) { n = round(Number(n)); return [n < 0 ? 0 : n > 0xff ? 0xff : n & 0xff]; } + +function packI16(n) { return [(n >> 8) & 0xff, n & 0xff]; } +function unpackI16(bytes) { return as_signed(bytes[0] << 8 | bytes[1], 16); } + +function packU16(n) { return [(n >> 8) & 0xff, n & 0xff]; } +function unpackU16(bytes) { return as_unsigned(bytes[0] << 8 | bytes[1], 16); } + +function packI32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; } +function unpackI32(bytes) { return as_signed(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); } + +function packU32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; } +function unpackU32(bytes) { return as_unsigned(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); } + +function packIEEE754(v, ebits, fbits) { + + var bias = (1 << (ebits - 1)) - 1, + s, e, f, ln, + i, bits, str, bytes; + + function roundToEven(n) { + var w = floor(n), f = n - w; + if (f < 0.5) + return w; + if (f > 0.5) + return w + 1; + return w % 2 ? w + 1 : w; + } + + // Compute sign, exponent, fraction + if (v !== v) { + // NaN + // http://dev.w3.org/2006/webapi/WebIDL/#es-type-mapping + e = (1 << ebits) - 1; f = pow(2, fbits - 1); s = 0; + } else if (v === Infinity || v === -Infinity) { + e = (1 << ebits) - 1; f = 0; s = (v < 0) ? 1 : 0; + } else if (v === 0) { + e = 0; f = 0; s = (1 / v === -Infinity) ? 1 : 0; + } else { + s = v < 0; + v = abs(v); + + if (v >= pow(2, 1 - bias)) { + e = min(floor(log(v) / LN2), 1023); + f = roundToEven(v / pow(2, e) * pow(2, fbits)); + if (f / pow(2, fbits) >= 2) { + e = e + 1; + f = 1; + } + if (e > bias) { + // Overflow + e = (1 << ebits) - 1; + f = 0; + } else { + // Normalized + e = e + bias; + f = f - pow(2, fbits); + } + } else { + // Denormalized + e = 0; + f = roundToEven(v / pow(2, 1 - bias - fbits)); + } + } + + // Pack sign, exponent, fraction + bits = []; + for (i = fbits; i; i -= 1) { bits.push(f % 2 ? 1 : 0); f = floor(f / 2); } + for (i = ebits; i; i -= 1) { bits.push(e % 2 ? 1 : 0); e = floor(e / 2); } + bits.push(s ? 1 : 0); + bits.reverse(); + str = bits.join(''); + + // Bits to bytes + bytes = []; + while (str.length) { + bytes.push(parseInt(str.substring(0, 8), 2)); + str = str.substring(8); + } + return bytes; +} + +function unpackIEEE754(bytes, ebits, fbits) { + + // Bytes to bits + var bits = [], i, j, b, str, + bias, s, e, f; + + for (i = bytes.length; i; i -= 1) { + b = bytes[i - 1]; + for (j = 8; j; j -= 1) { + bits.push(b % 2 ? 1 : 0); b = b >> 1; + } + } + bits.reverse(); + str = bits.join(''); + + // Unpack sign, exponent, fraction + bias = (1 << (ebits - 1)) - 1; + s = parseInt(str.substring(0, 1), 2) ? -1 : 1; + e = parseInt(str.substring(1, 1 + ebits), 2); + f = parseInt(str.substring(1 + ebits), 2); + + // Produce number + if (e === (1 << ebits) - 1) { + return f !== 0 ? NaN : s * Infinity; + } else if (e > 0) { + // Normalized + return s * pow(2, e - bias) * (1 + f / pow(2, fbits)); + } else if (f !== 0) { + // Denormalized + return s * pow(2, -(bias - 1)) * (f / pow(2, fbits)); + } else { + return s < 0 ? -0 : 0; + } +} + +function unpackF64(b) { return unpackIEEE754(b, 11, 52); } +function packF64(v) { return packIEEE754(v, 11, 52); } +function unpackF32(b) { return unpackIEEE754(b, 8, 23); } +function packF32(v) { return packIEEE754(v, 8, 23); } + + +// +// 3 The ArrayBuffer Type +// + +(function() { + + /** @constructor */ + var ArrayBuffer = function ArrayBuffer(length) { + length = ECMAScript.ToInt32(length); + if (length < 0) throw new RangeError('ArrayBuffer size is not a small enough positive integer'); + + this.byteLength = length; + this._bytes = []; + this._bytes.length = length; + + var i; + for (i = 0; i < this.byteLength; i += 1) { + this._bytes[i] = 0; + } + + configureProperties(this); + }; + + exports.ArrayBuffer = exports.ArrayBuffer || ArrayBuffer; + + // + // 4 The ArrayBufferView Type + // + + // NOTE: this constructor is not exported + /** @constructor */ + var ArrayBufferView = function ArrayBufferView() { + //this.buffer = null; + //this.byteOffset = 0; + //this.byteLength = 0; + }; + + // + // 5 The Typed Array View Types + // + + function makeConstructor(bytesPerElement, pack, unpack) { + // Each TypedArray type requires a distinct constructor instance with + // identical logic, which this produces. + + var ctor; + ctor = function(buffer, byteOffset, length) { + var array, sequence, i, s; + + if (!arguments.length || typeof arguments[0] === 'number') { + // Constructor(unsigned long length) + this.length = ECMAScript.ToInt32(arguments[0]); + if (length < 0) throw new RangeError('ArrayBufferView size is not a small enough positive integer'); + + this.byteLength = this.length * this.BYTES_PER_ELEMENT; + this.buffer = new ArrayBuffer(this.byteLength); + this.byteOffset = 0; + } else if (typeof arguments[0] === 'object' && arguments[0].constructor === ctor) { + // Constructor(TypedArray array) + array = arguments[0]; + + this.length = array.length; + this.byteLength = this.length * this.BYTES_PER_ELEMENT; + this.buffer = new ArrayBuffer(this.byteLength); + this.byteOffset = 0; + + for (i = 0; i < this.length; i += 1) { + this._setter(i, array._getter(i)); + } + } else if (typeof arguments[0] === 'object' && + !(arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) { + // Constructor(sequence array) + sequence = arguments[0]; + + this.length = ECMAScript.ToUint32(sequence.length); + this.byteLength = this.length * this.BYTES_PER_ELEMENT; + this.buffer = new ArrayBuffer(this.byteLength); + this.byteOffset = 0; + + for (i = 0; i < this.length; i += 1) { + s = sequence[i]; + this._setter(i, Number(s)); + } + } else if (typeof arguments[0] === 'object' && + (arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) { + // Constructor(ArrayBuffer buffer, + // optional unsigned long byteOffset, optional unsigned long length) + this.buffer = buffer; + + this.byteOffset = ECMAScript.ToUint32(byteOffset); + if (this.byteOffset > this.buffer.byteLength) { + throw new RangeError("byteOffset out of range"); + } + + if (this.byteOffset % this.BYTES_PER_ELEMENT) { + // The given byteOffset must be a multiple of the element + // size of the specific type, otherwise an exception is raised. + throw new RangeError("ArrayBuffer length minus the byteOffset is not a multiple of the element size."); + } + + if (arguments.length < 3) { + this.byteLength = this.buffer.byteLength - this.byteOffset; + + if (this.byteLength % this.BYTES_PER_ELEMENT) { + throw new RangeError("length of buffer minus byteOffset not a multiple of the element size"); + } + this.length = this.byteLength / this.BYTES_PER_ELEMENT; + } else { + this.length = ECMAScript.ToUint32(length); + this.byteLength = this.length * this.BYTES_PER_ELEMENT; + } + + if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) { + throw new RangeError("byteOffset and length reference an area beyond the end of the buffer"); + } + } else { + throw new TypeError("Unexpected argument type(s)"); + } + + this.constructor = ctor; + + configureProperties(this); + makeArrayAccessors(this); + }; + + ctor.prototype = new ArrayBufferView(); + ctor.prototype.BYTES_PER_ELEMENT = bytesPerElement; + ctor.prototype._pack = pack; + ctor.prototype._unpack = unpack; + ctor.BYTES_PER_ELEMENT = bytesPerElement; + + // getter type (unsigned long index); + ctor.prototype._getter = function(index) { + if (arguments.length < 1) throw new SyntaxError("Not enough arguments"); + + index = ECMAScript.ToUint32(index); + if (index >= this.length) { + return undefined; + } + + var bytes = [], i, o; + for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT; + i < this.BYTES_PER_ELEMENT; + i += 1, o += 1) { + bytes.push(this.buffer._bytes[o]); + } + return this._unpack(bytes); + }; + + // NONSTANDARD: convenience alias for getter: type get(unsigned long index); + ctor.prototype.get = ctor.prototype._getter; + + // setter void (unsigned long index, type value); + ctor.prototype._setter = function(index, value) { + if (arguments.length < 2) throw new SyntaxError("Not enough arguments"); + + index = ECMAScript.ToUint32(index); + if (index >= this.length) { + return undefined; + } + + var bytes = this._pack(value), i, o; + for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT; + i < this.BYTES_PER_ELEMENT; + i += 1, o += 1) { + this.buffer._bytes[o] = bytes[i]; + } + }; + + // void set(TypedArray array, optional unsigned long offset); + // void set(sequence array, optional unsigned long offset); + ctor.prototype.set = function(index, value) { + if (arguments.length < 1) throw new SyntaxError("Not enough arguments"); + var array, sequence, offset, len, + i, s, d, + byteOffset, byteLength, tmp; + + if (typeof arguments[0] === 'object' && arguments[0].constructor === this.constructor) { + // void set(TypedArray array, optional unsigned long offset); + array = arguments[0]; + offset = ECMAScript.ToUint32(arguments[1]); + + if (offset + array.length > this.length) { + throw new RangeError("Offset plus length of array is out of range"); + } + + byteOffset = this.byteOffset + offset * this.BYTES_PER_ELEMENT; + byteLength = array.length * this.BYTES_PER_ELEMENT; + + if (array.buffer === this.buffer) { + tmp = []; + for (i = 0, s = array.byteOffset; i < byteLength; i += 1, s += 1) { + tmp[i] = array.buffer._bytes[s]; + } + for (i = 0, d = byteOffset; i < byteLength; i += 1, d += 1) { + this.buffer._bytes[d] = tmp[i]; + } + } else { + for (i = 0, s = array.byteOffset, d = byteOffset; + i < byteLength; i += 1, s += 1, d += 1) { + this.buffer._bytes[d] = array.buffer._bytes[s]; + } + } + } else if (typeof arguments[0] === 'object' && typeof arguments[0].length !== 'undefined') { + // void set(sequence array, optional unsigned long offset); + sequence = arguments[0]; + len = ECMAScript.ToUint32(sequence.length); + offset = ECMAScript.ToUint32(arguments[1]); + + if (offset + len > this.length) { + throw new RangeError("Offset plus length of array is out of range"); + } + + for (i = 0; i < len; i += 1) { + s = sequence[i]; + this._setter(offset + i, Number(s)); + } + } else { + throw new TypeError("Unexpected argument type(s)"); + } + }; + + // TypedArray subarray(long begin, optional long end); + ctor.prototype.subarray = function(start, end) { + function clamp(v, min, max) { return v < min ? min : v > max ? max : v; } + + start = ECMAScript.ToInt32(start); + end = ECMAScript.ToInt32(end); + + if (arguments.length < 1) { start = 0; } + if (arguments.length < 2) { end = this.length; } + + if (start < 0) { start = this.length + start; } + if (end < 0) { end = this.length + end; } + + start = clamp(start, 0, this.length); + end = clamp(end, 0, this.length); + + var len = end - start; + if (len < 0) { + len = 0; + } + + return new this.constructor( + this.buffer, this.byteOffset + start * this.BYTES_PER_ELEMENT, len); + }; + + return ctor; + } + + var Int8Array = makeConstructor(1, packI8, unpackI8); + var Uint8Array = makeConstructor(1, packU8, unpackU8); + var Uint8ClampedArray = makeConstructor(1, packU8Clamped, unpackU8); + var Int16Array = makeConstructor(2, packI16, unpackI16); + var Uint16Array = makeConstructor(2, packU16, unpackU16); + var Int32Array = makeConstructor(4, packI32, unpackI32); + var Uint32Array = makeConstructor(4, packU32, unpackU32); + var Float32Array = makeConstructor(4, packF32, unpackF32); + var Float64Array = makeConstructor(8, packF64, unpackF64); + + exports.Int8Array = exports.Int8Array || Int8Array; + exports.Uint8Array = exports.Uint8Array || Uint8Array; + exports.Uint8ClampedArray = exports.Uint8ClampedArray || Uint8ClampedArray; + exports.Int16Array = exports.Int16Array || Int16Array; + exports.Uint16Array = exports.Uint16Array || Uint16Array; + exports.Int32Array = exports.Int32Array || Int32Array; + exports.Uint32Array = exports.Uint32Array || Uint32Array; + exports.Float32Array = exports.Float32Array || Float32Array; + exports.Float64Array = exports.Float64Array || Float64Array; +}()); + +// +// 6 The DataView View Type +// + +(function() { + function r(array, index) { + return ECMAScript.IsCallable(array.get) ? array.get(index) : array[index]; + } + + var IS_BIG_ENDIAN = (function() { + var u16array = new(exports.Uint16Array)([0x1234]), + u8array = new(exports.Uint8Array)(u16array.buffer); + return r(u8array, 0) === 0x12; + }()); + + // Constructor(ArrayBuffer buffer, + // optional unsigned long byteOffset, + // optional unsigned long byteLength) + /** @constructor */ + var DataView = function DataView(buffer, byteOffset, byteLength) { + if (arguments.length === 0) { + buffer = new exports.ArrayBuffer(0); + } else if (!(buffer instanceof exports.ArrayBuffer || ECMAScript.Class(buffer) === 'ArrayBuffer')) { + throw new TypeError("TypeError"); + } + + this.buffer = buffer || new exports.ArrayBuffer(0); + + this.byteOffset = ECMAScript.ToUint32(byteOffset); + if (this.byteOffset > this.buffer.byteLength) { + throw new RangeError("byteOffset out of range"); + } + + if (arguments.length < 3) { + this.byteLength = this.buffer.byteLength - this.byteOffset; + } else { + this.byteLength = ECMAScript.ToUint32(byteLength); + } + + if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) { + throw new RangeError("byteOffset and length reference an area beyond the end of the buffer"); + } + + configureProperties(this); + }; + + function makeGetter(arrayType) { + return function(byteOffset, littleEndian) { + + byteOffset = ECMAScript.ToUint32(byteOffset); + + if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) { + throw new RangeError("Array index out of range"); + } + byteOffset += this.byteOffset; + + var uint8Array = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT), + bytes = [], i; + for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) { + bytes.push(r(uint8Array, i)); + } + + if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) { + bytes.reverse(); + } + + return r(new arrayType(new exports.Uint8Array(bytes).buffer), 0); + }; + } + + DataView.prototype.getUint8 = makeGetter(exports.Uint8Array); + DataView.prototype.getInt8 = makeGetter(exports.Int8Array); + DataView.prototype.getUint16 = makeGetter(exports.Uint16Array); + DataView.prototype.getInt16 = makeGetter(exports.Int16Array); + DataView.prototype.getUint32 = makeGetter(exports.Uint32Array); + DataView.prototype.getInt32 = makeGetter(exports.Int32Array); + DataView.prototype.getFloat32 = makeGetter(exports.Float32Array); + DataView.prototype.getFloat64 = makeGetter(exports.Float64Array); + + function makeSetter(arrayType) { + return function(byteOffset, value, littleEndian) { + + byteOffset = ECMAScript.ToUint32(byteOffset); + if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) { + throw new RangeError("Array index out of range"); + } + + // Get bytes + var typeArray = new arrayType([value]), + byteArray = new exports.Uint8Array(typeArray.buffer), + bytes = [], i, byteView; + + for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) { + bytes.push(r(byteArray, i)); + } + + // Flip if necessary + if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) { + bytes.reverse(); + } + + // Write them + byteView = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT); + byteView.set(bytes); + }; + } + + DataView.prototype.setUint8 = makeSetter(exports.Uint8Array); + DataView.prototype.setInt8 = makeSetter(exports.Int8Array); + DataView.prototype.setUint16 = makeSetter(exports.Uint16Array); + DataView.prototype.setInt16 = makeSetter(exports.Int16Array); + DataView.prototype.setUint32 = makeSetter(exports.Uint32Array); + DataView.prototype.setInt32 = makeSetter(exports.Int32Array); + DataView.prototype.setFloat32 = makeSetter(exports.Float32Array); + DataView.prototype.setFloat64 = makeSetter(exports.Float64Array); + + exports.DataView = exports.DataView || DataView; + +}()); diff --git a/packages/字体精简工具/node_modules/typedarray/package.json b/packages/字体精简工具/node_modules/typedarray/package.json new file mode 100644 index 0000000..e05ac0d --- /dev/null +++ b/packages/字体精简工具/node_modules/typedarray/package.json @@ -0,0 +1,83 @@ +{ + "_from": "typedarray@^0.0.6", + "_id": "typedarray@0.0.6", + "_inBundle": false, + "_integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "_location": "/typedarray", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "typedarray@^0.0.6", + "name": "typedarray", + "escapedName": "typedarray", + "rawSpec": "^0.0.6", + "saveSpec": null, + "fetchSpec": "^0.0.6" + }, + "_requiredBy": [ + "/concat-stream" + ], + "_resolved": "https://registry.nlark.com/typedarray/download/typedarray-0.0.6.tgz", + "_shasum": "867ac74e3864187b1d3d47d996a78ec5c8830777", + "_spec": "typedarray@^0.0.6", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\concat-stream", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "bugs": { + "url": "https://github.com/substack/typedarray/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "TypedArray polyfill for old browsers", + "devDependencies": { + "tape": "~2.3.2" + }, + "homepage": "https://github.com/substack/typedarray", + "keywords": [ + "ArrayBuffer", + "DataView", + "Float32Array", + "Float64Array", + "Int8Array", + "Int16Array", + "Int32Array", + "Uint8Array", + "Uint8ClampedArray", + "Uint16Array", + "Uint32Array", + "typed", + "array", + "polyfill" + ], + "license": "MIT", + "main": "index.js", + "name": "typedarray", + "repository": { + "type": "git", + "url": "git://github.com/substack/typedarray.git" + }, + "scripts": { + "test": "tape test/*.js test/server/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/6..latest", + "firefox/16..latest", + "firefox/nightly", + "chrome/22..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "0.0.6" +} diff --git a/packages/字体精简工具/node_modules/typedarray/readme.markdown b/packages/字体精简工具/node_modules/typedarray/readme.markdown new file mode 100644 index 0000000..d18f6f7 --- /dev/null +++ b/packages/字体精简工具/node_modules/typedarray/readme.markdown @@ -0,0 +1,61 @@ +# typedarray + +TypedArray polyfill ripped from [this +module](https://raw.github.com/inexorabletash/polyfill). + +[![build status](https://secure.travis-ci.org/substack/typedarray.png)](http://travis-ci.org/substack/typedarray) + +[![testling badge](https://ci.testling.com/substack/typedarray.png)](https://ci.testling.com/substack/typedarray) + +# example + +``` js +var Uint8Array = require('typedarray').Uint8Array; +var ua = new Uint8Array(5); +ua[1] = 256 + 55; +console.log(ua[1]); +``` + +output: + +``` +55 +``` + +# methods + +``` js +var TA = require('typedarray') +``` + +The `TA` object has the following constructors: + +* TA.ArrayBuffer +* TA.DataView +* TA.Float32Array +* TA.Float64Array +* TA.Int8Array +* TA.Int16Array +* TA.Int32Array +* TA.Uint8Array +* TA.Uint8ClampedArray +* TA.Uint16Array +* TA.Uint32Array + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install typedarray +``` + +To use this module in the browser, compile with +[browserify](http://browserify.org) +or download a UMD build from browserify CDN: + +http://wzrd.in/standalone/typedarray@latest + +# license + +MIT diff --git a/packages/字体精简工具/node_modules/typedarray/test/server/undef_globals.js b/packages/字体精简工具/node_modules/typedarray/test/server/undef_globals.js new file mode 100644 index 0000000..425950f --- /dev/null +++ b/packages/字体精简工具/node_modules/typedarray/test/server/undef_globals.js @@ -0,0 +1,19 @@ +var test = require('tape'); +var vm = require('vm'); +var fs = require('fs'); +var src = fs.readFileSync(__dirname + '/../../index.js', 'utf8'); + +test('u8a without globals', function (t) { + var c = { + module: { exports: {} }, + }; + c.exports = c.module.exports; + vm.runInNewContext(src, c); + var TA = c.module.exports; + var ua = new(TA.Uint8Array)(5); + + t.equal(ua.length, 5); + ua[1] = 256 + 55; + t.equal(ua[1], 55); + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/typedarray/test/tarray.js b/packages/字体精简工具/node_modules/typedarray/test/tarray.js new file mode 100644 index 0000000..df596a3 --- /dev/null +++ b/packages/字体精简工具/node_modules/typedarray/test/tarray.js @@ -0,0 +1,10 @@ +var TA = require('../'); +var test = require('tape'); + +test('tiny u8a test', function (t) { + var ua = new(TA.Uint8Array)(5); + t.equal(ua.length, 5); + ua[1] = 256 + 55; + t.equal(ua[1], 55); + t.end(); +}); diff --git a/packages/字体精简工具/node_modules/unc-path-regex/LICENSE b/packages/字体精简工具/node_modules/unc-path-regex/LICENSE new file mode 100644 index 0000000..65f90ac --- /dev/null +++ b/packages/字体精简工具/node_modules/unc-path-regex/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/unc-path-regex/README.md b/packages/字体精简工具/node_modules/unc-path-regex/README.md new file mode 100644 index 0000000..e0eddda --- /dev/null +++ b/packages/字体精简工具/node_modules/unc-path-regex/README.md @@ -0,0 +1,88 @@ +# unc-path-regex [![NPM version](https://badge.fury.io/js/unc-path-regex.svg)](http://badge.fury.io/js/unc-path-regex) [![Build Status](https://travis-ci.org/jonschlinkert/unc-path-regex.svg)](https://travis-ci.org/jonschlinkert/unc-path-regex) + +> Regular expression for testing if a file path is a windows UNC file path. Can also be used as a component of another regexp via the `.source` property. + +Visit the MSDN reference for [Common Data Types 2.2.57 UNC](https://msdn.microsoft.com/en-us/library/gg465305.aspx) for more information about UNC paths. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i unc-path-regex --save +``` + +## Usage + +```js +// unc-path-regex returns a function +var regex = require('unc-path-regex')(); +``` + +**true** + +Returns true for windows UNC paths: + +```js +regex.test('\\/foo/bar'); +regex.test('\\\\foo/bar'); +regex.test('\\\\foo\\admin$'); +regex.test('\\\\foo\\admin$\\system32'); +regex.test('\\\\foo\\temp'); +regex.test('\\\\/foo/bar'); +regex.test('\\\\\\/foo/bar'); +``` + +**false** + +Returns false for non-UNC paths: + +```js +regex.test('/foo/bar'); +regex.test('/'); +regex.test('/foo'); +regex.test('/foo/'); +regex.test('c:'); +regex.test('c:.'); +regex.test('c:./'); +regex.test('c:./file'); +regex.test('c:/'); +regex.test('c:/file'); +``` + +## Related projects + +* [dotfile-regex](https://github.com/regexps/dotfile-regex): Regular expresson for matching dotfiles. +* [dotdir-regex](https://github.com/regexps/dotdir-regex): Regex for matching dot-directories, like `.git/` +* [dirname-regex](https://github.com/regexps/dirname-regex): Regular expression for matching the directory part of a file path. +* [is-unc-path](https://github.com/jonschlinkert/is-unc-path): Returns true if a filepath is a windows UNC file path. +* [is-glob](https://github.com/jonschlinkert/is-glob): Returns `true` if the given string looks like a glob pattern. +* [path-regex](https://github.com/regexps/path-regex): Regular expression for matching the parts of a file path. + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/unc-path-regex/issues/new) + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on July 07, 2015._ \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/unc-path-regex/index.js b/packages/字体精简工具/node_modules/unc-path-regex/index.js new file mode 100644 index 0000000..c268404 --- /dev/null +++ b/packages/字体精简工具/node_modules/unc-path-regex/index.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = function uncPathRegex() { + return /^[\\\/]{2,}[^\\\/]+[\\\/]+[^\\\/]+/; +}; diff --git a/packages/字体精简工具/node_modules/unc-path-regex/package.json b/packages/字体精简工具/node_modules/unc-path-regex/package.json new file mode 100644 index 0000000..5fbdeaa --- /dev/null +++ b/packages/字体精简工具/node_modules/unc-path-regex/package.json @@ -0,0 +1,84 @@ +{ + "_from": "unc-path-regex@^0.1.2", + "_id": "unc-path-regex@0.1.2", + "_inBundle": false, + "_integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "_location": "/unc-path-regex", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "unc-path-regex@^0.1.2", + "name": "unc-path-regex", + "escapedName": "unc-path-regex", + "rawSpec": "^0.1.2", + "saveSpec": null, + "fetchSpec": "^0.1.2" + }, + "_requiredBy": [ + "/is-unc-path" + ], + "_resolved": "https://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz", + "_shasum": "e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa", + "_spec": "unc-path-regex@^0.1.2", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\is-unc-path", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/regexhq/unc-path-regex/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Regular expression for testing if a file path is a windows UNC file path. Can also be used as a component of another regexp via the `.source` property.", + "devDependencies": { + "mocha": "*" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/regexhq/unc-path-regex", + "keywords": [ + "absolute", + "expression", + "file", + "filepath", + "match", + "matching", + "path", + "regex", + "regexp", + "regular", + "unc", + "win", + "windows" + ], + "license": "MIT", + "main": "index.js", + "name": "unc-path-regex", + "repository": { + "type": "git", + "url": "git+https://github.com/regexhq/unc-path-regex.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "related": { + "list": [ + "dotfile-regex", + "is-unc-path", + "unc-path-regex", + "dotdir-regex", + "path-regex", + "dirname-regex", + "is-glob" + ] + } + }, + "version": "0.1.2" +} diff --git a/packages/字体精简工具/node_modules/unique-stream/LICENSE b/packages/字体精简工具/node_modules/unique-stream/LICENSE new file mode 100644 index 0000000..cd2225a --- /dev/null +++ b/packages/字体精简工具/node_modules/unique-stream/LICENSE @@ -0,0 +1,20 @@ +Copyright 2014 Eugene Ware + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/unique-stream/README.md b/packages/字体精简工具/node_modules/unique-stream/README.md new file mode 100644 index 0000000..afd49a0 --- /dev/null +++ b/packages/字体精简工具/node_modules/unique-stream/README.md @@ -0,0 +1,134 @@ +# unique-stream + +node.js through stream that emits a unique stream of objects based on criteria + +[![Build Status](https://travis-ci.org/eugeneware/unique-stream.svg?branch=master)](https://travis-ci.org/eugeneware/unique-stream) +[![Coverage Status](https://coveralls.io/repos/eugeneware/unique-stream/badge.svg?branch=master&service=github)](https://coveralls.io/github/eugeneware/unique-stream?branch=master) + +## Installation + +Install via [npm](https://www.npmjs.com/): + +``` +$ npm install unique-stream +``` + +## Examples + +### Dedupe a ReadStream based on JSON.stringify: + +``` js +var unique = require('unique-stream') + , Stream = require('stream'); + +// return a stream of 3 identical objects +function makeStreamOfObjects() { + var s = new Stream; + s.readable = true; + var count = 3; + for (var i = 0; i < 3; i++) { + setImmediate(function () { + s.emit('data', { name: 'Bob', number: 123 }); + --count || end(); + }); + } + + function end() { + s.emit('end'); + } + + return s; +} + +// Will only print out one object as the rest are dupes. (Uses JSON.stringify) +makeStreamOfObjects() + .pipe(unique()) + .on('data', console.log); + +``` + +### Dedupe a ReadStream based on an object property: + +``` js +// Use name as the key field to dedupe on. Will only print one object +makeStreamOfObjects() + .pipe(unique('name')) + .on('data', console.log); +``` + +### Dedupe a ReadStream based on a custom function: + +``` js +// Use a custom function to dedupe on. Use the 'number' field. Will only print one object. +makeStreamOfObjects() + .pipe(function (data) { + return data.number; + }) + .on('data', console.log); +``` + +## Dedupe multiple streams + +The reason I wrote this was to dedupe multiple object streams: + +``` js +var aggregator = unique(); + +// Stream 1 +makeStreamOfObjects() + .pipe(aggregator); + +// Stream 2 +makeStreamOfObjects() + .pipe(aggregator); + +// Stream 3 +makeStreamOfObjects() + .pipe(aggregator); + +aggregator.on('data', console.log); +``` + +## Use a custom store to record keys that have been encountered + +By default a set is used to store keys encountered so far, in order to check new ones for +uniqueness. You can supply your own store instead, providing it supports the add(key) and +has(key) methods. This could allow you to use a persistent store so that already encountered +objects are not re-streamed when node is reloaded. + +``` js +var keyStore = { + store: {}, + + add: function(key) { + this.store[key] = true; + }, + + has: function(key) { + return this.store[key] !== undefined; + } +}; + +makeStreamOfObjects() + .pipe(unique('name', keyStore)) + .on('data', console.log); +``` + +## Contributing + +unique-stream is an **OPEN Open Source Project**. This means that: + +> Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. + +See the [CONTRIBUTING.md](https://github.com/eugeneware/unique-stream/blob/master/CONTRIBUTING.md) file for more details. + +### Contributors + +unique-stream is only possible due to the excellent work of the following contributors: + +
+ + + + +
Eugene WareGitHub/eugeneware
Craig AmbroseGitHub/craigambrose
Shinnosuke WatanabeGitHub/shinnn
Rouven WeßlingGitHub/realityking
diff --git a/packages/字体精简工具/node_modules/unique-stream/index.js b/packages/字体精简工具/node_modules/unique-stream/index.js new file mode 100644 index 0000000..13209b9 --- /dev/null +++ b/packages/字体精简工具/node_modules/unique-stream/index.js @@ -0,0 +1,48 @@ +'use strict'; + +var filter = require('through2-filter').obj; +var stringify = require("json-stable-stringify-without-jsonify"); + +var ES6Set; +if (typeof global.Set === 'function') { + ES6Set = global.Set; +} else { + ES6Set = function() { + this.keys = []; + this.has = function(val) { + return this.keys.indexOf(val) !== -1; + }, + this.add = function(val) { + this.keys.push(val); + } + } +} + +function prop(propName) { + return function (data) { + return data[propName]; + }; +} + +module.exports = unique; +function unique(propName, keyStore) { + keyStore = keyStore || new ES6Set(); + + var keyfn = stringify; + if (typeof propName === 'string') { + keyfn = prop(propName); + } else if (typeof propName === 'function') { + keyfn = propName; + } + + return filter(function (data) { + var key = keyfn(data); + + if (keyStore.has(key)) { + return false; + } + + keyStore.add(key); + return true; + }); +} diff --git a/packages/字体精简工具/node_modules/unique-stream/package.json b/packages/字体精简工具/node_modules/unique-stream/package.json new file mode 100644 index 0000000..0290de5 --- /dev/null +++ b/packages/字体精简工具/node_modules/unique-stream/package.json @@ -0,0 +1,67 @@ +{ + "_from": "unique-stream@^2.0.2", + "_id": "unique-stream@2.3.1", + "_inBundle": false, + "_integrity": "sha1-xl0RDppK35psWUiygFPZqNBMvqw=", + "_location": "/unique-stream", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "unique-stream@^2.0.2", + "name": "unique-stream", + "escapedName": "unique-stream", + "rawSpec": "^2.0.2", + "saveSpec": null, + "fetchSpec": "^2.0.2" + }, + "_requiredBy": [ + "/glob-stream" + ], + "_resolved": "https://registry.npm.taobao.org/unique-stream/download/unique-stream-2.3.1.tgz", + "_shasum": "c65d110e9a4adf9a6c5948b28053d9a8d04cbeac", + "_spec": "unique-stream@^2.0.2", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\glob-stream", + "author": { + "name": "Eugene Ware", + "email": "eugene@noblesamurai.com" + }, + "bugs": { + "url": "https://github.com/eugeneware/unique-stream/issues" + }, + "bundleDependencies": false, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "deprecated": false, + "description": "node.js through stream that emits a unique stream of objects based on criteria", + "devDependencies": { + "after": "~0.8.1", + "chai": "^4.2.0", + "istanbul": "^0.4.5", + "mocha": "^5.2.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/eugeneware/unique-stream#readme", + "keywords": [ + "unique", + "stream", + "unique-stream", + "streaming", + "streams" + ], + "license": "MIT", + "name": "unique-stream", + "repository": { + "type": "git", + "url": "git+https://github.com/eugeneware/unique-stream.git" + }, + "scripts": { + "coverage": "istanbul cover _mocha", + "test": "mocha" + }, + "version": "2.3.1" +} diff --git a/packages/字体精简工具/node_modules/uri-js/LICENSE b/packages/字体精简工具/node_modules/uri-js/LICENSE new file mode 100644 index 0000000..9338bde --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/LICENSE @@ -0,0 +1,11 @@ +Copyright 2011 Gary Court. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court. diff --git a/packages/字体精简工具/node_modules/uri-js/README.md b/packages/字体精简工具/node_modules/uri-js/README.md new file mode 100644 index 0000000..43e648b --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/README.md @@ -0,0 +1,203 @@ +# URI.js + +URI.js is an [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt) compliant, scheme extendable URI parsing/validating/resolving library for all JavaScript environments (browsers, Node.js, etc). +It is also compliant with the IRI ([RFC 3987](http://www.ietf.org/rfc/rfc3987.txt)), IDNA ([RFC 5890](http://www.ietf.org/rfc/rfc5890.txt)), IPv6 Address ([RFC 5952](http://www.ietf.org/rfc/rfc5952.txt)), IPv6 Zone Identifier ([RFC 6874](http://www.ietf.org/rfc/rfc6874.txt)) specifications. + +URI.js has an extensive test suite, and works in all (Node.js, web) environments. It weighs in at 6.4kb (gzipped, 17kb deflated). + +## API + +### Parsing + + URI.parse("uri://user:pass@example.com:123/one/two.three?q1=a1&q2=a2#body"); + //returns: + //{ + // scheme : "uri", + // userinfo : "user:pass", + // host : "example.com", + // port : 123, + // path : "/one/two.three", + // query : "q1=a1&q2=a2", + // fragment : "body" + //} + +### Serializing + + URI.serialize({scheme : "http", host : "example.com", fragment : "footer"}) === "http://example.com/#footer" + +### Resolving + + URI.resolve("uri://a/b/c/d?q", "../../g") === "uri://a/g" + +### Normalizing + + URI.normalize("HTTP://ABC.com:80/%7Esmith/home.html") === "http://abc.com/~smith/home.html" + +### Comparison + + URI.equal("example://a/b/c/%7Bfoo%7D", "eXAMPLE://a/./b/../b/%63/%7bfoo%7d") === true + +### IP Support + + //IPv4 normalization + URI.normalize("//192.068.001.000") === "//192.68.1.0" + + //IPv6 normalization + URI.normalize("//[2001:0:0DB8::0:0001]") === "//[2001:0:db8::1]" + + //IPv6 zone identifier support + URI.parse("//[2001:db8::7%25en1]"); + //returns: + //{ + // host : "2001:db8::7%en1" + //} + +### IRI Support + + //convert IRI to URI + URI.serialize(URI.parse("http://examplé.org/rosé")) === "http://xn--exampl-gva.org/ros%C3%A9" + //convert URI to IRI + URI.serialize(URI.parse("http://xn--exampl-gva.org/ros%C3%A9"), {iri:true}) === "http://examplé.org/rosé" + +### Options + +All of the above functions can accept an additional options argument that is an object that can contain one or more of the following properties: + +* `scheme` (string) + + Indicates the scheme that the URI should be treated as, overriding the URI's normal scheme parsing behavior. + +* `reference` (string) + + If set to `"suffix"`, it indicates that the URI is in the suffix format, and the validator will use the option's `scheme` property to determine the URI's scheme. + +* `tolerant` (boolean, false) + + If set to `true`, the parser will relax URI resolving rules. + +* `absolutePath` (boolean, false) + + If set to `true`, the serializer will not resolve a relative `path` component. + +* `iri` (boolean, false) + + If set to `true`, the serializer will unescape non-ASCII characters as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt). + +* `unicodeSupport` (boolean, false) + + If set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt). + +* `domainHost` (boolean, false) + + If set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](http://www.ietf.org/rfc/rfc5891.txt). + +## Scheme Extendable + +URI.js supports inserting custom [scheme](http://en.wikipedia.org/wiki/URI_scheme) dependent processing rules. Currently, URI.js has built in support for the following schemes: + +* http \[[RFC 2616](http://www.ietf.org/rfc/rfc2616.txt)\] +* https \[[RFC 2818](http://www.ietf.org/rfc/rfc2818.txt)\] +* ws \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\] +* wss \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\] +* mailto \[[RFC 6068](http://www.ietf.org/rfc/rfc6068.txt)\] +* urn \[[RFC 2141](http://www.ietf.org/rfc/rfc2141.txt)\] +* urn:uuid \[[RFC 4122](http://www.ietf.org/rfc/rfc4122.txt)\] + +### HTTP/HTTPS Support + + URI.equal("HTTP://ABC.COM:80", "http://abc.com/") === true + URI.equal("https://abc.com", "HTTPS://ABC.COM:443/") === true + +### WS/WSS Support + + URI.parse("wss://example.com/foo?bar=baz"); + //returns: + //{ + // scheme : "wss", + // host: "example.com", + // resourceName: "/foo?bar=baz", + // secure: true, + //} + + URI.equal("WS://ABC.COM:80/chat#one", "ws://abc.com/chat") === true + +### Mailto Support + + URI.parse("mailto:alpha@example.com,bravo@example.com?subject=SUBSCRIBE&body=Sign%20me%20up!"); + //returns: + //{ + // scheme : "mailto", + // to : ["alpha@example.com", "bravo@example.com"], + // subject : "SUBSCRIBE", + // body : "Sign me up!" + //} + + URI.serialize({ + scheme : "mailto", + to : ["alpha@example.com"], + subject : "REMOVE", + body : "Please remove me", + headers : { + cc : "charlie@example.com" + } + }) === "mailto:alpha@example.com?cc=charlie@example.com&subject=REMOVE&body=Please%20remove%20me" + +### URN Support + + URI.parse("urn:example:foo"); + //returns: + //{ + // scheme : "urn", + // nid : "example", + // nss : "foo", + //} + +#### URN UUID Support + + URI.parse("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6"); + //returns: + //{ + // scheme : "urn", + // nid : "uuid", + // uuid : "f81d4fae-7dec-11d0-a765-00a0c91e6bf6", + //} + +## Usage + +To load in a browser, use the following tag: + + + +To load in a CommonJS/Module environment, first install with npm/yarn by running on the command line: + + npm install uri-js + # OR + yarn add uri-js + +Then, in your code, load it using: + + const URI = require("uri-js"); + +If you are writing your code in ES6+ (ESNEXT) or TypeScript, you would load it using: + + import * as URI from "uri-js"; + +Or you can load just what you need using named exports: + + import { parse, serialize, resolve, resolveComponents, normalize, equal, removeDotSegments, pctEncChar, pctDecChars, escapeComponent, unescapeComponent } from "uri-js"; + +## Breaking changes + +### Breaking changes from 3.x + +URN parsing has been completely changed to better align with the specification. Scheme is now always `urn`, but has two new properties: `nid` which contains the Namspace Identifier, and `nss` which contains the Namespace Specific String. The `nss` property will be removed by higher order scheme handlers, such as the UUID URN scheme handler. + +The UUID of a URN can now be found in the `uuid` property. + +### Breaking changes from 2.x + +URI validation has been removed as it was slow, exposed a vulnerabilty, and was generally not useful. + +### Breaking changes from 1.x + +The `errors` array on parsed components is now an `error` string. diff --git a/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.d.ts new file mode 100644 index 0000000..da51e23 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.js b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.js new file mode 100644 index 0000000..0706116 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.js @@ -0,0 +1,1443 @@ +/** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.URI = global.URI || {}))); +}(this, (function (exports) { 'use strict'; + +function merge() { + for (var _len = arguments.length, sets = Array(_len), _key = 0; _key < _len; _key++) { + sets[_key] = arguments[_key]; + } + + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + var xl = sets.length - 1; + for (var x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } else { + return sets[0]; + } +} +function subexp(str) { + return "(?:" + str + ")"; +} +function typeOf(o) { + return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase(); +} +function toUpperCase(str) { + return str.toUpperCase(); +} +function toArray(obj) { + return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : []; +} +function assign(target, source) { + var obj = target; + if (source) { + for (var key in source) { + obj[key] = source[key]; + } + } + return obj; +} + +function buildExps(isIRI) { + var ALPHA$$ = "[A-Za-z]", + CR$ = "[\\x0D]", + DIGIT$$ = "[0-9]", + DQUOTE$$ = "[\\x22]", + HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), + //case-insensitive + LF$$ = "[\\x0A]", + SP$$ = "[\\x20]", + PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), + //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", + SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", + RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), + UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", + //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", + //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), + SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), + USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), + DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), + DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), + //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), + H16$ = subexp(HEXDIG$$ + "{1,4}"), + LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), + IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), + // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), + // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), + //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), + //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), + //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), + //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), + //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), + //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), + //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), + ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), + //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), + //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), + //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), + IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), + //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), + HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), + PORT$ = subexp(DIGIT$$ + "*"), + AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), + PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), + SEGMENT$ = subexp(PCHAR$ + "*"), + SEGMENT_NZ$ = subexp(PCHAR$ + "+"), + SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), + PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), + PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), + //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), + //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), + //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", + PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), + FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), + HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), + RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), + ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), + GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", + SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} +var URI_PROTOCOL = buildExps(false); + +var IRI_PROTOCOL = buildExps(true); + +var slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +}(); + + + + + + + + + + + + + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +/** Highest positive signed 32-bit float value */ + +var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +var base = 36; +var tMin = 1; +var tMax = 26; +var skew = 38; +var damp = 700; +var initialBias = 72; +var initialN = 128; // 0x80 +var delimiter = '-'; // '\x2D' + +/** Regular expressions */ +var regexPunycode = /^xn--/; +var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +var errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +var baseMinusTMin = base - tMin; +var floor = Math.floor; +var stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error$1(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + var result = []; + var length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + var output = []; + var counter = 0; + var length = string.length; + while (counter < length) { + var value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + var extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { + // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +var ucs2encode = function ucs2encode(array) { + return String.fromCodePoint.apply(String, toConsumableArray(array)); +}; + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +var basicToDigit = function basicToDigit(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +var digitToBasic = function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +var adapt = function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +var decode = function decode(input) { + // Don't use UCS-2. + var output = []; + var inputLength = input.length; + var i = 0; + var n = initialN; + var bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + var basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (var j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error$1('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{ + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + var oldi = i; + for (var w = 1, k = base;; /* no condition */k += base) { + + if (index >= inputLength) { + error$1('invalid-input'); + } + + var digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error$1('overflow'); + } + + i += digit * w; + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + + if (digit < t) { + break; + } + + var baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error$1('overflow'); + } + + w *= baseMinusT; + } + + var out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error$1('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + } + + return String.fromCodePoint.apply(String, output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +var encode = function encode(input) { + var output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + var inputLength = input.length; + + // Initialize the state. + var n = initialN; + var delta = 0; + var bias = initialBias; + + // Handle the basic code points. + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _currentValue2 = _step.value; + + if (_currentValue2 < 0x80) { + output.push(stringFromCharCode(_currentValue2)); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var basicLength = output.length; + var handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + var m = maxInt; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var currentValue = _step2.value; + + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + var handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error$1('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var _currentValue = _step3.value; + + if (_currentValue < n && ++delta > maxInt) { + error$1('overflow'); + } + if (_currentValue == n) { + // Represent delta as a generalized variable-length integer. + var q = delta; + for (var k = base;; /* no condition */k += base) { + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; + } + var qMinusT = q - t; + var baseMinusT = base - t; + output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3.return) { + _iterator3.return(); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + ++delta; + ++n; + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +var toUnicode = function toUnicode(input) { + return mapDomain(input, function (string) { + return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +var toASCII = function toASCII(input) { + return mapDomain(input, function (string) { + return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +var punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +var SCHEMES = {}; +function pctEncChar(chr) { + var c = chr.charCodeAt(0); + var e = void 0; + if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase(); + return e; +} +function pctDecChars(str) { + var newStr = ""; + var i = 0; + var il = str.length; + while (i < il) { + var c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } else if (c >= 194 && c < 224) { + if (il - i >= 6) { + var c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode((c & 31) << 6 | c2 & 63); + } else { + newStr += str.substr(i, 6); + } + i += 6; + } else if (c >= 224) { + if (il - i >= 9) { + var _c = parseInt(str.substr(i + 4, 2), 16); + var c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63); + } else { + newStr += str.substr(i, 9); + } + i += 9; + } else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; +} +function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(protocol.UNRESERVED) ? str : decStr; + } + if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; +} + +function _stripLeadingZeros(str) { + return str.replace(/^0*(.*)/, "$1") || "0"; +} +function _normalizeIPv4(host, protocol) { + var matches = host.match(protocol.IPV4ADDRESS) || []; + + var _matches = slicedToArray(matches, 2), + address = _matches[1]; + + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } else { + return host; + } +} +function _normalizeIPv6(host, protocol) { + var matches = host.match(protocol.IPV6ADDRESS) || []; + + var _matches2 = slicedToArray(matches, 3), + address = _matches2[1], + zone = _matches2[2]; + + if (address) { + var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(), + _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2), + last = _address$toLowerCase$2[0], + first = _address$toLowerCase$2[1]; + + var firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + var lastFields = last.split(":").map(_stripLeadingZeros); + var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + var fieldCount = isLastFieldIPv4Address ? 7 : 8; + var lastFieldsStart = lastFields.length - fieldCount; + var fields = Array(fieldCount); + for (var x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + var allZeroFields = fields.reduce(function (acc, field, index) { + if (!field || field === "0") { + var lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } else { + acc.push({ index: index, length: 1 }); + } + } + return acc; + }, []); + var longestZeroFields = allZeroFields.sort(function (a, b) { + return b.length - a.length; + })[0]; + var newHost = void 0; + if (longestZeroFields && longestZeroFields.length > 1) { + var newFirst = fields.slice(0, longestZeroFields.index); + var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } else { + newHost = fields.join(":"); + } + if (zone) { + newHost += "%" + zone; + } + return newHost; + } else { + return host; + } +} +var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined; +function parse(uriString) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var components = {}; + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + var matches = uriString.match(URI_PARSE); + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } else { + //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined; + components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined; + components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined; + //fix port number + if (isNaN(components.port)) { + components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined; + } + } + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } else if (components.scheme === undefined) { + components.reference = "relative"; + } else if (components.fragment === undefined) { + components.reference = "absolute"; + } else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } else { + components.error = components.error || "URI can not be parsed."; + } + return components; +} + +function _recomposeAuthority(components, options) { + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) { + return "[" + $1 + ($2 ? "%25" + $2 : "") + "]"; + })); + } + if (typeof components.port === "number" || typeof components.port === "string") { + uriTokens.push(":"); + uriTokens.push(String(components.port)); + } + return uriTokens.length ? uriTokens.join("") : undefined; +} + +var RDS1 = /^\.\.?\//; +var RDS2 = /^\/\.(\/|$)/; +var RDS3 = /^\/\.\.(\/|$)/; +var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; +function removeDotSegments(input) { + var output = []; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } else if (input === "." || input === "..") { + input = ""; + } else { + var im = input.match(RDS5); + if (im) { + var s = im[0]; + input = input.slice(s.length); + output.push(s); + } else { + throw new Error("Unexpected dot segment condition"); + } + } + } + return output.join(""); +} + +function serialize(components) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options); + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) {} + //TODO: normalize IPv6 address as per RFC 5952 + + //if host component is a domain name + else if (options.domainHost || schemeHandler && schemeHandler.domainHost) { + //convert IDN via punycode + try { + components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + var authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + var s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(""); //merge tokens into a string +} + +function resolveComponents(base, relative) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var skipNormalization = arguments[3]; + + var target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } else { + target.query = base.query; + } + } else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } else if (!base.path) { + target.path = relative.path; + } else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; +} + +function resolve(baseURI, relativeURI, options) { + var schemelessOptions = assign({ scheme: 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +} + +function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; +} + +function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; +} + +function escapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar); +} + +function unescapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars); +} + +var handler = { + scheme: "http", + domainHost: true, + parse: function parse(components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function serialize(components, options) { + var secure = String(components.scheme).toLowerCase() === "https"; + //normalize the default port + if (components.port === (secure ? 443 : 80) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; + +var handler$1 = { + scheme: "https", + domainHost: handler.domainHost, + parse: handler.parse, + serialize: handler.serialize +}; + +function isSecure(wsComponents) { + return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss"; +} +//RFC 6455 +var handler$2 = { + scheme: "ws", + domainHost: true, + parse: function parse(components, options) { + var wsComponents = components; + //indicate if the secure flag is set + wsComponents.secure = isSecure(wsComponents); + //construct resouce name + wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : ''); + wsComponents.path = undefined; + wsComponents.query = undefined; + return wsComponents; + }, + serialize: function serialize(wsComponents, options) { + //normalize the default port + if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") { + wsComponents.port = undefined; + } + //ensure scheme matches secure flag + if (typeof wsComponents.secure === 'boolean') { + wsComponents.scheme = wsComponents.secure ? 'wss' : 'ws'; + wsComponents.secure = undefined; + } + //reconstruct path from resource name + if (wsComponents.resourceName) { + var _wsComponents$resourc = wsComponents.resourceName.split('?'), + _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2), + path = _wsComponents$resourc2[0], + query = _wsComponents$resourc2[1]; + + wsComponents.path = path && path !== '/' ? path : undefined; + wsComponents.query = query; + wsComponents.resourceName = undefined; + } + //forbid fragment component + wsComponents.fragment = undefined; + return wsComponents; + } +}; + +var handler$3 = { + scheme: "wss", + domainHost: handler$2.domainHost, + parse: handler$2.parse, + serialize: handler$2.serialize +}; + +var O = {}; +var isIRI = true; +//RFC 3986 +var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +var UNRESERVED = new RegExp(UNRESERVED$$, "g"); +var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +var NOT_HFVALUE = NOT_HFNAME; +function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(UNRESERVED) ? str : decStr; +} +var handler$4 = { + scheme: "mailto", + parse: function parse$$1(components, options) { + var mailtoComponents = components; + var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : []; + mailtoComponents.path = undefined; + if (mailtoComponents.query) { + var unknownHeaders = false; + var headers = {}; + var hfields = mailtoComponents.query.split("&"); + for (var x = 0, xl = hfields.length; x < xl; ++x) { + var hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + var toAddrs = hfield[1].split(","); + for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) { + to.push(toAddrs[_x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) mailtoComponents.headers = headers; + } + mailtoComponents.query = undefined; + for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) { + var addr = to[_x2].split("@"); + addr[0] = unescapeComponent(addr[0]); + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + to[_x2] = addr.join("@"); + } + return mailtoComponents; + }, + serialize: function serialize$$1(mailtoComponents, options) { + var components = mailtoComponents; + var to = toArray(mailtoComponents.to); + if (to) { + for (var x = 0, xl = to.length; x < xl; ++x) { + var toAddr = String(to[x]); + var atIdx = toAddr.lastIndexOf("@"); + var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + var domain = toAddr.slice(atIdx + 1); + //convert IDN via punycode + try { + domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain); + } catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + var headers = mailtoComponents.headers = mailtoComponents.headers || {}; + if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) headers["body"] = mailtoComponents.body; + var fields = []; + for (var name in headers) { + if (headers[name] !== O[name]) { + fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } +}; + +var URN_PARSE = /^([^\:]+)\:(.*)/; +//RFC 2141 +var handler$5 = { + scheme: "urn", + parse: function parse$$1(components, options) { + var matches = components.path && components.path.match(URN_PARSE); + var urnComponents = components; + if (matches) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = matches[1].toLowerCase(); + var nss = matches[2]; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options); + } + } else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + return urnComponents; + }, + serialize: function serialize$$1(urnComponents, options) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = urnComponents.nid; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options); + } + var uriComponents = urnComponents; + var nss = urnComponents.nss; + uriComponents.path = (nid || options.nid) + ":" + nss; + return uriComponents; + } +}; + +var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +//RFC 4122 +var handler$6 = { + scheme: "urn:uuid", + parse: function parse(urnComponents, options) { + var uuidComponents = urnComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + return uuidComponents; + }, + serialize: function serialize(uuidComponents, options) { + var urnComponents = uuidComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + } +}; + +SCHEMES[handler.scheme] = handler; +SCHEMES[handler$1.scheme] = handler$1; +SCHEMES[handler$2.scheme] = handler$2; +SCHEMES[handler$3.scheme] = handler$3; +SCHEMES[handler$4.scheme] = handler$4; +SCHEMES[handler$5.scheme] = handler$5; +SCHEMES[handler$6.scheme] = handler$6; + +exports.SCHEMES = SCHEMES; +exports.pctEncChar = pctEncChar; +exports.pctDecChars = pctDecChars; +exports.parse = parse; +exports.removeDotSegments = removeDotSegments; +exports.serialize = serialize; +exports.resolveComponents = resolveComponents; +exports.resolve = resolve; +exports.normalize = normalize; +exports.equal = equal; +exports.escapeComponent = escapeComponent; +exports.unescapeComponent = unescapeComponent; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=uri.all.js.map diff --git a/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.js.map b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.js.map new file mode 100644 index 0000000..5b30c4e --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uri.all.js","sources":["../../src/index.ts","../../src/schemes/urn-uuid.ts","../../src/schemes/urn.ts","../../src/schemes/mailto.ts","../../src/schemes/wss.ts","../../src/schemes/ws.ts","../../src/schemes/https.ts","../../src/schemes/http.ts","../../src/uri.ts","../../node_modules/punycode/punycode.es6.js","../../src/regexps-iri.ts","../../src/regexps-uri.ts","../../src/util.ts"],"sourcesContent":["import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport ws from \"./schemes/ws\";\nSCHEMES[ws.scheme] = ws;\n\nimport wss from \"./schemes/wss\";\nSCHEMES[wss.scheme] = wss;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\"; //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)); //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\"; //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\"; //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler = {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport ws from \"./ws\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"wss\",\n\tdomainHost : ws.domainHost,\n\tparse : ws.parse,\n\tserialize : ws.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nexport interface WSComponents extends URIComponents {\n\tresourceName?: string;\n\tsecure?: boolean;\n}\n\nfunction isSecure(wsComponents:WSComponents):boolean {\n\treturn typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === \"wss\";\n}\n\n//RFC 6455\nconst handler:URISchemeHandler = {\n\tscheme : \"ws\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):WSComponents {\n\t\tconst wsComponents = components as WSComponents;\n\n\t\t//indicate if the secure flag is set\n\t\twsComponents.secure = isSecure(wsComponents);\n\n\t\t//construct resouce name\n\t\twsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');\n\t\twsComponents.path = undefined;\n\t\twsComponents.query = undefined;\n\n\t\treturn wsComponents;\n\t},\n\n\tserialize : function (wsComponents:WSComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === \"\") {\n\t\t\twsComponents.port = undefined;\n\t\t}\n\n\t\t//ensure scheme matches secure flag\n\t\tif (typeof wsComponents.secure === 'boolean') {\n\t\t\twsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');\n\t\t\twsComponents.secure = undefined;\n\t\t}\n\n\t\t//reconstruct path from resource name\n\t\tif (wsComponents.resourceName) {\n\t\t\tconst [path, query] = wsComponents.resourceName.split('?');\n\t\t\twsComponents.path = (path && path !== '/' ? path : undefined);\n\t\t\twsComponents.query = query;\n\t\t\twsComponents.resourceName = undefined;\n\t\t}\n\n\t\t//forbid fragment component\n\t\twsComponents.fragment = undefined;\n\n\t\treturn wsComponents;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\tconst secure = String(components.scheme).toLowerCase() === \"https\";\n\n\t\t//normalize the default port\n\t\tif (components.port === (secure ? 443 : 80) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author Gary Court\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = ((\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else { //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\" || typeof components.port === \"string\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(String(components.port));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\"); //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options); //normalize base components\n\t\trelative = parse(serialize(relative, options), options); //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see \n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"), //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)), //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\", //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\", //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$), //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp( subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), // 6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp( \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), // \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp( H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[ h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" + H16$ + \"\\\\:\" + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\" h16 \":\" ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\" + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\" ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\" + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\" h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\" ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"), //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$), //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$), //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"), //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"), //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\") //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","export function merge(...sets:Array):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}"],"names":["SCHEMES","uuid","scheme","urn","mailto","wss","ws","https","http","urnComponents","nss","uuidComponents","toLowerCase","options","error","tolerant","match","UUID","undefined","handler","uriComponents","path","nid","schemeHandler","serialize","urnScheme","parse","matches","components","URN_PARSE","query","fields","join","length","push","name","replace","PCT_ENCODED","decodeUnreserved","toUpperCase","NOT_HFNAME","pctEncChar","headers","NOT_HFVALUE","O","mailtoComponents","body","subject","to","x","localPart","domain","iri","e","punycode","toASCII","unescapeComponent","toUnicode","toAddr","slice","atIdx","NOT_LOCAL_PART","lastIndexOf","String","xl","toArray","addr","unicodeSupport","split","unknownHeaders","hfield","toAddrs","hfields","decStr","UNRESERVED","str","pctDecChars","RegExp","merge","UNRESERVED$$","SOME_DELIMS$$","ATEXT$$","VCHAR$$","PCT_ENCODED$","QTEXT$$","subexp","HEXDIG$$","isIRI","domainHost","wsComponents","fragment","resourceName","secure","port","isSecure","host","toString","URI_PROTOCOL","IRI_PROTOCOL","ESCAPE","escapeComponent","uriA","uriB","typeOf","equal","uri","normalize","resolveComponents","baseURI","schemelessOptions","relativeURI","assign","resolve","target","relative","base","userinfo","removeDotSegments","charAt","skipNormalization","uriTokens","s","authority","absolutePath","reference","_recomposeAuthority","protocol","IPV6ADDRESS","test","output","Error","input","im","RDS5","pop","RDS3","RDS2","RDS1","$1","$2","_normalizeIPv6","_normalizeIPv4","_","uriString","isNaN","indexOf","parseInt","NO_MATCH_IS_UNDEFINED","URI_PARSE","newHost","zone","newFirst","newLast","longestZeroFields","index","b","a","allZeroFields","sort","acc","lastLongest","field","reduce","fieldCount","isLastFieldIPv4Address","firstFields","lastFields","lastFieldsStart","Array","IPV4ADDRESS","last","map","_stripLeadingZeros","first","address","reverse","NOT_FRAGMENT","NOT_QUERY","NOT_PATH","NOT_PATH_NOSCHEME","NOT_HOST","NOT_USERINFO","NOT_SCHEME","_normalizeComponentEncoding","newStr","substr","i","fromCharCode","c","c2","c3","il","chr","charCodeAt","encode","decode","ucs2encode","ucs2decode","regexNonASCII","string","mapDomain","regexPunycode","n","delta","handledCPCount","adapt","handledCPCountPlusOne","basicLength","stringFromCharCode","digitToBasic","q","floor","qMinusT","baseMinusT","t","k","bias","tMin","tMax","currentValue","maxInt","m","inputLength","delimiter","initialBias","initialN","fromCodePoint","splice","out","oldi","w","digit","basicToDigit","basic","j","baseMinusTMin","skew","numPoints","firstTime","damp","flag","codePoint","array","value","extra","counter","result","encoded","labels","fn","regexSeparators","parts","RangeError","errors","type","Math","buildExps","IPV6ADDRESS$","ZONEID$","IPV4ADDRESS$","RESERVED$$","SUB_DELIMS$$","IPRIVATE$$","ALPHA$$","DIGIT$$","AUTHORITY_REF$","USERINFO$","HOST$","PORT$","SAMEDOC_REF$","FRAGMENT$","ABSOLUTE_REF$","SCHEME$","PATH_ABEMPTY$","PATH_ABSOLUTE$","PATH_ROOTLESS$","PATH_EMPTY$","QUERY$","RELATIVE_REF$","PATH_NOSCHEME$","GENERIC_REF$","ABSOLUTE_URI$","HIER_PART$","URI_REFERENCE$","URI$","RELATIVE$","RELATIVE_PART$","AUTHORITY$","PCHAR$","PATH$","SEGMENT_NZ$","SEGMENT_NZ_NC$","SEGMENT$","IP_LITERAL$","REG_NAME$","IPV6ADDRZ_RELAXED$","IPVFUTURE$","IPV6ADDRESS1$","IPV6ADDRESS2$","IPV6ADDRESS3$","IPV6ADDRESS4$","IPV6ADDRESS5$","IPV6ADDRESS6$","IPV6ADDRESS7$","IPV6ADDRESS8$","IPV6ADDRESS9$","H16$","LS32$","DEC_OCTET_RELAXED$","DEC_OCTET$","UCSCHAR$$","GEN_DELIMS$$","SP$$","DQUOTE$$","CR$","obj","key","source","setInterval","call","prototype","o","Object","shift","sets"],"mappings":";;;;;;;AYAA,SAAA8E,KAAA,GAAA;sCAAyBsP,IAAzB;YAAA;;;QACKA,KAAKnS,MAAL,GAAc,CAAlB,EAAqB;aACf,CAAL,IAAUmS,KAAK,CAAL,EAAQzQ,KAAR,CAAc,CAAd,EAAiB,CAAC,CAAlB,CAAV;YACMK,KAAKoQ,KAAKnS,MAAL,GAAc,CAAzB;aACK,IAAIgB,IAAI,CAAb,EAAgBA,IAAIe,EAApB,EAAwB,EAAEf,CAA1B,EAA6B;iBACvBA,CAAL,IAAUmR,KAAKnR,CAAL,EAAQU,KAAR,CAAc,CAAd,EAAiB,CAAC,CAAlB,CAAV;;aAEIK,EAAL,IAAWoQ,KAAKpQ,EAAL,EAASL,KAAT,CAAe,CAAf,CAAX;eACOyQ,KAAKpS,IAAL,CAAU,EAAV,CAAP;KAPD,MAQO;eACCoS,KAAK,CAAL,CAAP;;;AAIF,AAAA,SAAA/O,MAAA,CAAuBV,GAAvB,EAAA;WACQ,QAAQA,GAAR,GAAc,GAArB;;AAGD,AAAA,SAAA4B,MAAA,CAAuB0N,CAAvB,EAAA;WACQA,MAAM/S,SAAN,GAAkB,WAAlB,GAAiC+S,MAAM,IAAN,GAAa,MAAb,GAAsBC,OAAOF,SAAP,CAAiBhO,QAAjB,CAA0B+N,IAA1B,CAA+BE,CAA/B,EAAkC7P,KAAlC,CAAwC,GAAxC,EAA6CkE,GAA7C,GAAmDlE,KAAnD,CAAyD,GAAzD,EAA8D+P,KAA9D,GAAsEvT,WAAtE,EAA9D;;AAGD,AAAA,SAAA2B,WAAA,CAA4BoC,GAA5B,EAAA;WACQA,IAAIpC,WAAJ,EAAP;;AAGD,AAAA,SAAA0B,OAAA,CAAwB0P,GAAxB,EAAA;WACQA,QAAQzS,SAAR,IAAqByS,QAAQ,IAA7B,GAAqCA,eAAenJ,KAAf,GAAuBmJ,GAAvB,GAA8B,OAAOA,IAAI1R,MAAX,KAAsB,QAAtB,IAAkC0R,IAAIvP,KAAtC,IAA+CuP,IAAIG,WAAnD,IAAkEH,IAAII,IAAtE,GAA6E,CAACJ,GAAD,CAA7E,GAAqFnJ,MAAMwJ,SAAN,CAAgBrQ,KAAhB,CAAsBoQ,IAAtB,CAA2BJ,GAA3B,CAAxJ,GAA4L,EAAnM;;AAID,AAAA,SAAA5M,MAAA,CAAuBE,MAAvB,EAAuC4M,MAAvC,EAAA;QACOF,MAAM1M,MAAZ;QACI4M,MAAJ,EAAY;aACN,IAAMD,GAAX,IAAkBC,MAAlB,EAA0B;gBACrBD,GAAJ,IAAWC,OAAOD,GAAP,CAAX;;;WAGKD,GAAP;;;ADnCD,SAAA3D,SAAA,CAA0BzK,KAA1B,EAAA;QAEEgL,UAAU,UADX;QAECmD,MAAM,SAFP;QAGClD,UAAU,OAHX;QAICiD,WAAW,SAJZ;QAKCnO,WAAWR,MAAM0L,OAAN,EAAe,UAAf,CALZ;;WAMQ,SANR;QAOCgD,OAAO,SAPR;QAQCrO,eAAeE,OAAOA,OAAO,YAAYC,QAAZ,GAAuB,GAAvB,GAA6BA,QAA7B,GAAwCA,QAAxC,GAAmD,GAAnD,GAAyDA,QAAzD,GAAoEA,QAA3E,IAAuF,GAAvF,GAA6FD,OAAO,gBAAgBC,QAAhB,GAA2B,GAA3B,GAAiCA,QAAjC,GAA4CA,QAAnD,CAA7F,GAA4J,GAA5J,GAAkKD,OAAO,MAAMC,QAAN,GAAiBA,QAAxB,CAAzK,CARhB;;mBASgB,yBAThB;QAUC+K,eAAe,qCAVhB;QAWCD,aAAatL,MAAMyO,YAAN,EAAoBlD,YAApB,CAXd;QAYCiD,YAAY/N,QAAQ,6EAAR,GAAwF,IAZrG;;iBAacA,QAAQ,mBAAR,GAA8B,IAb5C;;mBAcgBT,MAAMyL,OAAN,EAAeC,OAAf,EAAwB,gBAAxB,EAA0C8C,SAA1C,CAdhB;QAeCtC,UAAU3L,OAAOkL,UAAUzL,MAAMyL,OAAN,EAAeC,OAAf,EAAwB,aAAxB,CAAV,GAAmD,GAA1D,CAfX;QAgBCE,YAAYrL,OAAOA,OAAOF,eAAe,GAAf,GAAqBL,MAAMC,YAAN,EAAoBsL,YAApB,EAAkC,OAAlC,CAA5B,IAA0E,GAAjF,CAhBb;QAiBCgD,aAAahO,OAAOA,OAAO,SAAP,IAAoB,GAApB,GAA0BA,OAAO,WAAWmL,OAAlB,CAA1B,GAAuD,GAAvD,GAA6DnL,OAAO,MAAMmL,OAAN,GAAgBA,OAAvB,CAA7D,GAA+F,GAA/F,GAAqGnL,OAAO,UAAUmL,OAAjB,CAArG,GAAiI,GAAjI,GAAuIA,OAA9I,CAjBd;QAkBC4C,qBAAqB/N,OAAOA,OAAO,SAAP,IAAoB,GAApB,GAA0BA,OAAO,WAAWmL,OAAlB,CAA1B,GAAuD,GAAvD,GAA6DnL,OAAO,MAAMmL,OAAN,GAAgBA,OAAvB,CAA7D,GAA+F,GAA/F,GAAqGnL,OAAO,YAAYmL,OAAnB,CAArG,GAAmI,OAAnI,GAA6IA,OAApJ,CAlBtB;;mBAmBgBnL,OAAO+N,qBAAqB,KAArB,GAA6BA,kBAA7B,GAAkD,KAAlD,GAA0DA,kBAA1D,GAA+E,KAA/E,GAAuFA,kBAA9F,CAnBhB;QAoBCF,OAAO7N,OAAOC,WAAW,OAAlB,CApBR;QAqBC6N,QAAQ9N,OAAOA,OAAO6N,OAAO,KAAP,GAAeA,IAAtB,IAA8B,GAA9B,GAAoC/C,YAA3C,CArBT;QAsBCsC,gBAAgBpN,OAAmEA,OAAO6N,OAAO,KAAd,IAAuB,KAAvB,GAA+BC,KAAlG,CAtBjB;;oBAuBiB9N,OAAwD,WAAWA,OAAO6N,OAAO,KAAd,CAAX,GAAkC,KAAlC,GAA0CC,KAAlG,CAvBjB;;oBAwBiB9N,OAAOA,OAAwC6N,IAAxC,IAAgD,SAAhD,GAA4D7N,OAAO6N,OAAO,KAAd,CAA5D,GAAmF,KAAnF,GAA2FC,KAAlG,CAxBjB;;oBAyBiB9N,OAAOA,OAAOA,OAAO6N,OAAO,KAAd,IAAuB,OAAvB,GAAiCA,IAAxC,IAAgD,SAAhD,GAA4D7N,OAAO6N,OAAO,KAAd,CAA5D,GAAmF,KAAnF,GAA2FC,KAAlG,CAzBjB;;oBA0BiB9N,OAAOA,OAAOA,OAAO6N,OAAO,KAAd,IAAuB,OAAvB,GAAiCA,IAAxC,IAAgD,SAAhD,GAA4D7N,OAAO6N,OAAO,KAAd,CAA5D,GAAmF,KAAnF,GAA2FC,KAAlG,CA1BjB;;oBA2BiB9N,OAAOA,OAAOA,OAAO6N,OAAO,KAAd,IAAuB,OAAvB,GAAiCA,IAAxC,IAAgD,SAAhD,GAAmEA,IAAnE,GAA0E,KAA1E,GAA2FC,KAAlG,CA3BjB;;oBA4BiB9N,OAAOA,OAAOA,OAAO6N,OAAO,KAAd,IAAuB,OAAvB,GAAiCA,IAAxC,IAAgD,SAAhD,GAA2FC,KAAlG,CA5BjB;;oBA6BiB9N,OAAOA,OAAOA,OAAO6N,OAAO,KAAd,IAAuB,OAAvB,GAAiCA,IAAxC,IAAgD,SAAhD,GAA2FA,IAAlG,CA7BjB;;oBA8BiB7N,OAAOA,OAAOA,OAAO6N,OAAO,KAAd,IAAuB,OAAvB,GAAiCA,IAAxC,IAAgD,SAAvD,CA9BjB;;mBA+BgB7N,OAAO,CAACoN,aAAD,EAAgBC,aAAhB,EAA+BC,aAA/B,EAA8CC,aAA9C,EAA6DC,aAA7D,EAA4EC,aAA5E,EAA2FC,aAA3F,EAA0GC,aAA1G,EAAyHC,aAAzH,EAAwIjR,IAAxI,CAA6I,GAA7I,CAAP,CA/BhB;QAgCCkO,UAAU7K,OAAOA,OAAON,eAAe,GAAf,GAAqBI,YAA5B,IAA4C,GAAnD,CAhCX;;iBAiCcE,OAAO4K,eAAe,OAAf,GAAyBC,OAAhC,CAjCd;;yBAkCsB7K,OAAO4K,eAAe5K,OAAO,iBAAiBC,QAAjB,GAA4B,MAAnC,CAAf,GAA4D4K,OAAnE,CAlCtB;;iBAmCc7K,OAAO,SAASC,QAAT,GAAoB,MAApB,GAA6BR,MAAMC,YAAN,EAAoBsL,YAApB,EAAkC,OAAlC,CAA7B,GAA0E,GAAjF,CAnCd;QAoCCgC,cAAchN,OAAO,QAAQA,OAAOkN,qBAAqB,GAArB,GAA2BtC,YAA3B,GAA0C,GAA1C,GAAgDuC,UAAvD,CAAR,GAA6E,KAApF,CApCf;;gBAqCanN,OAAOA,OAAOF,eAAe,GAAf,GAAqBL,MAAMC,YAAN,EAAoBsL,YAApB,CAA5B,IAAiE,GAAxE,CArCb;QAsCCM,QAAQtL,OAAOgN,cAAc,GAAd,GAAoBlC,YAApB,GAAmC,KAAnC,GAA2CmC,SAA3C,GAAuD,GAAvD,GAA6D,GAA7D,GAAmEA,SAA1E,CAtCT;QAuCC1B,QAAQvL,OAAOmL,UAAU,GAAjB,CAvCT;QAwCCuB,aAAa1M,OAAOA,OAAOqL,YAAY,GAAnB,IAA0B,GAA1B,GAAgCC,KAAhC,GAAwCtL,OAAO,QAAQuL,KAAf,CAAxC,GAAgE,GAAvE,CAxCd;QAyCCoB,SAAS3M,OAAOF,eAAe,GAAf,GAAqBL,MAAMC,YAAN,EAAoBsL,YAApB,EAAkC,UAAlC,CAA5B,CAzCV;QA0CC+B,WAAW/M,OAAO2M,SAAS,GAAhB,CA1CZ;QA2CCE,cAAc7M,OAAO2M,SAAS,GAAhB,CA3Cf;QA4CCG,iBAAiB9M,OAAOA,OAAOF,eAAe,GAAf,GAAqBL,MAAMC,YAAN,EAAoBsL,YAApB,EAAkC,OAAlC,CAA5B,IAA0E,GAAjF,CA5ClB;QA6CCY,gBAAgB5L,OAAOA,OAAO,QAAQ+M,QAAf,IAA2B,GAAlC,CA7CjB;QA8CClB,iBAAiB7L,OAAO,QAAQA,OAAO6M,cAAcjB,aAArB,CAAR,GAA8C,GAArD,CA9ClB;;qBA+CkB5L,OAAO8M,iBAAiBlB,aAAxB,CA/ClB;;qBAgDkB5L,OAAO6M,cAAcjB,aAArB,CAhDlB;;kBAiDe,QAAQe,MAAR,GAAiB,GAjDhC;QAkDCC,QAAQ5M,OAAO4L,gBAAgB,GAAhB,GAAsBC,cAAtB,GAAuC,GAAvC,GAA6CK,cAA7C,GAA8D,GAA9D,GAAoEJ,cAApE,GAAqF,GAArF,GAA2FC,WAAlG,CAlDT;QAmDCC,SAAShM,OAAOA,OAAO2M,SAAS,GAAT,GAAelN,MAAM,UAAN,EAAkBwL,UAAlB,CAAtB,IAAuD,GAA9D,CAnDV;QAoDCQ,YAAYzL,OAAOA,OAAO2M,SAAS,WAAhB,IAA+B,GAAtC,CApDb;QAqDCN,aAAarM,OAAOA,OAAO,WAAW0M,UAAX,GAAwBd,aAA/B,IAAgD,GAAhD,GAAsDC,cAAtD,GAAuE,GAAvE,GAA6EC,cAA7E,GAA8F,GAA9F,GAAoGC,WAA3G,CArDd;QAsDCQ,OAAOvM,OAAO2L,UAAU,KAAV,GAAkBU,UAAlB,GAA+BrM,OAAO,QAAQgM,MAAf,CAA/B,GAAwD,GAAxD,GAA8DhM,OAAO,QAAQyL,SAAf,CAA9D,GAA0F,GAAjG,CAtDR;QAuDCgB,iBAAiBzM,OAAOA,OAAO,WAAW0M,UAAX,GAAwBd,aAA/B,IAAgD,GAAhD,GAAsDC,cAAtD,GAAuE,GAAvE,GAA6EK,cAA7E,GAA8F,GAA9F,GAAoGH,WAA3G,CAvDlB;QAwDCS,YAAYxM,OAAOyM,iBAAiBzM,OAAO,QAAQgM,MAAf,CAAjB,GAA0C,GAA1C,GAAgDhM,OAAO,QAAQyL,SAAf,CAAhD,GAA4E,GAAnF,CAxDb;QAyDCa,iBAAiBtM,OAAOuM,OAAO,GAAP,GAAaC,SAApB,CAzDlB;QA0DCJ,gBAAgBpM,OAAO2L,UAAU,KAAV,GAAkBU,UAAlB,GAA+BrM,OAAO,QAAQgM,MAAf,CAA/B,GAAwD,GAA/D,CA1DjB;QA4DCG,eAAe,OAAOR,OAAP,GAAiB,MAAjB,GAA0B3L,OAAOA,OAAO,YAAYA,OAAO,MAAMqL,SAAN,GAAkB,IAAzB,CAAZ,GAA6C,IAA7C,GAAoDC,KAApD,GAA4D,GAA5D,GAAkEtL,OAAO,SAASuL,KAAT,GAAiB,GAAxB,CAAlE,GAAiG,IAAxG,IAAgH,IAAhH,GAAuHK,aAAvH,GAAuI,GAAvI,GAA6IC,cAA7I,GAA8J,GAA9J,GAAoKC,cAApK,GAAqL,GAArL,GAA2LC,WAA3L,GAAyM,GAAhN,CAA1B,GAAiP/L,OAAO,SAASgM,MAAT,GAAkB,GAAzB,CAAjP,GAAiR,GAAjR,GAAuRhM,OAAO,SAASyL,SAAT,GAAqB,GAA5B,CAAvR,GAA0T,IA5D1U;QA6DCQ,gBAAgB,WAAWjM,OAAOA,OAAO,YAAYA,OAAO,MAAMqL,SAAN,GAAkB,IAAzB,CAAZ,GAA6C,IAA7C,GAAoDC,KAApD,GAA4D,GAA5D,GAAkEtL,OAAO,SAASuL,KAAT,GAAiB,GAAxB,CAAlE,GAAiG,IAAxG,IAAgH,IAAhH,GAAuHK,aAAvH,GAAuI,GAAvI,GAA6IC,cAA7I,GAA8J,GAA9J,GAAoKK,cAApK,GAAqL,GAArL,GAA2LH,WAA3L,GAAyM,GAAhN,CAAX,GAAkO/L,OAAO,SAASgM,MAAT,GAAkB,GAAzB,CAAlO,GAAkQ,GAAlQ,GAAwQhM,OAAO,SAASyL,SAAT,GAAqB,GAA5B,CAAxQ,GAA2S,IA7D5T;QA8DCC,gBAAgB,OAAOC,OAAP,GAAiB,MAAjB,GAA0B3L,OAAOA,OAAO,YAAYA,OAAO,MAAMqL,SAAN,GAAkB,IAAzB,CAAZ,GAA6C,IAA7C,GAAoDC,KAApD,GAA4D,GAA5D,GAAkEtL,OAAO,SAASuL,KAAT,GAAiB,GAAxB,CAAlE,GAAiG,IAAxG,IAAgH,IAAhH,GAAuHK,aAAvH,GAAuI,GAAvI,GAA6IC,cAA7I,GAA8J,GAA9J,GAAoKC,cAApK,GAAqL,GAArL,GAA2LC,WAA3L,GAAyM,GAAhN,CAA1B,GAAiP/L,OAAO,SAASgM,MAAT,GAAkB,GAAzB,CAAjP,GAAiR,IA9DlS;QA+DCR,eAAe,MAAMxL,OAAO,SAASyL,SAAT,GAAqB,GAA5B,CAAN,GAAyC,IA/DzD;QAgECL,iBAAiB,MAAMpL,OAAO,MAAMqL,SAAN,GAAkB,IAAzB,CAAN,GAAuC,IAAvC,GAA8CC,KAA9C,GAAsD,GAAtD,GAA4DtL,OAAO,SAASuL,KAAT,GAAiB,GAAxB,CAA5D,GAA2F,IAhE7G;WAmEO;oBACO,IAAI/L,MAAJ,CAAWC,MAAM,KAAN,EAAayL,OAAb,EAAsBC,OAAtB,EAA+B,aAA/B,CAAX,EAA0D,GAA1D,CADP;sBAES,IAAI3L,MAAJ,CAAWC,MAAM,WAAN,EAAmBC,YAAnB,EAAiCsL,YAAjC,CAAX,EAA2D,GAA3D,CAFT;kBAGK,IAAIxL,MAAJ,CAAWC,MAAM,iBAAN,EAAyBC,YAAzB,EAAuCsL,YAAvC,CAAX,EAAiE,GAAjE,CAHL;kBAIK,IAAIxL,MAAJ,CAAWC,MAAM,iBAAN,EAAyBC,YAAzB,EAAuCsL,YAAvC,CAAX,EAAiE,GAAjE,CAJL;2BAKc,IAAIxL,MAAJ,CAAWC,MAAM,cAAN,EAAsBC,YAAtB,EAAoCsL,YAApC,CAAX,EAA8D,GAA9D,CALd;mBAMM,IAAIxL,MAAJ,CAAWC,MAAM,QAAN,EAAgBC,YAAhB,EAA8BsL,YAA9B,EAA4C,gBAA5C,EAA8DC,UAA9D,CAAX,EAAsF,GAAtF,CANN;sBAOS,IAAIzL,MAAJ,CAAWC,MAAM,QAAN,EAAgBC,YAAhB,EAA8BsL,YAA9B,EAA4C,gBAA5C,CAAX,EAA0E,GAA1E,CAPT;gBAQG,IAAIxL,MAAJ,CAAWC,MAAM,KAAN,EAAaC,YAAb,EAA2BsL,YAA3B,CAAX,EAAqD,GAArD,CARH;oBASO,IAAIxL,MAAJ,CAAWE,YAAX,EAAyB,GAAzB,CATP;qBAUQ,IAAIF,MAAJ,CAAWC,MAAM,QAAN,EAAgBC,YAAhB,EAA8BqL,UAA9B,CAAX,EAAsD,GAAtD,CAVR;qBAWQ,IAAIvL,MAAJ,CAAWM,YAAX,EAAyB,GAAzB,CAXR;qBAYQ,IAAIN,MAAJ,CAAW,OAAOsL,YAAP,GAAsB,IAAjC,CAZR;qBAaQ,IAAItL,MAAJ,CAAW,WAAWoL,YAAX,GAA0B,GAA1B,GAAgC5K,OAAOA,OAAO,iBAAiBC,QAAjB,GAA4B,MAAnC,IAA6C,GAA7C,GAAmD4K,OAAnD,GAA6D,GAApE,CAAhC,GAA2G,QAAtH,CAbR;KAAP;;AAiBD,mBAAeF,UAAU,KAAV,CAAf;;ADrFA,mBAAeA,UAAU,IAAV,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADDA;;AACA,IAAMpC,SAAS,UAAf;;;AAGA,IAAMzG,OAAO,EAAb;AACA,IAAMsG,OAAO,CAAb;AACA,IAAMC,OAAO,EAAb;AACA,IAAMkB,OAAO,EAAb;AACA,IAAMG,OAAO,GAAb;AACA,IAAMf,cAAc,EAApB;AACA,IAAMC,WAAW,GAAjB;AACA,IAAMF,YAAY,GAAlB;;;AAGA,IAAMtB,gBAAgB,OAAtB;AACA,IAAMH,gBAAgB,YAAtB;AACA,IAAMoD,kBAAkB,2BAAxB;;;AAGA,IAAMG,SAAS;aACF,iDADE;cAED,gDAFC;kBAGG;CAHlB;;;AAOA,IAAMlB,gBAAgBxH,OAAOsG,IAA7B;AACA,IAAMN,QAAQ4C,KAAK5C,KAAnB;AACA,IAAMH,qBAAqBjJ,OAAO4H,YAAlC;;;;;;;;;;AAUA,SAAS7K,OAAT,CAAegP,IAAf,EAAqB;OACd,IAAIF,UAAJ,CAAeC,OAAOC,IAAP,CAAf,CAAN;;;;;;;;;;;AAWD,SAASnF,GAAT,CAAauE,KAAb,EAAoBO,EAApB,EAAwB;KACjBH,SAAS,EAAf;KACIrN,SAASiN,MAAMjN,MAAnB;QACOA,QAAP,EAAiB;SACTA,MAAP,IAAiBwN,GAAGP,MAAMjN,MAAN,CAAH,CAAjB;;QAEMqN,MAAP;;;;;;;;;;;;;AAaD,SAAS9C,SAAT,CAAmBD,MAAnB,EAA2BkD,EAA3B,EAA+B;KACxBE,QAAQpD,OAAOnI,KAAP,CAAa,GAAb,CAAd;KACIkL,SAAS,EAAb;KACIK,MAAM1N,MAAN,GAAe,CAAnB,EAAsB;;;WAGZ0N,MAAM,CAAN,IAAW,GAApB;WACSA,MAAM,CAAN,CAAT;;;UAGQpD,OAAOnK,OAAP,CAAesN,eAAf,EAAgC,MAAhC,CAAT;KACMF,SAASjD,OAAOnI,KAAP,CAAa,GAAb,CAAf;KACMmL,UAAU5E,IAAI6E,MAAJ,EAAYC,EAAZ,EAAgBzN,IAAhB,CAAqB,GAArB,CAAhB;QACOsN,SAASC,OAAhB;;;;;;;;;;;;;;;;AAgBD,SAASlD,UAAT,CAAoBE,MAApB,EAA4B;KACrBtE,SAAS,EAAf;KACIoH,UAAU,CAAd;KACMpN,SAASsK,OAAOtK,MAAtB;QACOoN,UAAUpN,MAAjB,EAAyB;MAClBkN,QAAQ5C,OAAON,UAAP,CAAkBoD,SAAlB,CAAd;MACIF,SAAS,MAAT,IAAmBA,SAAS,MAA5B,IAAsCE,UAAUpN,MAApD,EAA4D;;OAErDmN,QAAQ7C,OAAON,UAAP,CAAkBoD,SAAlB,CAAd;OACI,CAACD,QAAQ,MAAT,KAAoB,MAAxB,EAAgC;;WACxBlN,IAAP,CAAY,CAAC,CAACiN,QAAQ,KAAT,KAAmB,EAApB,KAA2BC,QAAQ,KAAnC,IAA4C,OAAxD;IADD,MAEO;;;WAGClN,IAAP,CAAYiN,KAAZ;;;GARF,MAWO;UACCjN,IAAP,CAAYiN,KAAZ;;;QAGKlH,MAAP;;;;;;;;;;;AAWD,IAAMmE,aAAa,SAAbA,UAAa;QAASrI,OAAOmK,aAAP,iCAAwBgB,KAAxB,EAAT;CAAnB;;;;;;;;;;;AAWA,IAAMV,eAAe,SAAfA,YAAe,CAASS,SAAT,EAAoB;KACpCA,YAAY,IAAZ,GAAmB,IAAvB,EAA6B;SACrBA,YAAY,IAAnB;;KAEGA,YAAY,IAAZ,GAAmB,IAAvB,EAA6B;SACrBA,YAAY,IAAnB;;KAEGA,YAAY,IAAZ,GAAmB,IAAvB,EAA6B;SACrBA,YAAY,IAAnB;;QAEM9H,IAAP;CAVD;;;;;;;;;;;;;AAwBA,IAAM8F,eAAe,SAAfA,YAAe,CAASsB,KAAT,EAAgBS,IAAhB,EAAsB;;;QAGnCT,QAAQ,EAAR,GAAa,MAAMA,QAAQ,EAAd,CAAb,IAAkC,CAACS,QAAQ,CAAT,KAAe,CAAjD,CAAP;CAHD;;;;;;;AAWA,IAAMnC,QAAQ,SAARA,KAAQ,CAASF,KAAT,EAAgBkC,SAAhB,EAA2BC,SAA3B,EAAsC;KAC/CvB,IAAI,CAAR;SACQuB,YAAY3B,MAAMR,QAAQoC,IAAd,CAAZ,GAAkCpC,SAAS,CAAnD;UACSQ,MAAMR,QAAQkC,SAAd,CAAT;+BAC8BlC,QAAQgC,gBAAgBjB,IAAhB,IAAwB,CAA9D,EAAiEH,KAAKpG,IAAtE,EAA4E;UACnEgG,MAAMR,QAAQgC,aAAd,CAAR;;QAEMxB,MAAMI,IAAI,CAACoB,gBAAgB,CAAjB,IAAsBhC,KAAtB,IAA+BA,QAAQiC,IAAvC,CAAV,CAAP;CAPD;;;;;;;;;AAiBA,IAAMzC,SAAS,SAATA,MAAS,CAAShE,KAAT,EAAgB;;KAExBF,SAAS,EAAf;KACM6F,cAAc3F,MAAMlG,MAA1B;KACIyJ,IAAI,CAAR;KACIgB,IAAIuB,QAAR;KACIT,OAAOQ,WAAX;;;;;;KAMIS,QAAQtG,MAAMrE,WAAN,CAAkBiK,SAAlB,CAAZ;KACIU,QAAQ,CAAZ,EAAe;UACN,CAAR;;;MAGI,IAAIC,IAAI,CAAb,EAAgBA,IAAID,KAApB,EAA2B,EAAEC,CAA7B,EAAgC;;MAE3BvG,MAAM8D,UAAN,CAAiByC,CAAjB,KAAuB,IAA3B,EAAiC;WAC1B,WAAN;;SAEMxM,IAAP,CAAYiG,MAAM8D,UAAN,CAAiByC,CAAjB,CAAZ;;;;;;MAMI,IAAIhF,QAAQ+E,QAAQ,CAAR,GAAYA,QAAQ,CAApB,GAAwB,CAAzC,EAA4C/E,QAAQoE,WAApD,4BAA4F;;;;;;;MAOvFO,OAAO3C,CAAX;OACK,IAAI4C,IAAI,CAAR,EAAWf,IAAIpG,IAApB,qBAA8CoG,KAAKpG,IAAnD,EAAyD;;OAEpDuC,SAASoE,WAAb,EAA0B;YACnB,eAAN;;;OAGKS,QAAQC,aAAarG,MAAM8D,UAAN,CAAiBvC,OAAjB,CAAb,CAAd;;OAEI6E,SAASpH,IAAT,IAAiBoH,QAAQpB,MAAM,CAACS,SAASlC,CAAV,IAAe4C,CAArB,CAA7B,EAAsD;YAC/C,UAAN;;;QAGIC,QAAQD,CAAb;OACMhB,IAAIC,KAAKC,IAAL,GAAYC,IAAZ,GAAoBF,KAAKC,OAAOE,IAAZ,GAAmBA,IAAnB,GAA0BH,IAAIC,IAA5D;;OAEIe,QAAQjB,CAAZ,EAAe;;;;OAITD,aAAalG,OAAOmG,CAA1B;OACIgB,IAAInB,MAAMS,SAASP,UAAf,CAAR,EAAoC;YAC7B,UAAN;;;QAGIA,UAAL;;;MAIKe,MAAMnG,OAAOhG,MAAP,GAAgB,CAA5B;SACO4K,MAAMnB,IAAI2C,IAAV,EAAgBD,GAAhB,EAAqBC,QAAQ,CAA7B,CAAP;;;;MAIIlB,MAAMzB,IAAI0C,GAAV,IAAiBR,SAASlB,CAA9B,EAAiC;WAC1B,UAAN;;;OAGIS,MAAMzB,IAAI0C,GAAV,CAAL;OACKA,GAAL;;;SAGOD,MAAP,CAAczC,GAAd,EAAmB,CAAnB,EAAsBgB,CAAtB;;;QAIM3I,OAAOmK,aAAP,eAAwBjG,MAAxB,CAAP;CAjFD;;;;;;;;;AA2FA,IAAMiE,SAAS,SAATA,MAAS,CAAS/D,KAAT,EAAgB;KACxBF,SAAS,EAAf;;;SAGQoE,WAAWlE,KAAX,CAAR;;;KAGI2F,cAAc3F,MAAMlG,MAAxB;;;KAGIyK,IAAIuB,QAAR;KACItB,QAAQ,CAAZ;KACIa,OAAOQ,WAAX;;;;;;;;uBAG2B7F,KAA3B,8HAAkC;OAAvBwF,cAAuB;;OAC7BA,iBAAe,IAAnB,EAAyB;WACjBzL,IAAP,CAAY8K,mBAAmBW,cAAnB,CAAZ;;;;;;;;;;;;;;;;;;KAIEZ,cAAc9E,OAAOhG,MAAzB;KACI2K,iBAAiBG,WAArB;;;;;;KAMIA,WAAJ,EAAiB;SACT7K,IAAP,CAAY6L,SAAZ;;;;QAIMnB,iBAAiBkB,WAAxB,EAAqC;;;;MAIhCD,IAAID,MAAR;;;;;;yBAC2BzF,KAA3B,mIAAkC;QAAvBwF,YAAuB;;QAC7BA,gBAAgBjB,CAAhB,IAAqBiB,eAAeE,CAAxC,EAA2C;SACtCF,YAAJ;;;;;;;;;;;;;;;;;;;;;MAMIb,wBAAwBF,iBAAiB,CAA/C;MACIiB,IAAInB,CAAJ,GAAQS,MAAM,CAACS,SAASjB,KAAV,IAAmBG,qBAAzB,CAAZ,EAA6D;WACtD,UAAN;;;WAGQ,CAACe,IAAInB,CAAL,IAAUI,qBAAnB;MACIe,CAAJ;;;;;;;yBAE2B1F,KAA3B,mIAAkC;QAAvBwF,aAAuB;;QAC7BA,gBAAejB,CAAf,IAAoB,EAAEC,KAAF,GAAUiB,MAAlC,EAA0C;aACnC,UAAN;;QAEGD,iBAAgBjB,CAApB,EAAuB;;SAElBQ,IAAIP,KAAR;UACK,IAAIY,IAAIpG,IAAb,qBAAuCoG,KAAKpG,IAA5C,EAAkD;UAC3CmG,IAAIC,KAAKC,IAAL,GAAYC,IAAZ,GAAoBF,KAAKC,OAAOE,IAAZ,GAAmBA,IAAnB,GAA0BH,IAAIC,IAA5D;UACIN,IAAII,CAAR,EAAW;;;UAGLF,UAAUF,IAAII,CAApB;UACMD,aAAalG,OAAOmG,CAA1B;aACOpL,IAAP,CACC8K,mBAAmBC,aAAaK,IAAIF,UAAUC,UAA3B,EAAuC,CAAvC,CAAnB,CADD;UAGIF,MAAMC,UAAUC,UAAhB,CAAJ;;;YAGMnL,IAAP,CAAY8K,mBAAmBC,aAAaC,CAAb,EAAgB,CAAhB,CAAnB,CAAZ;YACOL,MAAMF,KAAN,EAAaG,qBAAb,EAAoCF,kBAAkBG,WAAtD,CAAP;aACQ,CAAR;OACEH,cAAF;;;;;;;;;;;;;;;;;;IAIAD,KAAF;IACED,CAAF;;QAGMzE,OAAOjG,IAAP,CAAY,EAAZ,CAAP;CArFD;;;;;;;;;;;;;AAmGA,IAAMyB,YAAY,SAAZA,SAAY,CAAS0E,KAAT,EAAgB;QAC1BqE,UAAUrE,KAAV,EAAiB,UAASoE,MAAT,EAAiB;SACjCE,cAAczE,IAAd,CAAmBuE,MAAnB,IACJJ,OAAOI,OAAO5I,KAAP,CAAa,CAAb,EAAgB/C,WAAhB,EAAP,CADI,GAEJ2L,MAFH;EADM,CAAP;CADD;;;;;;;;;;;;;AAmBA,IAAMhJ,UAAU,SAAVA,OAAU,CAAS4E,KAAT,EAAgB;QACxBqE,UAAUrE,KAAV,EAAiB,UAASoE,MAAT,EAAiB;SACjCD,cAActE,IAAd,CAAmBuE,MAAnB,IACJ,SAASL,OAAOK,MAAP,CADL,GAEJA,MAFH;EADM,CAAP;CADD;;;;;AAWA,IAAMjJ,WAAW;;;;;;YAML,OANK;;;;;;;;SAcR;YACG+I,UADH;YAEGD;EAhBK;WAkBND,MAlBM;WAmBND,MAnBM;YAoBL3I,OApBK;cAqBHE;CArBd,CAwBA;;ADvbA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,AACA,AACA,AACA,AAiDA,AAAO,IAAMzD,UAA6C,EAAnD;AAEP,AAAA,SAAAyC,UAAA,CAA2BuJ,GAA3B,EAAA;QACOJ,IAAII,IAAIC,UAAJ,CAAe,CAAf,CAAV;QACI5I,UAAJ;QAEIuI,IAAI,EAAR,EAAYvI,IAAI,OAAOuI,EAAE5F,QAAF,CAAW,EAAX,EAAezD,WAAf,EAAX,CAAZ,KACK,IAAIqJ,IAAI,GAAR,EAAavI,IAAI,MAAMuI,EAAE5F,QAAF,CAAW,EAAX,EAAezD,WAAf,EAAV,CAAb,KACA,IAAIqJ,IAAI,IAAR,EAAcvI,IAAI,MAAM,CAAEuI,KAAK,CAAN,GAAW,GAAZ,EAAiB5F,QAAjB,CAA0B,EAA1B,EAA8BzD,WAA9B,EAAN,GAAoD,GAApD,GAA0D,CAAEqJ,IAAI,EAAL,GAAW,GAAZ,EAAiB5F,QAAjB,CAA0B,EAA1B,EAA8BzD,WAA9B,EAA9D,CAAd,KACAc,IAAI,MAAM,CAAEuI,KAAK,EAAN,GAAY,GAAb,EAAkB5F,QAAlB,CAA2B,EAA3B,EAA+BzD,WAA/B,EAAN,GAAqD,GAArD,GAA2D,CAAGqJ,KAAK,CAAN,GAAW,EAAZ,GAAkB,GAAnB,EAAwB5F,QAAxB,CAAiC,EAAjC,EAAqCzD,WAArC,EAA3D,GAAgH,GAAhH,GAAsH,CAAEqJ,IAAI,EAAL,GAAW,GAAZ,EAAiB5F,QAAjB,CAA0B,EAA1B,EAA8BzD,WAA9B,EAA1H;WAEEc,CAAP;;AAGD,AAAA,SAAAuB,WAAA,CAA4BD,GAA5B,EAAA;QACK6G,SAAS,EAAb;QACIE,IAAI,CAAR;QACMK,KAAKpH,IAAI1C,MAAf;WAEOyJ,IAAIK,EAAX,EAAe;YACRH,IAAI1C,SAASvE,IAAI8G,MAAJ,CAAWC,IAAI,CAAf,EAAkB,CAAlB,CAAT,EAA+B,EAA/B,CAAV;YAEIE,IAAI,GAAR,EAAa;sBACF7H,OAAO4H,YAAP,CAAoBC,CAApB,CAAV;iBACK,CAAL;SAFD,MAIK,IAAIA,KAAK,GAAL,IAAYA,IAAI,GAApB,EAAyB;gBACxBG,KAAKL,CAAN,IAAY,CAAhB,EAAmB;oBACZG,KAAK3C,SAASvE,IAAI8G,MAAJ,CAAWC,IAAI,CAAf,EAAkB,CAAlB,CAAT,EAA+B,EAA/B,CAAX;0BACU3H,OAAO4H,YAAP,CAAqB,CAACC,IAAI,EAAL,KAAY,CAAb,GAAmBC,KAAK,EAA5C,CAAV;aAFD,MAGO;0BACIlH,IAAI8G,MAAJ,CAAWC,CAAX,EAAc,CAAd,CAAV;;iBAEI,CAAL;SAPI,MASA,IAAIE,KAAK,GAAT,EAAc;gBACbG,KAAKL,CAAN,IAAY,CAAhB,EAAmB;oBACZG,KAAK3C,SAASvE,IAAI8G,MAAJ,CAAWC,IAAI,CAAf,EAAkB,CAAlB,CAAT,EAA+B,EAA/B,CAAX;oBACMI,KAAK5C,SAASvE,IAAI8G,MAAJ,CAAWC,IAAI,CAAf,EAAkB,CAAlB,CAAT,EAA+B,EAA/B,CAAX;0BACU3H,OAAO4H,YAAP,CAAqB,CAACC,IAAI,EAAL,KAAY,EAAb,GAAoB,CAACC,KAAK,EAAN,KAAa,CAAjC,GAAuCC,KAAK,EAAhE,CAAV;aAHD,MAIO;0BACInH,IAAI8G,MAAJ,CAAWC,CAAX,EAAc,CAAd,CAAV;;iBAEI,CAAL;SARI,MAUA;sBACM/G,IAAI8G,MAAJ,CAAWC,CAAX,EAAc,CAAd,CAAV;iBACK,CAAL;;;WAIKF,MAAP;;AAGD,SAAAD,2BAAA,CAAqC3J,UAArC,EAA+DkG,QAA/D,EAAA;aACAxF,gBAAC,CAA0BqC,GAA1B,EAAD;YACQF,SAASG,YAAYD,GAAZ,CAAf;eACQ,CAACF,OAAOzD,KAAP,CAAa8G,SAASpD,UAAtB,CAAD,GAAqCC,GAArC,GAA2CF,MAAnD;;QAGG7C,WAAW1B,MAAf,EAAuB0B,WAAW1B,MAAX,GAAoB6D,OAAOnC,WAAW1B,MAAlB,EAA0BkC,OAA1B,CAAkC0F,SAASzF,WAA3C,EAAwDC,gBAAxD,EAA0E1B,WAA1E,GAAwFwB,OAAxF,CAAgG0F,SAASwD,UAAzG,EAAqH,EAArH,CAApB;QACnB1J,WAAWwF,QAAX,KAAwBlG,SAA5B,EAAuCU,WAAWwF,QAAX,GAAsBrD,OAAOnC,WAAWwF,QAAlB,EAA4BhF,OAA5B,CAAoC0F,SAASzF,WAA7C,EAA0DC,gBAA1D,EAA4EF,OAA5E,CAAoF0F,SAASuD,YAA7F,EAA2G5I,UAA3G,EAAuHL,OAAvH,CAA+H0F,SAASzF,WAAxI,EAAqJE,WAArJ,CAAtB;QACnCX,WAAWmE,IAAX,KAAoB7E,SAAxB,EAAmCU,WAAWmE,IAAX,GAAkBhC,OAAOnC,WAAWmE,IAAlB,EAAwB3D,OAAxB,CAAgC0F,SAASzF,WAAzC,EAAsDC,gBAAtD,EAAwE1B,WAAxE,GAAsFwB,OAAtF,CAA8F0F,SAASsD,QAAvG,EAAiH3I,UAAjH,EAA6HL,OAA7H,CAAqI0F,SAASzF,WAA9I,EAA2JE,WAA3J,CAAlB;QAC/BX,WAAWP,IAAX,KAAoBH,SAAxB,EAAmCU,WAAWP,IAAX,GAAkB0C,OAAOnC,WAAWP,IAAlB,EAAwBe,OAAxB,CAAgC0F,SAASzF,WAAzC,EAAsDC,gBAAtD,EAAwEF,OAAxE,CAAiFR,WAAW1B,MAAX,GAAoB4H,SAASoD,QAA7B,GAAwCpD,SAASqD,iBAAlI,EAAsJ1I,UAAtJ,EAAkKL,OAAlK,CAA0K0F,SAASzF,WAAnL,EAAgME,WAAhM,CAAlB;QAC/BX,WAAWE,KAAX,KAAqBZ,SAAzB,EAAoCU,WAAWE,KAAX,GAAmBiC,OAAOnC,WAAWE,KAAlB,EAAyBM,OAAzB,CAAiC0F,SAASzF,WAA1C,EAAuDC,gBAAvD,EAAyEF,OAAzE,CAAiF0F,SAASmD,SAA1F,EAAqGxI,UAArG,EAAiHL,OAAjH,CAAyH0F,SAASzF,WAAlI,EAA+IE,WAA/I,CAAnB;QAChCX,WAAW8D,QAAX,KAAwBxE,SAA5B,EAAuCU,WAAW8D,QAAX,GAAsB3B,OAAOnC,WAAW8D,QAAlB,EAA4BtD,OAA5B,CAAoC0F,SAASzF,WAA7C,EAA0DC,gBAA1D,EAA4EF,OAA5E,CAAoF0F,SAASkD,YAA7F,EAA2GvI,UAA3G,EAAuHL,OAAvH,CAA+H0F,SAASzF,WAAxI,EAAqJE,WAArJ,CAAtB;WAEhCX,UAAP;;AACA;AAED,SAAAgJ,kBAAA,CAA4BjG,GAA5B,EAAA;WACQA,IAAIvC,OAAJ,CAAY,SAAZ,EAAuB,IAAvB,KAAgC,GAAvC;;AAGD,SAAAyG,cAAA,CAAwB9C,IAAxB,EAAqC+B,QAArC,EAAA;QACOnG,UAAUoE,KAAK/E,KAAL,CAAW8G,SAAS2C,WAApB,KAAoC,EAApD;;iCACoB9I,OAFrB;QAEUmJ,OAFV;;QAIKA,OAAJ,EAAa;eACLA,QAAQ1G,KAAR,CAAc,GAAd,EAAmBuG,GAAnB,CAAuBC,kBAAvB,EAA2C5I,IAA3C,CAAgD,GAAhD,CAAP;KADD,MAEO;eACC+D,IAAP;;;AAIF,SAAA6C,cAAA,CAAwB7C,IAAxB,EAAqC+B,QAArC,EAAA;QACOnG,UAAUoE,KAAK/E,KAAL,CAAW8G,SAASC,WAApB,KAAoC,EAApD;;kCAC0BpG,OAF3B;QAEUmJ,OAFV;QAEmBxB,IAFnB;;QAIKwB,OAAJ,EAAa;oCACUA,QAAQlK,WAAR,GAAsBwD,KAAtB,CAA4B,IAA5B,EAAkC2G,OAAlC,EADV;;YACLL,IADK;YACCG,KADD;;YAENR,cAAcQ,QAAQA,MAAMzG,KAAN,CAAY,GAAZ,EAAiBuG,GAAjB,CAAqBC,kBAArB,CAAR,GAAmD,EAAvE;YACMN,aAAaI,KAAKtG,KAAL,CAAW,GAAX,EAAgBuG,GAAhB,CAAoBC,kBAApB,CAAnB;YACMR,yBAAyBtC,SAAS2C,WAAT,CAAqBzC,IAArB,CAA0BsC,WAAWA,WAAWrI,MAAX,GAAoB,CAA/B,CAA1B,CAA/B;YACMkI,aAAaC,yBAAyB,CAAzB,GAA6B,CAAhD;YACMG,kBAAkBD,WAAWrI,MAAX,GAAoBkI,UAA5C;YACMpI,SAASyI,MAAcL,UAAd,CAAf;aAEK,IAAIlH,IAAI,CAAb,EAAgBA,IAAIkH,UAApB,EAAgC,EAAElH,CAAlC,EAAqC;mBAC7BA,CAAP,IAAYoH,YAAYpH,CAAZ,KAAkBqH,WAAWC,kBAAkBtH,CAA7B,CAAlB,IAAqD,EAAjE;;YAGGmH,sBAAJ,EAA4B;mBACpBD,aAAa,CAApB,IAAyBtB,eAAe9G,OAAOoI,aAAa,CAApB,CAAf,EAAuCrC,QAAvC,CAAzB;;YAGK+B,gBAAgB9H,OAAOmI,MAAP,CAAmD,UAACH,GAAD,EAAME,KAAN,EAAaP,KAAb,EAA3E;gBACO,CAACO,KAAD,IAAUA,UAAU,GAAxB,EAA6B;oBACtBD,cAAcD,IAAIA,IAAI9H,MAAJ,GAAa,CAAjB,CAApB;oBACI+H,eAAeA,YAAYN,KAAZ,GAAoBM,YAAY/H,MAAhC,KAA2CyH,KAA9D,EAAqE;gCACxDzH,MAAZ;iBADD,MAEO;wBACFC,IAAJ,CAAS,EAAEwH,YAAF,EAASzH,QAAS,CAAlB,EAAT;;;mBAGK8H,GAAP;SATqB,EAUnB,EAVmB,CAAtB;YAYMN,oBAAoBI,cAAcC,IAAd,CAAmB,UAACF,CAAD,EAAID,CAAJ;mBAAUA,EAAE1H,MAAF,GAAW2H,EAAE3H,MAAvB;SAAnB,EAAkD,CAAlD,CAA1B;YAEIoH,gBAAJ;YACII,qBAAqBA,kBAAkBxH,MAAlB,GAA2B,CAApD,EAAuD;gBAChDsH,WAAWxH,OAAO4B,KAAP,CAAa,CAAb,EAAgB8F,kBAAkBC,KAAlC,CAAjB;gBACMF,UAAUzH,OAAO4B,KAAP,CAAa8F,kBAAkBC,KAAlB,GAA0BD,kBAAkBxH,MAAzD,CAAhB;sBACUsH,SAASvH,IAAT,CAAc,GAAd,IAAqB,IAArB,GAA4BwH,QAAQxH,IAAR,CAAa,GAAb,CAAtC;SAHD,MAIO;sBACID,OAAOC,IAAP,CAAY,GAAZ,CAAV;;YAGGsH,IAAJ,EAAU;uBACE,MAAMA,IAAjB;;eAGMD,OAAP;KA5CD,MA6CO;eACCtD,IAAP;;;AAIF,IAAMqD,YAAY,iIAAlB;AACA,IAAMD,wBAA4C,EAAD,CAAKnI,KAAL,CAAW,OAAX,EAAqB,CAArB,MAA4BE,SAA7E;AAEA,AAAA,SAAAQ,KAAA,CAAsBqH,SAAtB,EAAA;QAAwClI,OAAxC,uEAA6D,EAA7D;;QACOe,aAA2B,EAAjC;QACMkG,WAAYjH,QAAQuC,GAAR,KAAgB,KAAhB,GAAwB8C,YAAxB,GAAuCD,YAAzD;QAEIpF,QAAQ+G,SAAR,KAAsB,QAA1B,EAAoCmB,YAAY,CAAClI,QAAQX,MAAR,GAAiBW,QAAQX,MAAR,GAAiB,GAAlC,GAAwC,EAAzC,IAA+C,IAA/C,GAAsD6I,SAAlE;QAE9BpH,UAAUoH,UAAU/H,KAAV,CAAgBoI,SAAhB,CAAhB;QAEIzH,OAAJ,EAAa;YACRwH,qBAAJ,EAA2B;;uBAEfjJ,MAAX,GAAoByB,QAAQ,CAAR,CAApB;uBACWyF,QAAX,GAAsBzF,QAAQ,CAAR,CAAtB;uBACWoE,IAAX,GAAkBpE,QAAQ,CAAR,CAAlB;uBACWkE,IAAX,GAAkBqD,SAASvH,QAAQ,CAAR,CAAT,EAAqB,EAArB,CAAlB;uBACWN,IAAX,GAAkBM,QAAQ,CAAR,KAAc,EAAhC;uBACWG,KAAX,GAAmBH,QAAQ,CAAR,CAAnB;uBACW+D,QAAX,GAAsB/D,QAAQ,CAAR,CAAtB;;gBAGIqH,MAAMpH,WAAWiE,IAAjB,CAAJ,EAA4B;2BAChBA,IAAX,GAAkBlE,QAAQ,CAAR,CAAlB;;SAZF,MAcO;;;uBAEKzB,MAAX,GAAoByB,QAAQ,CAAR,KAAcT,SAAlC;uBACWkG,QAAX,GAAuB2B,UAAUE,OAAV,CAAkB,GAAlB,MAA2B,CAAC,CAA5B,GAAgCtH,QAAQ,CAAR,CAAhC,GAA6CT,SAApE;uBACW6E,IAAX,GAAmBgD,UAAUE,OAAV,CAAkB,IAAlB,MAA4B,CAAC,CAA7B,GAAiCtH,QAAQ,CAAR,CAAjC,GAA8CT,SAAjE;uBACW2E,IAAX,GAAkBqD,SAASvH,QAAQ,CAAR,CAAT,EAAqB,EAArB,CAAlB;uBACWN,IAAX,GAAkBM,QAAQ,CAAR,KAAc,EAAhC;uBACWG,KAAX,GAAoBiH,UAAUE,OAAV,CAAkB,GAAlB,MAA2B,CAAC,CAA5B,GAAgCtH,QAAQ,CAAR,CAAhC,GAA6CT,SAAjE;uBACWwE,QAAX,GAAuBqD,UAAUE,OAAV,CAAkB,GAAlB,MAA2B,CAAC,CAA5B,GAAgCtH,QAAQ,CAAR,CAAhC,GAA6CT,SAApE;;gBAGI8H,MAAMpH,WAAWiE,IAAjB,CAAJ,EAA4B;2BAChBA,IAAX,GAAmBkD,UAAU/H,KAAV,CAAgB,+BAAhB,IAAmDW,QAAQ,CAAR,CAAnD,GAAgET,SAAnF;;;YAIEU,WAAWmE,IAAf,EAAqB;;uBAETA,IAAX,GAAkB6C,eAAeC,eAAejH,WAAWmE,IAA1B,EAAgC+B,QAAhC,CAAf,EAA0DA,QAA1D,CAAlB;;;YAIGlG,WAAW1B,MAAX,KAAsBgB,SAAtB,IAAmCU,WAAWwF,QAAX,KAAwBlG,SAA3D,IAAwEU,WAAWmE,IAAX,KAAoB7E,SAA5F,IAAyGU,WAAWiE,IAAX,KAAoB3E,SAA7H,IAA0I,CAACU,WAAWP,IAAtJ,IAA8JO,WAAWE,KAAX,KAAqBZ,SAAvL,EAAkM;uBACtL0G,SAAX,GAAuB,eAAvB;SADD,MAEO,IAAIhG,WAAW1B,MAAX,KAAsBgB,SAA1B,EAAqC;uBAChC0G,SAAX,GAAuB,UAAvB;SADM,MAEA,IAAIhG,WAAW8D,QAAX,KAAwBxE,SAA5B,EAAuC;uBAClC0G,SAAX,GAAuB,UAAvB;SADM,MAEA;uBACKA,SAAX,GAAuB,KAAvB;;;YAIG/G,QAAQ+G,SAAR,IAAqB/G,QAAQ+G,SAAR,KAAsB,QAA3C,IAAuD/G,QAAQ+G,SAAR,KAAsBhG,WAAWgG,SAA5F,EAAuG;uBAC3F9G,KAAX,GAAmBc,WAAWd,KAAX,IAAoB,kBAAkBD,QAAQ+G,SAA1B,GAAsC,aAA7E;;;YAIKrG,gBAAgBvB,QAAQ,CAACa,QAAQX,MAAR,IAAkB0B,WAAW1B,MAA7B,IAAuC,EAAxC,EAA4CU,WAA5C,EAAR,CAAtB;;YAGI,CAACC,QAAQsD,cAAT,KAA4B,CAAC5C,aAAD,IAAkB,CAACA,cAAc4C,cAA7D,CAAJ,EAAkF;;gBAE7EvC,WAAWmE,IAAX,KAAoBlF,QAAQ2E,UAAR,IAAuBjE,iBAAiBA,cAAciE,UAA1E,CAAJ,EAA4F;;oBAEvF;+BACQO,IAAX,GAAkBzC,SAASC,OAAT,CAAiB3B,WAAWmE,IAAX,CAAgB3D,OAAhB,CAAwB0F,SAASzF,WAAjC,EAA8CuC,WAA9C,EAA2DhE,WAA3D,EAAjB,CAAlB;iBADD,CAEE,OAAOyC,CAAP,EAAU;+BACAvC,KAAX,GAAmBc,WAAWd,KAAX,IAAoB,oEAAoEuC,CAA3G;;;;wCAI0BzB,UAA5B,EAAwCqE,YAAxC;SAXD,MAYO;;wCAEsBrE,UAA5B,EAAwCkG,QAAxC;;;YAIGvG,iBAAiBA,cAAcG,KAAnC,EAA0C;0BAC3BA,KAAd,CAAoBE,UAApB,EAAgCf,OAAhC;;KA3EF,MA6EO;mBACKC,KAAX,GAAmBc,WAAWd,KAAX,IAAoB,wBAAvC;;WAGMc,UAAP;;AACA;AAED,SAAAiG,mBAAA,CAA6BjG,UAA7B,EAAuDf,OAAvD,EAAA;QACOiH,WAAYjH,QAAQuC,GAAR,KAAgB,KAAhB,GAAwB8C,YAAxB,GAAuCD,YAAzD;QACMuB,YAA0B,EAAhC;QAEI5F,WAAWwF,QAAX,KAAwBlG,SAA5B,EAAuC;kBAC5BgB,IAAV,CAAeN,WAAWwF,QAA1B;kBACUlF,IAAV,CAAe,GAAf;;QAGGN,WAAWmE,IAAX,KAAoB7E,SAAxB,EAAmC;;kBAExBgB,IAAV,CAAe0G,eAAeC,eAAe9E,OAAOnC,WAAWmE,IAAlB,CAAf,EAAwC+B,QAAxC,CAAf,EAAkEA,QAAlE,EAA4E1F,OAA5E,CAAoF0F,SAASC,WAA7F,EAA0G,UAACe,CAAD,EAAIJ,EAAJ,EAAQC,EAAR;mBAAe,MAAMD,EAAN,IAAYC,KAAK,QAAQA,EAAb,GAAkB,EAA9B,IAAoC,GAAnD;SAA1G,CAAf;;QAGG,OAAO/G,WAAWiE,IAAlB,KAA2B,QAA3B,IAAuC,OAAOjE,WAAWiE,IAAlB,KAA2B,QAAtE,EAAgF;kBACrE3D,IAAV,CAAe,GAAf;kBACUA,IAAV,CAAe6B,OAAOnC,WAAWiE,IAAlB,CAAf;;WAGM2B,UAAUvF,MAAV,GAAmBuF,UAAUxF,IAAV,CAAe,EAAf,CAAnB,GAAwCd,SAA/C;;AACA;AAED,IAAMuH,OAAO,UAAb;AACA,IAAMD,OAAO,aAAb;AACA,IAAMD,OAAO,eAAb;AACA,AACA,IAAMF,OAAO,wBAAb;AAEA,AAAA,SAAAhB,iBAAA,CAAkCc,KAAlC,EAAA;QACOF,SAAuB,EAA7B;WAEOE,MAAMlG,MAAb,EAAqB;YAChBkG,MAAMnH,KAAN,CAAYyH,IAAZ,CAAJ,EAAuB;oBACdN,MAAM/F,OAAN,CAAcqG,IAAd,EAAoB,EAApB,CAAR;SADD,MAEO,IAAIN,MAAMnH,KAAN,CAAYwH,IAAZ,CAAJ,EAAuB;oBACrBL,MAAM/F,OAAN,CAAcoG,IAAd,EAAoB,GAApB,CAAR;SADM,MAEA,IAAIL,MAAMnH,KAAN,CAAYuH,IAAZ,CAAJ,EAAuB;oBACrBJ,MAAM/F,OAAN,CAAcmG,IAAd,EAAoB,GAApB,CAAR;mBACOD,GAAP;SAFM,MAGA,IAAIH,UAAU,GAAV,IAAiBA,UAAU,IAA/B,EAAqC;oBACnC,EAAR;SADM,MAEA;gBACAC,KAAKD,MAAMnH,KAAN,CAAYqH,IAAZ,CAAX;gBACID,EAAJ,EAAQ;oBACDX,IAAIW,GAAG,CAAH,CAAV;wBACQD,MAAMxE,KAAN,CAAY8D,EAAExF,MAAd,CAAR;uBACOC,IAAP,CAAYuF,CAAZ;aAHD,MAIO;sBACA,IAAIS,KAAJ,CAAU,kCAAV,CAAN;;;;WAKID,OAAOjG,IAAP,CAAY,EAAZ,CAAP;;AACA;AAED,AAAA,SAAAR,SAAA,CAA0BI,UAA1B,EAAA;QAAoDf,OAApD,uEAAyE,EAAzE;;QACOiH,WAAYjH,QAAQuC,GAAR,GAAc8C,YAAd,GAA6BD,YAA/C;QACMuB,YAA0B,EAAhC;;QAGMjG,gBAAgBvB,QAAQ,CAACa,QAAQX,MAAR,IAAkB0B,WAAW1B,MAA7B,IAAuC,EAAxC,EAA4CU,WAA5C,EAAR,CAAtB;;QAGIW,iBAAiBA,cAAcC,SAAnC,EAA8CD,cAAcC,SAAd,CAAwBI,UAAxB,EAAoCf,OAApC;QAE1Ce,WAAWmE,IAAf,EAAqB;;YAEhB+B,SAASC,WAAT,CAAqBC,IAArB,CAA0BpG,WAAWmE,IAArC,CAAJ,EAAgD;;;;aAK3C,IAAIlF,QAAQ2E,UAAR,IAAuBjE,iBAAiBA,cAAciE,UAA1D,EAAuE;;oBAEvE;+BACQO,IAAX,GAAmB,CAAClF,QAAQuC,GAAT,GAAeE,SAASC,OAAT,CAAiB3B,WAAWmE,IAAX,CAAgB3D,OAAhB,CAAwB0F,SAASzF,WAAjC,EAA8CuC,WAA9C,EAA2DhE,WAA3D,EAAjB,CAAf,GAA4G0C,SAASG,SAAT,CAAmB7B,WAAWmE,IAA9B,CAA/H;iBADD,CAEE,OAAO1C,CAAP,EAAU;+BACAvC,KAAX,GAAmBc,WAAWd,KAAX,IAAoB,iDAAiD,CAACD,QAAQuC,GAAT,GAAe,OAAf,GAAyB,SAA1E,IAAuF,iBAAvF,GAA2GC,CAAlJ;;;;;gCAMyBzB,UAA5B,EAAwCkG,QAAxC;QAEIjH,QAAQ+G,SAAR,KAAsB,QAAtB,IAAkChG,WAAW1B,MAAjD,EAAyD;kBAC9CgC,IAAV,CAAeN,WAAW1B,MAA1B;kBACUgC,IAAV,CAAe,GAAf;;QAGKwF,YAAYG,oBAAoBjG,UAApB,EAAgCf,OAAhC,CAAlB;QACI6G,cAAcxG,SAAlB,EAA6B;YACxBL,QAAQ+G,SAAR,KAAsB,QAA1B,EAAoC;sBACzB1F,IAAV,CAAe,IAAf;;kBAGSA,IAAV,CAAewF,SAAf;YAEI9F,WAAWP,IAAX,IAAmBO,WAAWP,IAAX,CAAgBiG,MAAhB,CAAuB,CAAvB,MAA8B,GAArD,EAA0D;sBAC/CpF,IAAV,CAAe,GAAf;;;QAIEN,WAAWP,IAAX,KAAoBH,SAAxB,EAAmC;YAC9BuG,IAAI7F,WAAWP,IAAnB;YAEI,CAACR,QAAQ8G,YAAT,KAA0B,CAACpG,aAAD,IAAkB,CAACA,cAAcoG,YAA3D,CAAJ,EAA8E;gBACzEN,kBAAkBI,CAAlB,CAAJ;;YAGGC,cAAcxG,SAAlB,EAA6B;gBACxBuG,EAAErF,OAAF,CAAU,OAAV,EAAmB,MAAnB,CAAJ,CAD4B;;kBAInBF,IAAV,CAAeuF,CAAf;;QAGG7F,WAAWE,KAAX,KAAqBZ,SAAzB,EAAoC;kBACzBgB,IAAV,CAAe,GAAf;kBACUA,IAAV,CAAeN,WAAWE,KAA1B;;QAGGF,WAAW8D,QAAX,KAAwBxE,SAA5B,EAAuC;kBAC5BgB,IAAV,CAAe,GAAf;kBACUA,IAAV,CAAeN,WAAW8D,QAA1B;;WAGM8B,UAAUxF,IAAV,CAAe,EAAf,CAAP,CAxED;;AAyEC;AAED,AAAA,SAAA2E,iBAAA,CAAkCQ,IAAlC,EAAsDD,QAAtD,EAAA;QAA8ErG,OAA9E,uEAAmG,EAAnG;QAAuG0G,iBAAvG;;QACON,SAAuB,EAA7B;QAEI,CAACM,iBAAL,EAAwB;eAChB7F,MAAMF,UAAU2F,IAAV,EAAgBtG,OAAhB,CAAN,EAAgCA,OAAhC,CAAP,CADuB;mBAEZa,MAAMF,UAAU0F,QAAV,EAAoBrG,OAApB,CAAN,EAAoCA,OAApC,CAAX,CAFuB;;cAIdA,WAAW,EAArB;QAEI,CAACA,QAAQE,QAAT,IAAqBmG,SAAShH,MAAlC,EAA0C;eAClCA,MAAP,GAAgBgH,SAAShH,MAAzB;;eAEOkH,QAAP,GAAkBF,SAASE,QAA3B;eACOrB,IAAP,GAAcmB,SAASnB,IAAvB;eACOF,IAAP,GAAcqB,SAASrB,IAAvB;eACOxE,IAAP,GAAcgG,kBAAkBH,SAAS7F,IAAT,IAAiB,EAAnC,CAAd;eACOS,KAAP,GAAeoF,SAASpF,KAAxB;KAPD,MAQO;YACFoF,SAASE,QAAT,KAAsBlG,SAAtB,IAAmCgG,SAASnB,IAAT,KAAkB7E,SAArD,IAAkEgG,SAASrB,IAAT,KAAkB3E,SAAxF,EAAmG;;mBAE3FkG,QAAP,GAAkBF,SAASE,QAA3B;mBACOrB,IAAP,GAAcmB,SAASnB,IAAvB;mBACOF,IAAP,GAAcqB,SAASrB,IAAvB;mBACOxE,IAAP,GAAcgG,kBAAkBH,SAAS7F,IAAT,IAAiB,EAAnC,CAAd;mBACOS,KAAP,GAAeoF,SAASpF,KAAxB;SAND,MAOO;gBACF,CAACoF,SAAS7F,IAAd,EAAoB;uBACZA,IAAP,GAAc8F,KAAK9F,IAAnB;oBACI6F,SAASpF,KAAT,KAAmBZ,SAAvB,EAAkC;2BAC1BY,KAAP,GAAeoF,SAASpF,KAAxB;iBADD,MAEO;2BACCA,KAAP,GAAeqF,KAAKrF,KAApB;;aALF,MAOO;oBACFoF,SAAS7F,IAAT,CAAciG,MAAd,CAAqB,CAArB,MAA4B,GAAhC,EAAqC;2BAC7BjG,IAAP,GAAcgG,kBAAkBH,SAAS7F,IAA3B,CAAd;iBADD,MAEO;wBACF,CAAC8F,KAAKC,QAAL,KAAkBlG,SAAlB,IAA+BiG,KAAKpB,IAAL,KAAc7E,SAA7C,IAA0DiG,KAAKtB,IAAL,KAAc3E,SAAzE,KAAuF,CAACiG,KAAK9F,IAAjG,EAAuG;+BAC/FA,IAAP,GAAc,MAAM6F,SAAS7F,IAA7B;qBADD,MAEO,IAAI,CAAC8F,KAAK9F,IAAV,EAAgB;+BACfA,IAAP,GAAc6F,SAAS7F,IAAvB;qBADM,MAEA;+BACCA,IAAP,GAAc8F,KAAK9F,IAAL,CAAUsC,KAAV,CAAgB,CAAhB,EAAmBwD,KAAK9F,IAAL,CAAUyC,WAAV,CAAsB,GAAtB,IAA6B,CAAhD,IAAqDoD,SAAS7F,IAA5E;;2BAEMA,IAAP,GAAcgG,kBAAkBJ,OAAO5F,IAAzB,CAAd;;uBAEMS,KAAP,GAAeoF,SAASpF,KAAxB;;;mBAGMsF,QAAP,GAAkBD,KAAKC,QAAvB;mBACOrB,IAAP,GAAcoB,KAAKpB,IAAnB;mBACOF,IAAP,GAAcsB,KAAKtB,IAAnB;;eAEM3F,MAAP,GAAgBiH,KAAKjH,MAArB;;WAGMwF,QAAP,GAAkBwB,SAASxB,QAA3B;WAEOuB,MAAP;;AACA;AAED,AAAA,SAAAD,OAAA,CAAwBJ,OAAxB,EAAwCE,WAAxC,EAA4DjG,OAA5D,EAAA;QACOgG,oBAAoBE,OAAO,EAAE7G,QAAS,MAAX,EAAP,EAA4BW,OAA5B,CAA1B;WACOW,UAAUmF,kBAAkBjF,MAAMkF,OAAN,EAAeC,iBAAf,CAAlB,EAAqDnF,MAAMoF,WAAN,EAAmBD,iBAAnB,CAArD,EAA4FA,iBAA5F,EAA+G,IAA/G,CAAV,EAAgIA,iBAAhI,CAAP;;AACA;AAID,AAAA,SAAAH,SAAA,CAA0BD,GAA1B,EAAmC5F,OAAnC,EAAA;QACK,OAAO4F,GAAP,KAAe,QAAnB,EAA6B;cACtBjF,UAAUE,MAAM+E,GAAN,EAAW5F,OAAX,CAAV,EAA+BA,OAA/B,CAAN;KADD,MAEO,IAAI0F,OAAOE,GAAP,MAAgB,QAApB,EAA8B;cAC9B/E,MAAMF,UAAyBiF,GAAzB,EAA8B5F,OAA9B,CAAN,EAA8CA,OAA9C,CAAN;;WAGM4F,GAAP;;AACA;AAID,AAAA,SAAAD,KAAA,CAAsBH,IAAtB,EAAgCC,IAAhC,EAA0CzF,OAA1C,EAAA;QACK,OAAOwF,IAAP,KAAgB,QAApB,EAA8B;eACtB7E,UAAUE,MAAM2E,IAAN,EAAYxF,OAAZ,CAAV,EAAgCA,OAAhC,CAAP;KADD,MAEO,IAAI0F,OAAOF,IAAP,MAAiB,QAArB,EAA+B;eAC9B7E,UAAyB6E,IAAzB,EAA+BxF,OAA/B,CAAP;;QAGG,OAAOyF,IAAP,KAAgB,QAApB,EAA8B;eACtB9E,UAAUE,MAAM4E,IAAN,EAAYzF,OAAZ,CAAV,EAAgCA,OAAhC,CAAP;KADD,MAEO,IAAI0F,OAAOD,IAAP,MAAiB,QAArB,EAA+B;eAC9B9E,UAAyB8E,IAAzB,EAA+BzF,OAA/B,CAAP;;WAGMwF,SAASC,IAAhB;;AACA;AAED,AAAA,SAAAF,eAAA,CAAgCzB,GAAhC,EAA4C9D,OAA5C,EAAA;WACQ8D,OAAOA,IAAIqB,QAAJ,GAAe5D,OAAf,CAAwB,CAACvB,OAAD,IAAY,CAACA,QAAQuC,GAArB,GAA2B6C,aAAaE,MAAxC,GAAiDD,aAAaC,MAAtF,EAA+F1D,UAA/F,CAAd;;AACA;AAED,AAAA,SAAAe,iBAAA,CAAkCmB,GAAlC,EAA8C9D,OAA9C,EAAA;WACQ8D,OAAOA,IAAIqB,QAAJ,GAAe5D,OAAf,CAAwB,CAACvB,OAAD,IAAY,CAACA,QAAQuC,GAArB,GAA2B6C,aAAa5D,WAAxC,GAAsD6D,aAAa7D,WAA3F,EAAyGuC,WAAzG,CAAd;CACA;;ADziBD,IAAMzD,UAA2B;YACvB,MADuB;gBAGnB,IAHmB;WAKxB,eAAUS,UAAV,EAAoCf,OAApC,EAAT;;YAEM,CAACe,WAAWmE,IAAhB,EAAsB;uBACVjF,KAAX,GAAmBc,WAAWd,KAAX,IAAoB,6BAAvC;;eAGMc,UAAP;KAX+B;eAcpB,mBAAUA,UAAV,EAAoCf,OAApC,EAAb;YACQ+E,SAAS7B,OAAOnC,WAAW1B,MAAlB,EAA0BU,WAA1B,OAA4C,OAA3D;;YAGIgB,WAAWiE,IAAX,MAAqBD,SAAS,GAAT,GAAe,EAApC,KAA2ChE,WAAWiE,IAAX,KAAoB,EAAnE,EAAuE;uBAC3DA,IAAX,GAAkB3E,SAAlB;;;YAIG,CAACU,WAAWP,IAAhB,EAAsB;uBACVA,IAAX,GAAkB,GAAlB;;;;;eAOMO,UAAP;;CA/BF,CAmCA;;ADlCA,IAAMT,YAA2B;YACvB,OADuB;gBAEnBX,QAAKgF,UAFc;WAGxBhF,QAAKkB,KAHmB;eAIpBlB,QAAKgB;CAJlB,CAOA;;ADHA,SAAAsE,QAAA,CAAkBL,YAAlB,EAAA;WACQ,OAAOA,aAAaG,MAApB,KAA+B,SAA/B,GAA2CH,aAAaG,MAAxD,GAAiE7B,OAAO0B,aAAavF,MAApB,EAA4BU,WAA5B,OAA8C,KAAtH;;;AAID,IAAMO,YAA2B;YACvB,IADuB;gBAGnB,IAHmB;WAKxB,eAAUS,UAAV,EAAoCf,OAApC,EAAT;YACQ4E,eAAe7D,UAArB;;qBAGagE,MAAb,GAAsBE,SAASL,YAAT,CAAtB;;qBAGaE,YAAb,GAA4B,CAACF,aAAapE,IAAb,IAAqB,GAAtB,KAA8BoE,aAAa3D,KAAb,GAAqB,MAAM2D,aAAa3D,KAAxC,GAAgD,EAA9E,CAA5B;qBACaT,IAAb,GAAoBH,SAApB;qBACaY,KAAb,GAAqBZ,SAArB;eAEOuE,YAAP;KAhB+B;eAmBpB,mBAAUA,YAAV,EAAqC5E,OAArC,EAAb;;YAEM4E,aAAaI,IAAb,MAAuBC,SAASL,YAAT,IAAyB,GAAzB,GAA+B,EAAtD,KAA6DA,aAAaI,IAAb,KAAsB,EAAvF,EAA2F;yBAC7EA,IAAb,GAAoB3E,SAApB;;;YAIG,OAAOuE,aAAaG,MAApB,KAA+B,SAAnC,EAA8C;yBAChC1F,MAAb,GAAuBuF,aAAaG,MAAb,GAAsB,KAAtB,GAA8B,IAArD;yBACaA,MAAb,GAAsB1E,SAAtB;;;YAIGuE,aAAaE,YAAjB,EAA+B;wCACRF,aAAaE,YAAb,CAA0BvB,KAA1B,CAAgC,GAAhC,CADQ;;gBACvB/C,IADuB;gBACjBS,KADiB;;yBAEjBT,IAAb,GAAqBA,QAAQA,SAAS,GAAjB,GAAuBA,IAAvB,GAA8BH,SAAnD;yBACaY,KAAb,GAAqBA,KAArB;yBACa6D,YAAb,GAA4BzE,SAA5B;;;qBAIYwE,QAAb,GAAwBxE,SAAxB;eAEOuE,YAAP;;CA1CF,CA8CA;;ADvDA,IAAMtE,YAA2B;YACvB,KADuB;gBAEnBb,UAAGkF,UAFgB;WAGxBlF,UAAGoB,KAHqB;eAIpBpB,UAAGkB;CAJhB,CAOA;;ADMA,IAAMoB,IAAkB,EAAxB;AACA,IAAM2C,QAAQ,IAAd;;AAGA,IAAMR,eAAe,4BAA4BQ,QAAQ,2EAAR,GAAsF,EAAlH,IAAwH,GAA7I;AACA,IAAMD,WAAW,aAAjB;AACA,IAAMH,eAAeE,OAAOA,OAAO,YAAYC,QAAZ,GAAuB,GAAvB,GAA6BA,QAA7B,GAAwCA,QAAxC,GAAmD,GAAnD,GAAyDA,QAAzD,GAAoEA,QAA3E,IAAuF,GAAvF,GAA6FD,OAAO,gBAAgBC,QAAhB,GAA2B,GAA3B,GAAiCA,QAAjC,GAA4CA,QAAnD,CAA7F,GAA4J,GAA5J,GAAkKD,OAAO,MAAMC,QAAN,GAAiBA,QAAxB,CAAzK,CAArB;;;;;;;;;;;;AAaA,IAAML,UAAU,uDAAhB;AACA,IAAMG,UAAU,4DAAhB;AACA,IAAMF,UAAUJ,MAAMM,OAAN,EAAe,YAAf,CAAhB;AACA,AACA,AACA,AACA,AAEA,AAEA,IAAMJ,gBAAgB,qCAAtB;AACA,AACA,AACA,AACA,AACA,AACA,AACA,AACA,AACA,AACA,AACA,AAEA,IAAMN,aAAa,IAAIG,MAAJ,CAAWE,YAAX,EAAyB,GAAzB,CAAnB;AACA,IAAM1C,cAAc,IAAIwC,MAAJ,CAAWM,YAAX,EAAyB,GAAzB,CAApB;AACA,IAAMtB,iBAAiB,IAAIgB,MAAJ,CAAWC,MAAM,KAAN,EAAaG,OAAb,EAAsB,OAAtB,EAA+B,OAA/B,EAAwCC,OAAxC,CAAX,EAA6D,GAA7D,CAAvB;AACA,AACA,IAAM1C,aAAa,IAAIqC,MAAJ,CAAWC,MAAM,KAAN,EAAaC,YAAb,EAA2BC,aAA3B,CAAX,EAAsD,GAAtD,CAAnB;AACA,IAAMrC,cAAcH,UAApB;AACA,AACA,AAEA,SAAAF,gBAAA,CAA0BqC,GAA1B,EAAA;QACOF,SAASG,YAAYD,GAAZ,CAAf;WACQ,CAACF,OAAOzD,KAAP,CAAa0D,UAAb,CAAD,GAA4BC,GAA5B,GAAkCF,MAA1C;;AAGD,IAAMtD,YAA8C;YAC1C,QAD0C;WAG3C,kBAAUS,UAAV,EAAoCf,OAApC,EAAT;YACQgC,mBAAmBjB,UAAzB;YACMoB,KAAKH,iBAAiBG,EAAjB,GAAuBH,iBAAiBxB,IAAjB,GAAwBwB,iBAAiBxB,IAAjB,CAAsB+C,KAAtB,CAA4B,GAA5B,CAAxB,GAA2D,EAA7F;yBACiB/C,IAAjB,GAAwBH,SAAxB;YAEI2B,iBAAiBf,KAArB,EAA4B;gBACvBuC,iBAAiB,KAArB;gBACM3B,UAAwB,EAA9B;gBACM8B,UAAU3B,iBAAiBf,KAAjB,CAAuBsC,KAAvB,CAA6B,GAA7B,CAAhB;iBAEK,IAAInB,IAAI,CAAR,EAAWe,KAAKQ,QAAQvC,MAA7B,EAAqCgB,IAAIe,EAAzC,EAA6C,EAAEf,CAA/C,EAAkD;oBAC3CqB,SAASE,QAAQvB,CAAR,EAAWmB,KAAX,CAAiB,GAAjB,CAAf;wBAEQE,OAAO,CAAP,CAAR;yBACM,IAAL;4BACOC,UAAUD,OAAO,CAAP,EAAUF,KAAV,CAAgB,GAAhB,CAAhB;6BACK,IAAInB,KAAI,CAAR,EAAWe,MAAKO,QAAQtC,MAA7B,EAAqCgB,KAAIe,GAAzC,EAA6C,EAAEf,EAA/C,EAAkD;+BAC9Cf,IAAH,CAAQqC,QAAQtB,EAAR,CAAR;;;yBAGG,SAAL;yCACkBF,OAAjB,GAA2BS,kBAAkBc,OAAO,CAAP,CAAlB,EAA6BzD,OAA7B,CAA3B;;yBAEI,MAAL;yCACkBiC,IAAjB,GAAwBU,kBAAkBc,OAAO,CAAP,CAAlB,EAA6BzD,OAA7B,CAAxB;;;yCAGiB,IAAjB;gCACQ2C,kBAAkBc,OAAO,CAAP,CAAlB,EAA6BzD,OAA7B,CAAR,IAAiD2C,kBAAkBc,OAAO,CAAP,CAAlB,EAA6BzD,OAA7B,CAAjD;;;;gBAKCwD,cAAJ,EAAoBxB,iBAAiBH,OAAjB,GAA2BA,OAA3B;;yBAGJZ,KAAjB,GAAyBZ,SAAzB;aAEK,IAAI+B,MAAI,CAAR,EAAWe,OAAKhB,GAAGf,MAAxB,EAAgCgB,MAAIe,IAApC,EAAwC,EAAEf,GAA1C,EAA6C;gBACtCiB,OAAOlB,GAAGC,GAAH,EAAMmB,KAAN,CAAY,GAAZ,CAAb;iBAEK,CAAL,IAAUZ,kBAAkBU,KAAK,CAAL,CAAlB,CAAV;gBAEI,CAACrD,QAAQsD,cAAb,EAA6B;;oBAExB;yBACE,CAAL,IAAUb,SAASC,OAAT,CAAiBC,kBAAkBU,KAAK,CAAL,CAAlB,EAA2BrD,OAA3B,EAAoCD,WAApC,EAAjB,CAAV;iBADD,CAEE,OAAOyC,CAAP,EAAU;qCACMvC,KAAjB,GAAyB+B,iBAAiB/B,KAAjB,IAA0B,6EAA6EuC,CAAhI;;aALF,MAOO;qBACD,CAAL,IAAUG,kBAAkBU,KAAK,CAAL,CAAlB,EAA2BrD,OAA3B,EAAoCD,WAApC,EAAV;;eAGEqC,GAAH,IAAQiB,KAAKlC,IAAL,CAAU,GAAV,CAAR;;eAGMa,gBAAP;KA5DkD;eA+DvC,sBAAUA,gBAAV,EAA6ChC,OAA7C,EAAb;YACQe,aAAaiB,gBAAnB;YACMG,KAAKiB,QAAQpB,iBAAiBG,EAAzB,CAAX;YACIA,EAAJ,EAAQ;iBACF,IAAIC,IAAI,CAAR,EAAWe,KAAKhB,GAAGf,MAAxB,EAAgCgB,IAAIe,EAApC,EAAwC,EAAEf,CAA1C,EAA6C;oBACtCS,SAASK,OAAOf,GAAGC,CAAH,CAAP,CAAf;oBACMW,QAAQF,OAAOI,WAAP,CAAmB,GAAnB,CAAd;oBACMZ,YAAaQ,OAAOC,KAAP,CAAa,CAAb,EAAgBC,KAAhB,CAAD,CAAyBxB,OAAzB,CAAiCC,WAAjC,EAA8CC,gBAA9C,EAAgEF,OAAhE,CAAwEC,WAAxE,EAAqFE,WAArF,EAAkGH,OAAlG,CAA0GyB,cAA1G,EAA0HpB,UAA1H,CAAlB;oBACIU,SAASO,OAAOC,KAAP,CAAaC,QAAQ,CAArB,CAAb;;oBAGI;6BACO,CAAC/C,QAAQuC,GAAT,GAAeE,SAASC,OAAT,CAAiBC,kBAAkBL,MAAlB,EAA0BtC,OAA1B,EAAmCD,WAAnC,EAAjB,CAAf,GAAoF0C,SAASG,SAAT,CAAmBN,MAAnB,CAA9F;iBADD,CAEE,OAAOE,CAAP,EAAU;+BACAvC,KAAX,GAAmBc,WAAWd,KAAX,IAAoB,0DAA0D,CAACD,QAAQuC,GAAT,GAAe,OAAf,GAAyB,SAAnF,IAAgG,iBAAhG,GAAoHC,CAA3J;;mBAGEJ,CAAH,IAAQC,YAAY,GAAZ,GAAkBC,MAA1B;;uBAGU9B,IAAX,GAAkB2B,GAAGhB,IAAH,CAAQ,GAAR,CAAlB;;YAGKU,UAAUG,iBAAiBH,OAAjB,GAA2BG,iBAAiBH,OAAjB,IAA4B,EAAvE;YAEIG,iBAAiBE,OAArB,EAA8BL,QAAQ,SAAR,IAAqBG,iBAAiBE,OAAtC;YAC1BF,iBAAiBC,IAArB,EAA2BJ,QAAQ,MAAR,IAAkBG,iBAAiBC,IAAnC;YAErBf,SAAS,EAAf;aACK,IAAMI,IAAX,IAAmBO,OAAnB,EAA4B;gBACvBA,QAAQP,IAAR,MAAkBS,EAAET,IAAF,CAAtB,EAA+B;uBACvBD,IAAP,CACCC,KAAKC,OAAL,CAAaC,WAAb,EAA0BC,gBAA1B,EAA4CF,OAA5C,CAAoDC,WAApD,EAAiEE,WAAjE,EAA8EH,OAA9E,CAAsFI,UAAtF,EAAkGC,UAAlG,IACA,GADA,GAEAC,QAAQP,IAAR,EAAcC,OAAd,CAAsBC,WAAtB,EAAmCC,gBAAnC,EAAqDF,OAArD,CAA6DC,WAA7D,EAA0EE,WAA1E,EAAuFH,OAAvF,CAA+FO,WAA/F,EAA4GF,UAA5G,CAHD;;;YAOEV,OAAOE,MAAX,EAAmB;uBACPH,KAAX,GAAmBC,OAAOC,IAAP,CAAY,GAAZ,CAAnB;;eAGMJ,UAAP;;CAzGF,CA6GA;;ADnKA,IAAMC,YAAY,iBAAlB;AACA,AAEA;AACA,IAAMV,YAAqD;YACjD,KADiD;WAGlD,kBAAUS,UAAV,EAAoCf,OAApC,EAAT;YACQc,UAAUC,WAAWP,IAAX,IAAmBO,WAAWP,IAAX,CAAgBL,KAAhB,CAAsBa,SAAtB,CAAnC;YACIpB,gBAAgBmB,UAApB;YAEID,OAAJ,EAAa;gBACNzB,SAASW,QAAQX,MAAR,IAAkBO,cAAcP,MAAhC,IAA0C,KAAzD;gBACMoB,MAAMK,QAAQ,CAAR,EAAWf,WAAX,EAAZ;gBACMF,MAAMiB,QAAQ,CAAR,CAAZ;gBACMF,YAAevB,MAAf,UAAyBW,QAAQS,GAAR,IAAeA,GAAxC,CAAN;gBACMC,gBAAgBvB,QAAQyB,SAAR,CAAtB;0BAEcH,GAAd,GAAoBA,GAApB;0BACcZ,GAAd,GAAoBA,GAApB;0BACcW,IAAd,GAAqBH,SAArB;gBAEIK,aAAJ,EAAmB;gCACFA,cAAcG,KAAd,CAAoBjB,aAApB,EAAmCI,OAAnC,CAAhB;;SAZF,MAcO;0BACQC,KAAd,GAAsBL,cAAcK,KAAd,IAAuB,wBAA7C;;eAGML,aAAP;KAzByD;eA4B9C,sBAAUA,aAAV,EAAuCI,OAAvC,EAAb;YACQX,SAASW,QAAQX,MAAR,IAAkBO,cAAcP,MAAhC,IAA0C,KAAzD;YACMoB,MAAMb,cAAca,GAA1B;YACMG,YAAevB,MAAf,UAAyBW,QAAQS,GAAR,IAAeA,GAAxC,CAAN;YACMC,gBAAgBvB,QAAQyB,SAAR,CAAtB;YAEIF,aAAJ,EAAmB;4BACFA,cAAcC,SAAd,CAAwBf,aAAxB,EAAuCI,OAAvC,CAAhB;;YAGKO,gBAAgBX,aAAtB;YACMC,MAAMD,cAAcC,GAA1B;sBACcW,IAAd,IAAwBC,OAAOT,QAAQS,GAAvC,UAA8CZ,GAA9C;eAEOU,aAAP;;CA1CF,CA8CA;;AD5DA,IAAMH,OAAO,0DAAb;AACA,AAEA;AACA,IAAME,YAAsE;YAClE,UADkE;WAGnE,eAAUV,aAAV,EAAuCI,OAAvC,EAAT;YACQF,iBAAiBF,aAAvB;uBACeR,IAAf,GAAsBU,eAAeD,GAArC;uBACeA,GAAf,GAAqBQ,SAArB;YAEI,CAACL,QAAQE,QAAT,KAAsB,CAACJ,eAAeV,IAAhB,IAAwB,CAACU,eAAeV,IAAf,CAAoBe,KAApB,CAA0BC,IAA1B,CAA/C,CAAJ,EAAqF;2BACrEH,KAAf,GAAuBH,eAAeG,KAAf,IAAwB,oBAA/C;;eAGMH,cAAP;KAZ0E;eAe/D,mBAAUA,cAAV,EAAyCE,OAAzC,EAAb;YACQJ,gBAAgBE,cAAtB;;sBAEcD,GAAd,GAAoB,CAACC,eAAeV,IAAf,IAAuB,EAAxB,EAA4BW,WAA5B,EAApB;eACOH,aAAP;;CAnBF,CAuBA;;ADhCAT,QAAQQ,QAAKN,MAAb,IAAuBM,OAAvB;AAEA,AACAR,QAAQO,UAAML,MAAd,IAAwBK,SAAxB;AAEA,AACAP,QAAQM,UAAGJ,MAAX,IAAqBI,SAArB;AAEA,AACAN,QAAQK,UAAIH,MAAZ,IAAsBG,SAAtB;AAEA,AACAL,QAAQI,UAAOF,MAAf,IAAyBE,SAAzB;AAEA,AACAJ,QAAQG,UAAID,MAAZ,IAAsBC,SAAtB;AAEA,AACAH,QAAQC,UAAKC,MAAb,IAAuBD,SAAvB,CAEA;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.min.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.min.d.ts new file mode 100644 index 0000000..da51e23 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.min.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.min.js b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.min.js new file mode 100644 index 0000000..fcd8458 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/es5/uri.all.min.js @@ -0,0 +1,3 @@ +/** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */ +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r(e.URI=e.URI||{})}(this,function(e){"use strict";function r(){for(var e=arguments.length,r=Array(e),n=0;n1){r[0]=r[0].slice(0,-1);for(var t=r.length-1,o=1;o1&&(t=n[0]+"@",e=n[1]),e=e.replace(j,"."),t+f(e.split("."),r).join(".")}function p(e){for(var r=[],n=0,t=e.length;n=55296&&o<=56319&&n>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function d(e){for(var r="",n=0,t=e.length;n=194&&o<224){if(t-n>=6){var a=parseInt(e.substr(n+4,2),16);r+=String.fromCharCode((31&o)<<6|63&a)}else r+=e.substr(n,6);n+=6}else if(o>=224){if(t-n>=9){var i=parseInt(e.substr(n+4,2),16),u=parseInt(e.substr(n+7,2),16);r+=String.fromCharCode((15&o)<<12|(63&i)<<6|63&u)}else r+=e.substr(n,9);n+=9}else r+=e.substr(n,3),n+=3}return r}function l(e,r){function n(e){var n=d(e);return n.match(r.UNRESERVED)?n:e}return e.scheme&&(e.scheme=String(e.scheme).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_SCHEME,"")),e.userinfo!==undefined&&(e.userinfo=String(e.userinfo).replace(r.PCT_ENCODED,n).replace(r.NOT_USERINFO,h).replace(r.PCT_ENCODED,o)),e.host!==undefined&&(e.host=String(e.host).replace(r.PCT_ENCODED,n).toLowerCase().replace(r.NOT_HOST,h).replace(r.PCT_ENCODED,o)),e.path!==undefined&&(e.path=String(e.path).replace(r.PCT_ENCODED,n).replace(e.scheme?r.NOT_PATH:r.NOT_PATH_NOSCHEME,h).replace(r.PCT_ENCODED,o)),e.query!==undefined&&(e.query=String(e.query).replace(r.PCT_ENCODED,n).replace(r.NOT_QUERY,h).replace(r.PCT_ENCODED,o)),e.fragment!==undefined&&(e.fragment=String(e.fragment).replace(r.PCT_ENCODED,n).replace(r.NOT_FRAGMENT,h).replace(r.PCT_ENCODED,o)),e}function m(e){return e.replace(/^0*(.*)/,"$1")||"0"}function g(e,r){var n=e.match(r.IPV4ADDRESS)||[],t=T(n,2),o=t[1];return o?o.split(".").map(m).join("."):e}function v(e,r){var n=e.match(r.IPV6ADDRESS)||[],t=T(n,3),o=t[1],a=t[2];if(o){for(var i=o.toLowerCase().split("::").reverse(),u=T(i,2),s=u[0],f=u[1],c=f?f.split(":").map(m):[],p=s.split(":").map(m),h=r.IPV4ADDRESS.test(p[p.length-1]),d=h?7:8,l=p.length-d,v=Array(d),E=0;E1){var A=v.slice(0,y.index),D=v.slice(y.index+y.length);S=A.join(":")+"::"+D.join(":")}else S=v.join(":");return a&&(S+="%"+a),S}return e}function E(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n={},t=!1!==r.iri?R:F;"suffix"===r.reference&&(e=(r.scheme?r.scheme+":":"")+"//"+e);var o=e.match(K);if(o){W?(n.scheme=o[1],n.userinfo=o[3],n.host=o[4],n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=o[7],n.fragment=o[8],isNaN(n.port)&&(n.port=o[5])):(n.scheme=o[1]||undefined,n.userinfo=-1!==e.indexOf("@")?o[3]:undefined,n.host=-1!==e.indexOf("//")?o[4]:undefined,n.port=parseInt(o[5],10),n.path=o[6]||"",n.query=-1!==e.indexOf("?")?o[7]:undefined,n.fragment=-1!==e.indexOf("#")?o[8]:undefined,isNaN(n.port)&&(n.port=e.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?o[4]:undefined)),n.host&&(n.host=v(g(n.host,t),t)),n.scheme!==undefined||n.userinfo!==undefined||n.host!==undefined||n.port!==undefined||n.path||n.query!==undefined?n.scheme===undefined?n.reference="relative":n.fragment===undefined?n.reference="absolute":n.reference="uri":n.reference="same-document",r.reference&&"suffix"!==r.reference&&r.reference!==n.reference&&(n.error=n.error||"URI is not a "+r.reference+" reference.");var a=J[(r.scheme||n.scheme||"").toLowerCase()];if(r.unicodeSupport||a&&a.unicodeSupport)l(n,t);else{if(n.host&&(r.domainHost||a&&a.domainHost))try{n.host=B.toASCII(n.host.replace(t.PCT_ENCODED,d).toLowerCase())}catch(i){n.error=n.error||"Host's domain name can not be converted to ASCII via punycode: "+i}l(n,F)}a&&a.parse&&a.parse(n,r)}else n.error=n.error||"URI can not be parsed.";return n}function C(e,r){var n=!1!==r.iri?R:F,t=[];return e.userinfo!==undefined&&(t.push(e.userinfo),t.push("@")),e.host!==undefined&&t.push(v(g(String(e.host),n),n).replace(n.IPV6ADDRESS,function(e,r,n){return"["+r+(n?"%25"+n:"")+"]"})),"number"!=typeof e.port&&"string"!=typeof e.port||(t.push(":"),t.push(String(e.port))),t.length?t.join(""):undefined}function y(e){for(var r=[];e.length;)if(e.match(X))e=e.replace(X,"");else if(e.match(ee))e=e.replace(ee,"/");else if(e.match(re))e=e.replace(re,"/"),r.pop();else if("."===e||".."===e)e="";else{var n=e.match(ne);if(!n)throw new Error("Unexpected dot segment condition");var t=n[0];e=e.slice(t.length),r.push(t)}return r.join("")}function S(e){var r=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},n=r.iri?R:F,t=[],o=J[(r.scheme||e.scheme||"").toLowerCase()];if(o&&o.serialize&&o.serialize(e,r),e.host)if(n.IPV6ADDRESS.test(e.host));else if(r.domainHost||o&&o.domainHost)try{e.host=r.iri?B.toUnicode(e.host):B.toASCII(e.host.replace(n.PCT_ENCODED,d).toLowerCase())}catch(u){e.error=e.error||"Host's domain name can not be converted to "+(r.iri?"Unicode":"ASCII")+" via punycode: "+u}l(e,n),"suffix"!==r.reference&&e.scheme&&(t.push(e.scheme),t.push(":"));var a=C(e,r);if(a!==undefined&&("suffix"!==r.reference&&t.push("//"),t.push(a),e.path&&"/"!==e.path.charAt(0)&&t.push("/")),e.path!==undefined){var i=e.path;r.absolutePath||o&&o.absolutePath||(i=y(i)),a===undefined&&(i=i.replace(/^\/\//,"/%2F")),t.push(i)}return e.query!==undefined&&(t.push("?"),t.push(e.query)),e.fragment!==undefined&&(t.push("#"),t.push(e.fragment)),t.join("")}function A(e,r){var n=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{},t=arguments[3],o={};return t||(e=E(S(e,n),n),r=E(S(r,n),n)),n=n||{},!n.tolerant&&r.scheme?(o.scheme=r.scheme,o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.userinfo!==undefined||r.host!==undefined||r.port!==undefined?(o.userinfo=r.userinfo,o.host=r.host,o.port=r.port,o.path=y(r.path||""),o.query=r.query):(r.path?("/"===r.path.charAt(0)?o.path=y(r.path):(e.userinfo===undefined&&e.host===undefined&&e.port===undefined||e.path?e.path?o.path=e.path.slice(0,e.path.lastIndexOf("/")+1)+r.path:o.path=r.path:o.path="/"+r.path,o.path=y(o.path)),o.query=r.query):(o.path=e.path,r.query!==undefined?o.query=r.query:o.query=e.query),o.userinfo=e.userinfo,o.host=e.host,o.port=e.port),o.scheme=e.scheme),o.fragment=r.fragment,o}function D(e,r,n){var t=i({scheme:"null"},n);return S(A(E(e,t),E(r,t),t,!0),t)}function w(e,r){return"string"==typeof e?e=S(E(e,r),r):"object"===t(e)&&(e=E(S(e,r),r)),e}function b(e,r,n){return"string"==typeof e?e=S(E(e,n),n):"object"===t(e)&&(e=S(e,n)),"string"==typeof r?r=S(E(r,n),n):"object"===t(r)&&(r=S(r,n)),e===r}function x(e,r){return e&&e.toString().replace(r&&r.iri?R.ESCAPE:F.ESCAPE,h)}function O(e,r){return e&&e.toString().replace(r&&r.iri?R.PCT_ENCODED:F.PCT_ENCODED,d)}function N(e){return"boolean"==typeof e.secure?e.secure:"wss"===String(e.scheme).toLowerCase()}function I(e){var r=d(e);return r.match(he)?r:e}var F=u(!1),R=u(!0),T=function(){function e(e,r){var n=[],t=!0,o=!1,a=undefined;try{for(var i,u=e[Symbol.iterator]();!(t=(i=u.next()).done)&&(n.push(i.value),!r||n.length!==r);t=!0);}catch(s){o=!0,a=s}finally{try{!t&&u["return"]&&u["return"]()}finally{if(o)throw a}}return n}return function(r,n){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return e(r,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_=function(e){if(Array.isArray(e)){for(var r=0,n=Array(e.length);r= 0x80 (not a basic code point)","invalid-input":"Invalid input"},z=Math.floor,L=String.fromCharCode,$=function(e){return String.fromCodePoint.apply(String,_(e))},M=function(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:36},V=function(e,r){return e+22+75*(e<26)-((0!=r)<<5)},k=function(e,r,n){var t=0;for(e=n?z(e/700):e>>1,e+=z(e/r);e>455;t+=36)e=z(e/35);return z(t+36*e/(e+38))},Z=function(e){var r=[],n=e.length,t=0,o=128,a=72,i=e.lastIndexOf("-");i<0&&(i=0);for(var u=0;u=128&&s("not-basic"),r.push(e.charCodeAt(u));for(var f=i>0?i+1:0;f=n&&s("invalid-input");var d=M(e.charCodeAt(f++));(d>=36||d>z((P-t)/p))&&s("overflow"),t+=d*p;var l=h<=a?1:h>=a+26?26:h-a;if(dz(P/m)&&s("overflow"),p*=m}var g=r.length+1;a=k(t-c,g,0==c),z(t/g)>P-o&&s("overflow"),o+=z(t/g),t%=g,r.splice(t++,0,o)}return String.fromCodePoint.apply(String,r)},G=function(e){var r=[];e=p(e);var n=e.length,t=128,o=0,a=72,i=!0,u=!1,f=undefined;try{for(var c,h=e[Symbol.iterator]();!(i=(c=h.next()).done);i=!0){var d=c.value;d<128&&r.push(L(d))}}catch(U){u=!0,f=U}finally{try{!i&&h["return"]&&h["return"]()}finally{if(u)throw f}}var l=r.length,m=l;for(l&&r.push("-");m=t&&Az((P-o)/D)&&s("overflow"),o+=(g-t)*D,t=g;var w=!0,b=!1,x=undefined;try{for(var O,N=e[Symbol.iterator]();!(w=(O=N.next()).done);w=!0){var I=O.value;if(IP&&s("overflow"),I==t){for(var F=o,R=36;;R+=36){var T=R<=a?1:R>=a+26?26:R-a;if(FA-Z\\x5E-\\x7E]",'[\\"\\\\]'),he=new RegExp(se,"g"),de=new RegExp(ce,"g"),le=new RegExp(r("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',pe),"g"),me=new RegExp(r("[^]",se,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),ge=me,ve={scheme:"mailto",parse:function(e,r){var n=e,t=n.to=n.path?n.path.split(","):[];if(n.path=undefined,n.query){for(var o=!1,a={},i=n.query.split("&"),u=0,s=i.length;u):string {\n\tif (sets.length > 1) {\n\t\tsets[0] = sets[0].slice(0, -1);\n\t\tconst xl = sets.length - 1;\n\t\tfor (let x = 1; x < xl; ++x) {\n\t\t\tsets[x] = sets[x].slice(1, -1);\n\t\t}\n\t\tsets[xl] = sets[xl].slice(1);\n\t\treturn sets.join('');\n\t} else {\n\t\treturn sets[0];\n\t}\n}\n\nexport function subexp(str:string):string {\n\treturn \"(?:\" + str + \")\";\n}\n\nexport function typeOf(o:any):string {\n\treturn o === undefined ? \"undefined\" : (o === null ? \"null\" : Object.prototype.toString.call(o).split(\" \").pop().split(\"]\").shift().toLowerCase());\n}\n\nexport function toUpperCase(str:string):string {\n\treturn str.toUpperCase();\n}\n\nexport function toArray(obj:any):Array {\n\treturn obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== \"number\" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : [];\n}\n\n\nexport function assign(target: object, source: any): any {\n\tconst obj = target as any;\n\tif (source) {\n\t\tfor (const key in source) {\n\t\t\tobj[key] = source[key];\n\t\t}\n\t}\n\treturn obj;\n}","import { URIRegExps } from \"./uri\";\nimport { merge, subexp } from \"./util\";\n\nexport function buildExps(isIRI:boolean):URIRegExps {\n\tconst\n\t\tALPHA$$ = \"[A-Za-z]\",\n\t\tCR$ = \"[\\\\x0D]\",\n\t\tDIGIT$$ = \"[0-9]\",\n\t\tDQUOTE$$ = \"[\\\\x22]\",\n\t\tHEXDIG$$ = merge(DIGIT$$, \"[A-Fa-f]\"), //case-insensitive\n\t\tLF$$ = \"[\\\\x0A]\",\n\t\tSP$$ = \"[\\\\x20]\",\n\t\tPCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)), //expanded\n\t\tGEN_DELIMS$$ = \"[\\\\:\\\\/\\\\?\\\\#\\\\[\\\\]\\\\@]\",\n\t\tSUB_DELIMS$$ = \"[\\\\!\\\\$\\\\&\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\=]\",\n\t\tRESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$),\n\t\tUCSCHAR$$ = isIRI ? \"[\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]\" : \"[]\", //subset, excludes bidi control characters\n\t\tIPRIVATE$$ = isIRI ? \"[\\\\uE000-\\\\uF8FF]\" : \"[]\", //subset\n\t\tUNRESERVED$$ = merge(ALPHA$$, DIGIT$$, \"[\\\\-\\\\.\\\\_\\\\~]\", UCSCHAR$$),\n\t\tSCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\") + \"*\"),\n\t\tUSERINFO$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\")) + \"*\"),\n\t\tDEC_OCTET$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"[1-9]\" + DIGIT$$) + \"|\" + DIGIT$$),\n\t\tDEC_OCTET_RELAXED$ = subexp(subexp(\"25[0-5]\") + \"|\" + subexp(\"2[0-4]\" + DIGIT$$) + \"|\" + subexp(\"1\" + DIGIT$$ + DIGIT$$) + \"|\" + subexp(\"0?[1-9]\" + DIGIT$$) + \"|0?0?\" + DIGIT$$), //relaxed parsing rules\n\t\tIPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$ + \"\\\\.\" + DEC_OCTET_RELAXED$),\n\t\tH16$ = subexp(HEXDIG$$ + \"{1,4}\"),\n\t\tLS32$ = subexp(subexp(H16$ + \"\\\\:\" + H16$) + \"|\" + IPV4ADDRESS$),\n\t\tIPV6ADDRESS1$ = subexp( subexp(H16$ + \"\\\\:\") + \"{6}\" + LS32$), // 6( h16 \":\" ) ls32\n\t\tIPV6ADDRESS2$ = subexp( \"\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{5}\" + LS32$), // \"::\" 5( h16 \":\" ) ls32\n\t\tIPV6ADDRESS3$ = subexp(subexp( H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{4}\" + LS32$), //[ h16 ] \"::\" 4( h16 \":\" ) ls32\n\t\tIPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,1}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{3}\" + LS32$), //[ *1( h16 \":\" ) h16 ] \"::\" 3( h16 \":\" ) ls32\n\t\tIPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,2}\" + H16$) + \"?\\\\:\\\\:\" + subexp(H16$ + \"\\\\:\") + \"{2}\" + LS32$), //[ *2( h16 \":\" ) h16 ] \"::\" 2( h16 \":\" ) ls32\n\t\tIPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,3}\" + H16$) + \"?\\\\:\\\\:\" + H16$ + \"\\\\:\" + LS32$), //[ *3( h16 \":\" ) h16 ] \"::\" h16 \":\" ls32\n\t\tIPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,4}\" + H16$) + \"?\\\\:\\\\:\" + LS32$), //[ *4( h16 \":\" ) h16 ] \"::\" ls32\n\t\tIPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,5}\" + H16$) + \"?\\\\:\\\\:\" + H16$ ), //[ *5( h16 \":\" ) h16 ] \"::\" h16\n\t\tIPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + \"\\\\:\") + \"{0,6}\" + H16$) + \"?\\\\:\\\\:\" ), //[ *6( h16 \":\" ) h16 ] \"::\"\n\t\tIPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join(\"|\")),\n\t\tZONEID$ = subexp(subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$) + \"+\"), //RFC 6874\n\t\tIPV6ADDRZ$ = subexp(IPV6ADDRESS$ + \"\\\\%25\" + ZONEID$), //RFC 6874\n\t\tIPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + ZONEID$), //RFC 6874, with relaxed parsing rules\n\t\tIPVFUTURE$ = subexp(\"[vV]\" + HEXDIG$$ + \"+\\\\.\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:]\") + \"+\"),\n\t\tIP_LITERAL$ = subexp(\"\\\\[\" + subexp(IPV6ADDRZ_RELAXED$ + \"|\" + IPV6ADDRESS$ + \"|\" + IPVFUTURE$) + \"\\\\]\"), //RFC 6874\n\t\tREG_NAME$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$)) + \"*\"),\n\t\tHOST$ = subexp(IP_LITERAL$ + \"|\" + IPV4ADDRESS$ + \"(?!\" + REG_NAME$ + \")\" + \"|\" + REG_NAME$),\n\t\tPORT$ = subexp(DIGIT$$ + \"*\"),\n\t\tAUTHORITY$ = subexp(subexp(USERINFO$ + \"@\") + \"?\" + HOST$ + subexp(\"\\\\:\" + PORT$) + \"?\"),\n\t\tPCHAR$ = subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@]\")),\n\t\tSEGMENT$ = subexp(PCHAR$ + \"*\"),\n\t\tSEGMENT_NZ$ = subexp(PCHAR$ + \"+\"),\n\t\tSEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + \"|\" + merge(UNRESERVED$$, SUB_DELIMS$$, \"[\\\\@]\")) + \"+\"),\n\t\tPATH_ABEMPTY$ = subexp(subexp(\"\\\\/\" + SEGMENT$) + \"*\"),\n\t\tPATH_ABSOLUTE$ = subexp(\"\\\\/\" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + \"?\"), //simplified\n\t\tPATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified\n\t\tPATH_EMPTY$ = \"(?!\" + PCHAR$ + \")\",\n\t\tPATH$ = subexp(PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tQUERY$ = subexp(subexp(PCHAR$ + \"|\" + merge(\"[\\\\/\\\\?]\", IPRIVATE$$)) + \"*\"),\n\t\tFRAGMENT$ = subexp(subexp(PCHAR$ + \"|[\\\\/\\\\?]\") + \"*\"),\n\t\tHIER_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$),\n\t\tURI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tRELATIVE_PART$ = subexp(subexp(\"\\\\/\\\\/\" + AUTHORITY$ + PATH_ABEMPTY$) + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$),\n\t\tRELATIVE$ = subexp(RELATIVE_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\" + subexp(\"\\\\#\" + FRAGMENT$) + \"?\"),\n\t\tURI_REFERENCE$ = subexp(URI$ + \"|\" + RELATIVE$),\n\t\tABSOLUTE_URI$ = subexp(SCHEME$ + \"\\\\:\" + HIER_PART$ + subexp(\"\\\\?\" + QUERY$) + \"?\"),\n\n\t\tGENERIC_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tRELATIVE_REF$ = \"^(){0}\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_NOSCHEME$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tABSOLUTE_REF$ = \"^(\" + SCHEME$ + \")\\\\:\" + subexp(subexp(\"\\\\/\\\\/(\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?)\") + \"?(\" + PATH_ABEMPTY$ + \"|\" + PATH_ABSOLUTE$ + \"|\" + PATH_ROOTLESS$ + \"|\" + PATH_EMPTY$ + \")\") + subexp(\"\\\\?(\" + QUERY$ + \")\") + \"?$\",\n\t\tSAMEDOC_REF$ = \"^\" + subexp(\"\\\\#(\" + FRAGMENT$ + \")\") + \"?$\",\n\t\tAUTHORITY_REF$ = \"^\" + subexp(\"(\" + USERINFO$ + \")@\") + \"?(\" + HOST$ + \")\" + subexp(\"\\\\:(\" + PORT$ + \")\") + \"?$\"\n\t;\n\n\treturn {\n\t\tNOT_SCHEME : new RegExp(merge(\"[^]\", ALPHA$$, DIGIT$$, \"[\\\\+\\\\-\\\\.]\"), \"g\"),\n\t\tNOT_USERINFO : new RegExp(merge(\"[^\\\\%\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_HOST : new RegExp(merge(\"[^\\\\%\\\\[\\\\]\\\\:]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH : new RegExp(merge(\"[^\\\\%\\\\/\\\\:\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_PATH_NOSCHEME : new RegExp(merge(\"[^\\\\%\\\\/\\\\@]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tNOT_QUERY : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\", IPRIVATE$$), \"g\"),\n\t\tNOT_FRAGMENT : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, SUB_DELIMS$$, \"[\\\\:\\\\@\\\\/\\\\?]\"), \"g\"),\n\t\tESCAPE : new RegExp(merge(\"[^]\", UNRESERVED$$, SUB_DELIMS$$), \"g\"),\n\t\tUNRESERVED : new RegExp(UNRESERVED$$, \"g\"),\n\t\tOTHER_CHARS : new RegExp(merge(\"[^\\\\%]\", UNRESERVED$$, RESERVED$$), \"g\"),\n\t\tPCT_ENCODED : new RegExp(PCT_ENCODED$, \"g\"),\n\t\tIPV4ADDRESS : new RegExp(\"^(\" + IPV4ADDRESS$ + \")$\"),\n\t\tIPV6ADDRESS : new RegExp(\"^\\\\[?(\" + IPV6ADDRESS$ + \")\" + subexp(subexp(\"\\\\%25|\\\\%(?!\" + HEXDIG$$ + \"{2})\") + \"(\" + ZONEID$ + \")\") + \"?\\\\]?$\") //RFC 6874, with relaxed parsing rules\n\t};\n}\n\nexport default buildExps(false);\n","'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7E]/; // non-ASCII chars\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n\t'overflow': 'Overflow: input needs wider integers to process',\n\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n\tthrow new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, fn) {\n\tconst result = [];\n\tlet length = array.length;\n\twhile (length--) {\n\t\tresult[length] = fn(array[length]);\n\t}\n\treturn result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {Array} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(string, fn) {\n\tconst parts = string.split('@');\n\tlet result = '';\n\tif (parts.length > 1) {\n\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t// the local part (i.e. everything up to `@`) intact.\n\t\tresult = parts[0] + '@';\n\t\tstring = parts[1];\n\t}\n\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\tstring = string.replace(regexSeparators, '\\x2E');\n\tconst labels = string.split('.');\n\tconst encoded = map(labels, fn).join('.');\n\treturn result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see \n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n\tconst output = [];\n\tlet counter = 0;\n\tconst length = string.length;\n\twhile (counter < length) {\n\t\tconst value = string.charCodeAt(counter++);\n\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t// It's a high surrogate, and there is a next character.\n\t\t\tconst extra = string.charCodeAt(counter++);\n\t\t\tif ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t} else {\n\t\t\t\t// It's an unmatched surrogate; only append this code unit, in case the\n\t\t\t\t// next code unit is the high surrogate of a surrogate pair.\n\t\t\t\toutput.push(value);\n\t\t\t\tcounter--;\n\t\t\t}\n\t\t} else {\n\t\t\toutput.push(value);\n\t\t}\n\t}\n\treturn output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = array => String.fromCodePoint(...array);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function(codePoint) {\n\tif (codePoint - 0x30 < 0x0A) {\n\t\treturn codePoint - 0x16;\n\t}\n\tif (codePoint - 0x41 < 0x1A) {\n\t\treturn codePoint - 0x41;\n\t}\n\tif (codePoint - 0x61 < 0x1A) {\n\t\treturn codePoint - 0x61;\n\t}\n\treturn base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function(digit, flag) {\n\t// 0..25 map to ASCII a..z or A..Z\n\t// 26..35 map to ASCII 0..9\n\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function(delta, numPoints, firstTime) {\n\tlet k = 0;\n\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\tdelta += floor(delta / numPoints);\n\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\tdelta = floor(delta / baseMinusTMin);\n\t}\n\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function(input) {\n\t// Don't use UCS-2.\n\tconst output = [];\n\tconst inputLength = input.length;\n\tlet i = 0;\n\tlet n = initialN;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points: let `basic` be the number of input code\n\t// points before the last delimiter, or `0` if there is none, then copy\n\t// the first basic code points to the output.\n\n\tlet basic = input.lastIndexOf(delimiter);\n\tif (basic < 0) {\n\t\tbasic = 0;\n\t}\n\n\tfor (let j = 0; j < basic; ++j) {\n\t\t// if it's not a basic code point\n\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\terror('not-basic');\n\t\t}\n\t\toutput.push(input.charCodeAt(j));\n\t}\n\n\t// Main decoding loop: start just after the last delimiter if any basic code\n\t// points were copied; start at the beginning otherwise.\n\n\tfor (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t// `index` is the index of the next character to be consumed.\n\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t// which gets added to `i`. The overflow checking is easier\n\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t// value at the end to obtain `delta`.\n\t\tlet oldi = i;\n\t\tfor (let w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\tif (index >= inputLength) {\n\t\t\t\terror('invalid-input');\n\t\t\t}\n\n\t\t\tconst digit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\ti += digit * w;\n\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\tif (digit < t) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst baseMinusT = base - t;\n\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tw *= baseMinusT;\n\n\t\t}\n\n\t\tconst out = output.length + 1;\n\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t// incrementing `n` each time, so we'll fix that now:\n\t\tif (floor(i / out) > maxInt - n) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tn += floor(i / out);\n\t\ti %= out;\n\n\t\t// Insert `n` at position `i` of the output.\n\t\toutput.splice(i++, 0, n);\n\n\t}\n\n\treturn String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function(input) {\n\tconst output = [];\n\n\t// Convert the input in UCS-2 to an array of Unicode code points.\n\tinput = ucs2decode(input);\n\n\t// Cache the length.\n\tlet inputLength = input.length;\n\n\t// Initialize the state.\n\tlet n = initialN;\n\tlet delta = 0;\n\tlet bias = initialBias;\n\n\t// Handle the basic code points.\n\tfor (const currentValue of input) {\n\t\tif (currentValue < 0x80) {\n\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t}\n\t}\n\n\tlet basicLength = output.length;\n\tlet handledCPCount = basicLength;\n\n\t// `handledCPCount` is the number of code points that have been handled;\n\t// `basicLength` is the number of basic code points.\n\n\t// Finish the basic string with a delimiter unless it's empty.\n\tif (basicLength) {\n\t\toutput.push(delimiter);\n\t}\n\n\t// Main encoding loop:\n\twhile (handledCPCount < inputLength) {\n\n\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t// larger one:\n\t\tlet m = maxInt;\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\tm = currentValue;\n\t\t\t}\n\t\t}\n\n\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t// but guard against overflow.\n\t\tconst handledCPCountPlusOne = handledCPCount + 1;\n\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\terror('overflow');\n\t\t}\n\n\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\tn = m;\n\n\t\tfor (const currentValue of input) {\n\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\t\t\tif (currentValue == n) {\n\t\t\t\t// Represent delta as a generalized variable-length integer.\n\t\t\t\tlet q = delta;\n\t\t\t\tfor (let k = base; /* no condition */; k += base) {\n\t\t\t\t\tconst t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst qMinusT = q - t;\n\t\t\t\t\tconst baseMinusT = base - t;\n\t\t\t\t\toutput.push(\n\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t);\n\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t}\n\n\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\tdelta = 0;\n\t\t\t\t++handledCPCount;\n\t\t\t}\n\t\t}\n\n\t\t++delta;\n\t\t++n;\n\n\t}\n\treturn output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexPunycode.test(string)\n\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t: string;\n\t});\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function(input) {\n\treturn mapDomain(input, function(string) {\n\t\treturn regexNonASCII.test(string)\n\t\t\t? 'xn--' + encode(string)\n\t\t\t: string;\n\t});\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n\t/**\n\t * A string representing the current Punycode.js version number.\n\t * @memberOf punycode\n\t * @type String\n\t */\n\t'version': '2.1.0',\n\t/**\n\t * An object of methods to convert from JavaScript's internal character\n\t * representation (UCS-2) to Unicode code points, and back.\n\t * @see \n\t * @memberOf punycode\n\t * @type Object\n\t */\n\t'ucs2': {\n\t\t'decode': ucs2decode,\n\t\t'encode': ucs2encode\n\t},\n\t'decode': decode,\n\t'encode': encode,\n\t'toASCII': toASCII,\n\t'toUnicode': toUnicode\n};\n\nexport default punycode;\n","/**\n * URI.js\n *\n * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript.\n * @author Gary Court\n * @see http://github.com/garycourt/uri-js\n */\n\n/**\n * Copyright 2011 Gary Court. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation are those of the\n * authors and should not be interpreted as representing official policies, either expressed\n * or implied, of Gary Court.\n */\n\nimport URI_PROTOCOL from \"./regexps-uri\";\nimport IRI_PROTOCOL from \"./regexps-iri\";\nimport punycode from \"punycode\";\nimport { toUpperCase, typeOf, assign } from \"./util\";\n\nexport interface URIComponents {\n\tscheme?:string;\n\tuserinfo?:string;\n\thost?:string;\n\tport?:number|string;\n\tpath?:string;\n\tquery?:string;\n\tfragment?:string;\n\treference?:string;\n\terror?:string;\n}\n\nexport interface URIOptions {\n\tscheme?:string;\n\treference?:string;\n\ttolerant?:boolean;\n\tabsolutePath?:boolean;\n\tiri?:boolean;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n}\n\nexport interface URISchemeHandler {\n\tscheme:string;\n\tparse(components:ParentComponents, options:Options):Components;\n\tserialize(components:Components, options:Options):ParentComponents;\n\tunicodeSupport?:boolean;\n\tdomainHost?:boolean;\n\tabsolutePath?:boolean;\n}\n\nexport interface URIRegExps {\n\tNOT_SCHEME : RegExp,\n\tNOT_USERINFO : RegExp,\n\tNOT_HOST : RegExp,\n\tNOT_PATH : RegExp,\n\tNOT_PATH_NOSCHEME : RegExp,\n\tNOT_QUERY : RegExp,\n\tNOT_FRAGMENT : RegExp,\n\tESCAPE : RegExp,\n\tUNRESERVED : RegExp,\n\tOTHER_CHARS : RegExp,\n\tPCT_ENCODED : RegExp,\n\tIPV4ADDRESS : RegExp,\n\tIPV6ADDRESS : RegExp,\n}\n\nexport const SCHEMES:{[scheme:string]:URISchemeHandler} = {};\n\nexport function pctEncChar(chr:string):string {\n\tconst c = chr.charCodeAt(0);\n\tlet e:string;\n\n\tif (c < 16) e = \"%0\" + c.toString(16).toUpperCase();\n\telse if (c < 128) e = \"%\" + c.toString(16).toUpperCase();\n\telse if (c < 2048) e = \"%\" + ((c >> 6) | 192).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\telse e = \"%\" + ((c >> 12) | 224).toString(16).toUpperCase() + \"%\" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + \"%\" + ((c & 63) | 128).toString(16).toUpperCase();\n\n\treturn e;\n}\n\nexport function pctDecChars(str:string):string {\n\tlet newStr = \"\";\n\tlet i = 0;\n\tconst il = str.length;\n\n\twhile (i < il) {\n\t\tconst c = parseInt(str.substr(i + 1, 2), 16);\n\n\t\tif (c < 128) {\n\t\t\tnewStr += String.fromCharCode(c);\n\t\t\ti += 3;\n\t\t}\n\t\telse if (c >= 194 && c < 224) {\n\t\t\tif ((il - i) >= 6) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 6);\n\t\t\t}\n\t\t\ti += 6;\n\t\t}\n\t\telse if (c >= 224) {\n\t\t\tif ((il - i) >= 9) {\n\t\t\t\tconst c2 = parseInt(str.substr(i + 4, 2), 16);\n\t\t\t\tconst c3 = parseInt(str.substr(i + 7, 2), 16);\n\t\t\t\tnewStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n\t\t\t} else {\n\t\t\t\tnewStr += str.substr(i, 9);\n\t\t\t}\n\t\t\ti += 9;\n\t\t}\n\t\telse {\n\t\t\tnewStr += str.substr(i, 3);\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\treturn newStr;\n}\n\nfunction _normalizeComponentEncoding(components:URIComponents, protocol:URIRegExps) {\n\tfunction decodeUnreserved(str:string):string {\n\t\tconst decStr = pctDecChars(str);\n\t\treturn (!decStr.match(protocol.UNRESERVED) ? str : decStr);\n\t}\n\n\tif (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, \"\");\n\tif (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\tif (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase);\n\n\treturn components;\n};\n\nfunction _stripLeadingZeros(str:string):string {\n\treturn str.replace(/^0*(.*)/, \"$1\") || \"0\";\n}\n\nfunction _normalizeIPv4(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV4ADDRESS) || [];\n\tconst [, address] = matches;\n\t\n\tif (address) {\n\t\treturn address.split(\".\").map(_stripLeadingZeros).join(\".\");\n\t} else {\n\t\treturn host;\n\t}\n}\n\nfunction _normalizeIPv6(host:string, protocol:URIRegExps):string {\n\tconst matches = host.match(protocol.IPV6ADDRESS) || [];\n\tconst [, address, zone] = matches;\n\n\tif (address) {\n\t\tconst [last, first] = address.toLowerCase().split('::').reverse();\n\t\tconst firstFields = first ? first.split(\":\").map(_stripLeadingZeros) : [];\n\t\tconst lastFields = last.split(\":\").map(_stripLeadingZeros);\n\t\tconst isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]);\n\t\tconst fieldCount = isLastFieldIPv4Address ? 7 : 8;\n\t\tconst lastFieldsStart = lastFields.length - fieldCount;\n\t\tconst fields = Array(fieldCount);\n\n\t\tfor (let x = 0; x < fieldCount; ++x) {\n\t\t\tfields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || '';\n\t\t}\n\n\t\tif (isLastFieldIPv4Address) {\n\t\t\tfields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol);\n\t\t}\n\n\t\tconst allZeroFields = fields.reduce>((acc, field, index) => {\n\t\t\tif (!field || field === \"0\") {\n\t\t\t\tconst lastLongest = acc[acc.length - 1];\n\t\t\t\tif (lastLongest && lastLongest.index + lastLongest.length === index) {\n\t\t\t\t\tlastLongest.length++;\n\t\t\t\t} else {\n\t\t\t\t\tacc.push({ index, length : 1 });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\t\tconst longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0];\n\n\t\tlet newHost:string;\n\t\tif (longestZeroFields && longestZeroFields.length > 1) {\n\t\t\tconst newFirst = fields.slice(0, longestZeroFields.index) ;\n\t\t\tconst newLast = fields.slice(longestZeroFields.index + longestZeroFields.length);\n\t\t\tnewHost = newFirst.join(\":\") + \"::\" + newLast.join(\":\");\n\t\t} else {\n\t\t\tnewHost = fields.join(\":\");\n\t\t}\n\n\t\tif (zone) {\n\t\t\tnewHost += \"%\" + zone;\n\t\t}\n\n\t\treturn newHost;\n\t} else {\n\t\treturn host;\n\t}\n}\n\nconst URI_PARSE = /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:([^\\/?#@]*)@)?(\\[[^\\/?#\\]]+\\]|[^\\/?#:]*)(?:\\:(\\d*))?))?([^?#]*)(?:\\?([^#]*))?(?:#((?:.|\\n|\\r)*))?/i;\nconst NO_MATCH_IS_UNDEFINED = ((\"\").match(/(){0}/))[1] === undefined;\n\nexport function parse(uriString:string, options:URIOptions = {}):URIComponents {\n\tconst components:URIComponents = {};\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\n\tif (options.reference === \"suffix\") uriString = (options.scheme ? options.scheme + \":\" : \"\") + \"//\" + uriString;\n\n\tconst matches = uriString.match(URI_PARSE);\n\n\tif (matches) {\n\t\tif (NO_MATCH_IS_UNDEFINED) {\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1];\n\t\t\tcomponents.userinfo = matches[3];\n\t\t\tcomponents.host = matches[4];\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = matches[7];\n\t\t\tcomponents.fragment = matches[8];\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = matches[5];\n\t\t\t}\n\t\t} else { //IE FIX for improper RegExp matching\n\t\t\t//store each component\n\t\t\tcomponents.scheme = matches[1] || undefined;\n\t\t\tcomponents.userinfo = (uriString.indexOf(\"@\") !== -1 ? matches[3] : undefined);\n\t\t\tcomponents.host = (uriString.indexOf(\"//\") !== -1 ? matches[4] : undefined);\n\t\t\tcomponents.port = parseInt(matches[5], 10);\n\t\t\tcomponents.path = matches[6] || \"\";\n\t\t\tcomponents.query = (uriString.indexOf(\"?\") !== -1 ? matches[7] : undefined);\n\t\t\tcomponents.fragment = (uriString.indexOf(\"#\") !== -1 ? matches[8] : undefined);\n\n\t\t\t//fix port number\n\t\t\tif (isNaN(components.port)) {\n\t\t\t\tcomponents.port = (uriString.match(/\\/\\/(?:.|\\n)*\\:(?:\\/|\\?|\\#|$)/) ? matches[4] : undefined);\n\t\t\t}\n\t\t}\n\n\t\tif (components.host) {\n\t\t\t//normalize IP hosts\n\t\t\tcomponents.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol);\n\t\t}\n\n\t\t//determine reference type\n\t\tif (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) {\n\t\t\tcomponents.reference = \"same-document\";\n\t\t} else if (components.scheme === undefined) {\n\t\t\tcomponents.reference = \"relative\";\n\t\t} else if (components.fragment === undefined) {\n\t\t\tcomponents.reference = \"absolute\";\n\t\t} else {\n\t\t\tcomponents.reference = \"uri\";\n\t\t}\n\n\t\t//check for reference errors\n\t\tif (options.reference && options.reference !== \"suffix\" && options.reference !== components.reference) {\n\t\t\tcomponents.error = components.error || \"URI is not a \" + options.reference + \" reference.\";\n\t\t}\n\n\t\t//find scheme handler\n\t\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t\t//check if scheme can't handle IRIs\n\t\tif (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n\t\t\t//if host component is a domain name\n\t\t\tif (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\tcomponents.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//convert IRI -> URI\n\t\t\t_normalizeComponentEncoding(components, URI_PROTOCOL);\n\t\t} else {\n\t\t\t//normalize encodings\n\t\t\t_normalizeComponentEncoding(components, protocol);\n\t\t}\n\n\t\t//perform scheme specific parsing\n\t\tif (schemeHandler && schemeHandler.parse) {\n\t\t\tschemeHandler.parse(components, options);\n\t\t}\n\t} else {\n\t\tcomponents.error = components.error || \"URI can not be parsed.\";\n\t}\n\n\treturn components;\n};\n\nfunction _recomposeAuthority(components:URIComponents, options:URIOptions):string|undefined {\n\tconst protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\tif (components.userinfo !== undefined) {\n\t\turiTokens.push(components.userinfo);\n\t\turiTokens.push(\"@\");\n\t}\n\n\tif (components.host !== undefined) {\n\t\t//normalize IP hosts, add brackets and escape zone separator for IPv6\n\t\turiTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => \"[\" + $1 + ($2 ? \"%25\" + $2 : \"\") + \"]\"));\n\t}\n\n\tif (typeof components.port === \"number\" || typeof components.port === \"string\") {\n\t\turiTokens.push(\":\");\n\t\turiTokens.push(String(components.port));\n\t}\n\n\treturn uriTokens.length ? uriTokens.join(\"\") : undefined;\n};\n\nconst RDS1 = /^\\.\\.?\\//;\nconst RDS2 = /^\\/\\.(\\/|$)/;\nconst RDS3 = /^\\/\\.\\.(\\/|$)/;\nconst RDS4 = /^\\.\\.?$/;\nconst RDS5 = /^\\/?(?:.|\\n)*?(?=\\/|$)/;\n\nexport function removeDotSegments(input:string):string {\n\tconst output:Array = [];\n\n\twhile (input.length) {\n\t\tif (input.match(RDS1)) {\n\t\t\tinput = input.replace(RDS1, \"\");\n\t\t} else if (input.match(RDS2)) {\n\t\t\tinput = input.replace(RDS2, \"/\");\n\t\t} else if (input.match(RDS3)) {\n\t\t\tinput = input.replace(RDS3, \"/\");\n\t\t\toutput.pop();\n\t\t} else if (input === \".\" || input === \"..\") {\n\t\t\tinput = \"\";\n\t\t} else {\n\t\t\tconst im = input.match(RDS5);\n\t\t\tif (im) {\n\t\t\t\tconst s = im[0];\n\t\t\t\tinput = input.slice(s.length);\n\t\t\t\toutput.push(s);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Unexpected dot segment condition\");\n\t\t\t}\n\t\t}\n\t}\n\n\treturn output.join(\"\");\n};\n\nexport function serialize(components:URIComponents, options:URIOptions = {}):string {\n\tconst protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL);\n\tconst uriTokens:Array = [];\n\n\t//find scheme handler\n\tconst schemeHandler = SCHEMES[(options.scheme || components.scheme || \"\").toLowerCase()];\n\n\t//perform scheme specific serialization\n\tif (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options);\n\n\tif (components.host) {\n\t\t//if host component is an IPv6 address\n\t\tif (protocol.IPV6ADDRESS.test(components.host)) {\n\t\t\t//TODO: normalize IPv6 address as per RFC 5952\n\t\t}\n\n\t\t//if host component is a domain name\n\t\telse if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) {\n\t\t\t//convert IDN via punycode\n\t\t\ttry {\n\t\t\t\tcomponents.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host));\n\t\t\t} catch (e) {\n\t\t\t\tcomponents.error = components.error || \"Host's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t}\n\t\t}\n\t}\n\n\t//normalize encoding\n\t_normalizeComponentEncoding(components, protocol);\n\n\tif (options.reference !== \"suffix\" && components.scheme) {\n\t\turiTokens.push(components.scheme);\n\t\turiTokens.push(\":\");\n\t}\n\n\tconst authority = _recomposeAuthority(components, options);\n\tif (authority !== undefined) {\n\t\tif (options.reference !== \"suffix\") {\n\t\t\turiTokens.push(\"//\");\n\t\t}\n\n\t\turiTokens.push(authority);\n\n\t\tif (components.path && components.path.charAt(0) !== \"/\") {\n\t\t\turiTokens.push(\"/\");\n\t\t}\n\t}\n\n\tif (components.path !== undefined) {\n\t\tlet s = components.path;\n\n\t\tif (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n\t\t\ts = removeDotSegments(s);\n\t\t}\n\n\t\tif (authority === undefined) {\n\t\t\ts = s.replace(/^\\/\\//, \"/%2F\"); //don't allow the path to start with \"//\"\n\t\t}\n\n\t\turiTokens.push(s);\n\t}\n\n\tif (components.query !== undefined) {\n\t\turiTokens.push(\"?\");\n\t\turiTokens.push(components.query);\n\t}\n\n\tif (components.fragment !== undefined) {\n\t\turiTokens.push(\"#\");\n\t\turiTokens.push(components.fragment);\n\t}\n\n\treturn uriTokens.join(\"\"); //merge tokens into a string\n};\n\nexport function resolveComponents(base:URIComponents, relative:URIComponents, options:URIOptions = {}, skipNormalization?:boolean):URIComponents {\n\tconst target:URIComponents = {};\n\n\tif (!skipNormalization) {\n\t\tbase = parse(serialize(base, options), options); //normalize base components\n\t\trelative = parse(serialize(relative, options), options); //normalize relative components\n\t}\n\toptions = options || {};\n\n\tif (!options.tolerant && relative.scheme) {\n\t\ttarget.scheme = relative.scheme;\n\t\t//target.authority = relative.authority;\n\t\ttarget.userinfo = relative.userinfo;\n\t\ttarget.host = relative.host;\n\t\ttarget.port = relative.port;\n\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\ttarget.query = relative.query;\n\t} else {\n\t\tif (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n\t\t\t//target.authority = relative.authority;\n\t\t\ttarget.userinfo = relative.userinfo;\n\t\t\ttarget.host = relative.host;\n\t\t\ttarget.port = relative.port;\n\t\t\ttarget.path = removeDotSegments(relative.path || \"\");\n\t\t\ttarget.query = relative.query;\n\t\t} else {\n\t\t\tif (!relative.path) {\n\t\t\t\ttarget.path = base.path;\n\t\t\t\tif (relative.query !== undefined) {\n\t\t\t\t\ttarget.query = relative.query;\n\t\t\t\t} else {\n\t\t\t\t\ttarget.query = base.query;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (relative.path.charAt(0) === \"/\") {\n\t\t\t\t\ttarget.path = removeDotSegments(relative.path);\n\t\t\t\t} else {\n\t\t\t\t\tif ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n\t\t\t\t\t\ttarget.path = \"/\" + relative.path;\n\t\t\t\t\t} else if (!base.path) {\n\t\t\t\t\t\ttarget.path = relative.path;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.path = base.path.slice(0, base.path.lastIndexOf(\"/\") + 1) + relative.path;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.path = removeDotSegments(target.path);\n\t\t\t\t}\n\t\t\t\ttarget.query = relative.query;\n\t\t\t}\n\t\t\t//target.authority = base.authority;\n\t\t\ttarget.userinfo = base.userinfo;\n\t\t\ttarget.host = base.host;\n\t\t\ttarget.port = base.port;\n\t\t}\n\t\ttarget.scheme = base.scheme;\n\t}\n\n\ttarget.fragment = relative.fragment;\n\n\treturn target;\n};\n\nexport function resolve(baseURI:string, relativeURI:string, options?:URIOptions):string {\n\tconst schemelessOptions = assign({ scheme : 'null' }, options);\n\treturn serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);\n};\n\nexport function normalize(uri:string, options?:URIOptions):string;\nexport function normalize(uri:URIComponents, options?:URIOptions):URIComponents;\nexport function normalize(uri:any, options?:URIOptions):any {\n\tif (typeof uri === \"string\") {\n\t\turi = serialize(parse(uri, options), options);\n\t} else if (typeOf(uri) === \"object\") {\n\t\turi = parse(serialize(uri, options), options);\n\t}\n\n\treturn uri;\n};\n\nexport function equal(uriA:string, uriB:string, options?: URIOptions):boolean;\nexport function equal(uriA:URIComponents, uriB:URIComponents, options?:URIOptions):boolean;\nexport function equal(uriA:any, uriB:any, options?:URIOptions):boolean {\n\tif (typeof uriA === \"string\") {\n\t\turiA = serialize(parse(uriA, options), options);\n\t} else if (typeOf(uriA) === \"object\") {\n\t\turiA = serialize(uriA, options);\n\t}\n\n\tif (typeof uriB === \"string\") {\n\t\turiB = serialize(parse(uriB, options), options);\n\t} else if (typeOf(uriB) === \"object\") {\n\t\turiB = serialize(uriB, options);\n\t}\n\n\treturn uriA === uriB;\n};\n\nexport function escapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar);\n};\n\nexport function unescapeComponent(str:string, options?:URIOptions):string {\n\treturn str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars);\n};\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nexport interface WSComponents extends URIComponents {\n\tresourceName?: string;\n\tsecure?: boolean;\n}\n\nfunction isSecure(wsComponents:WSComponents):boolean {\n\treturn typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === \"wss\";\n}\n\n//RFC 6455\nconst handler:URISchemeHandler = {\n\tscheme : \"ws\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):WSComponents {\n\t\tconst wsComponents = components as WSComponents;\n\n\t\t//indicate if the secure flag is set\n\t\twsComponents.secure = isSecure(wsComponents);\n\n\t\t//construct resouce name\n\t\twsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : '');\n\t\twsComponents.path = undefined;\n\t\twsComponents.query = undefined;\n\n\t\treturn wsComponents;\n\t},\n\n\tserialize : function (wsComponents:WSComponents, options:URIOptions):URIComponents {\n\t\t//normalize the default port\n\t\tif (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === \"\") {\n\t\t\twsComponents.port = undefined;\n\t\t}\n\n\t\t//ensure scheme matches secure flag\n\t\tif (typeof wsComponents.secure === 'boolean') {\n\t\t\twsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws');\n\t\t\twsComponents.secure = undefined;\n\t\t}\n\n\t\t//reconstruct path from resource name\n\t\tif (wsComponents.resourceName) {\n\t\t\tconst [path, query] = wsComponents.resourceName.split('?');\n\t\t\twsComponents.path = (path && path !== '/' ? path : undefined);\n\t\t\twsComponents.query = query;\n\t\t\twsComponents.resourceName = undefined;\n\t\t}\n\n\t\t//forbid fragment component\n\t\twsComponents.fragment = undefined;\n\n\t\treturn wsComponents;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, pctDecChars, unescapeComponent } from \"../uri\";\nimport punycode from \"punycode\";\nimport { merge, subexp, toUpperCase, toArray } from \"../util\";\n\nexport interface MailtoHeaders {\n\t[hfname:string]:string\n}\n\nexport interface MailtoComponents extends URIComponents {\n\tto:Array,\n\theaders?:MailtoHeaders,\n\tsubject?:string,\n\tbody?:string\n}\n\nconst O:MailtoHeaders = {};\nconst isIRI = true;\n\n//RFC 3986\nconst UNRESERVED$$ = \"[A-Za-z0-9\\\\-\\\\.\\\\_\\\\~\" + (isIRI ? \"\\\\xA0-\\\\u200D\\\\u2010-\\\\u2029\\\\u202F-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF\" : \"\") + \"]\";\nconst HEXDIG$$ = \"[0-9A-Fa-f]\"; //case-insensitive\nconst PCT_ENCODED$ = subexp(subexp(\"%[EFef]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%[89A-Fa-f]\" + HEXDIG$$ + \"%\" + HEXDIG$$ + HEXDIG$$) + \"|\" + subexp(\"%\" + HEXDIG$$ + HEXDIG$$)); //expanded\n\n//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; =\n//const ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\#\\\\$\\\\%\\\\&\\\\'\\\\*\\\\+\\\\-\\\\/\\\\=\\\\?\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QTEXT$$ = \"[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x7F]\"; //(%d1-8 / %d11-12 / %d14-31 / %d127)\n//const QTEXT$$ = merge(\"[\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7E]\", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext\n//const VCHAR$$ = \"[\\\\x21-\\\\x7E]\";\n//const WSP$$ = \"[\\\\x20\\\\x09]\";\n//const OBS_QP$ = subexp(\"\\\\\\\\\" + merge(\"[\\\\x00\\\\x0D\\\\x0A]\", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext\n//const FWS$ = subexp(subexp(WSP$$ + \"*\" + \"\\\\x0D\\\\x0A\") + \"?\" + WSP$$ + \"+\");\n//const QUOTED_PAIR$ = subexp(subexp(\"\\\\\\\\\" + subexp(VCHAR$$ + \"|\" + WSP$$)) + \"|\" + OBS_QP$);\n//const QUOTED_STRING$ = subexp('\\\\\"' + subexp(FWS$ + \"?\" + QCONTENT$) + \"*\" + FWS$ + \"?\" + '\\\\\"');\nconst ATEXT$$ = \"[A-Za-z0-9\\\\!\\\\$\\\\%\\\\'\\\\*\\\\+\\\\-\\\\^\\\\_\\\\`\\\\{\\\\|\\\\}\\\\~]\";\nconst QTEXT$$ = \"[\\\\!\\\\$\\\\%\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\-\\\\.0-9\\\\<\\\\>A-Z\\\\x5E-\\\\x7E]\";\nconst VCHAR$$ = merge(QTEXT$$, \"[\\\\\\\"\\\\\\\\]\");\nconst DOT_ATOM_TEXT$ = subexp(ATEXT$$ + \"+\" + subexp(\"\\\\.\" + ATEXT$$ + \"+\") + \"*\");\nconst QUOTED_PAIR$ = subexp(\"\\\\\\\\\" + VCHAR$$);\nconst QCONTENT$ = subexp(QTEXT$$ + \"|\" + QUOTED_PAIR$);\nconst QUOTED_STRING$ = subexp('\\\\\"' + QCONTENT$ + \"*\" + '\\\\\"');\n\n//RFC 6068\nconst DTEXT_NO_OBS$$ = \"[\\\\x21-\\\\x5A\\\\x5E-\\\\x7E]\"; //%d33-90 / %d94-126\nconst SOME_DELIMS$$ = \"[\\\\!\\\\$\\\\'\\\\(\\\\)\\\\*\\\\+\\\\,\\\\;\\\\:\\\\@]\";\nconst QCHAR$ = subexp(UNRESERVED$$ + \"|\" + PCT_ENCODED$ + \"|\" + SOME_DELIMS$$);\nconst DOMAIN$ = subexp(DOT_ATOM_TEXT$ + \"|\" + \"\\\\[\" + DTEXT_NO_OBS$$ + \"*\" + \"\\\\]\");\nconst LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + \"|\" + QUOTED_STRING$);\nconst ADDR_SPEC$ = subexp(LOCAL_PART$ + \"\\\\@\" + DOMAIN$);\nconst TO$ = subexp(ADDR_SPEC$ + subexp(\"\\\\,\" + ADDR_SPEC$) + \"*\");\nconst HFNAME$ = subexp(QCHAR$ + \"*\");\nconst HFVALUE$ = HFNAME$;\nconst HFIELD$ = subexp(HFNAME$ + \"\\\\=\" + HFVALUE$);\nconst HFIELDS2$ = subexp(HFIELD$ + subexp(\"\\\\&\" + HFIELD$) + \"*\");\nconst HFIELDS$ = subexp(\"\\\\?\" + HFIELDS2$);\nconst MAILTO_URI = new RegExp(\"^mailto\\\\:\" + TO$ + \"?\" + HFIELDS$ + \"?$\");\n\nconst UNRESERVED = new RegExp(UNRESERVED$$, \"g\");\nconst PCT_ENCODED = new RegExp(PCT_ENCODED$, \"g\");\nconst NOT_LOCAL_PART = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", '[\\\\\"]', VCHAR$$), \"g\");\nconst NOT_DOMAIN = new RegExp(merge(\"[^]\", ATEXT$$, \"[\\\\.]\", \"[\\\\[]\", DTEXT_NO_OBS$$, \"[\\\\]]\"), \"g\");\nconst NOT_HFNAME = new RegExp(merge(\"[^]\", UNRESERVED$$, SOME_DELIMS$$), \"g\");\nconst NOT_HFVALUE = NOT_HFNAME;\nconst TO = new RegExp(\"^\" + TO$ + \"$\");\nconst HFIELDS = new RegExp(\"^\" + HFIELDS2$ + \"$\");\n\nfunction decodeUnreserved(str:string):string {\n\tconst decStr = pctDecChars(str);\n\treturn (!decStr.match(UNRESERVED) ? str : decStr);\n}\n\nconst handler:URISchemeHandler = {\n\tscheme : \"mailto\",\n\n\tparse : function (components:URIComponents, options:URIOptions):MailtoComponents {\n\t\tconst mailtoComponents = components as MailtoComponents;\n\t\tconst to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(\",\") : []);\n\t\tmailtoComponents.path = undefined;\n\n\t\tif (mailtoComponents.query) {\n\t\t\tlet unknownHeaders = false\n\t\t\tconst headers:MailtoHeaders = {};\n\t\t\tconst hfields = mailtoComponents.query.split(\"&\");\n\n\t\t\tfor (let x = 0, xl = hfields.length; x < xl; ++x) {\n\t\t\t\tconst hfield = hfields[x].split(\"=\");\n\n\t\t\t\tswitch (hfield[0]) {\n\t\t\t\t\tcase \"to\":\n\t\t\t\t\t\tconst toAddrs = hfield[1].split(\",\");\n\t\t\t\t\t\tfor (let x = 0, xl = toAddrs.length; x < xl; ++x) {\n\t\t\t\t\t\t\tto.push(toAddrs[x]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"subject\":\n\t\t\t\t\t\tmailtoComponents.subject = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"body\":\n\t\t\t\t\t\tmailtoComponents.body = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tunknownHeaders = true;\n\t\t\t\t\t\theaders[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (unknownHeaders) mailtoComponents.headers = headers;\n\t\t}\n\n\t\tmailtoComponents.query = undefined;\n\n\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\tconst addr = to[x].split(\"@\");\n\n\t\t\taddr[0] = unescapeComponent(addr[0]);\n\n\t\t\tif (!options.unicodeSupport) {\n\t\t\t\t//convert Unicode IDN -> ASCII IDN\n\t\t\t\ttry {\n\t\t\t\t\taddr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase());\n\t\t\t\t} catch (e) {\n\t\t\t\t\tmailtoComponents.error = mailtoComponents.error || \"Email address's domain name can not be converted to ASCII via punycode: \" + e;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddr[1] = unescapeComponent(addr[1], options).toLowerCase();\n\t\t\t}\n\n\t\t\tto[x] = addr.join(\"@\");\n\t\t}\n\n\t\treturn mailtoComponents;\n\t},\n\n\tserialize : function (mailtoComponents:MailtoComponents, options:URIOptions):URIComponents {\n\t\tconst components = mailtoComponents as URIComponents;\n\t\tconst to = toArray(mailtoComponents.to);\n\t\tif (to) {\n\t\t\tfor (let x = 0, xl = to.length; x < xl; ++x) {\n\t\t\t\tconst toAddr = String(to[x]);\n\t\t\t\tconst atIdx = toAddr.lastIndexOf(\"@\");\n\t\t\t\tconst localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar);\n\t\t\t\tlet domain = toAddr.slice(atIdx + 1);\n\n\t\t\t\t//convert IDN via punycode\n\t\t\t\ttry {\n\t\t\t\t\tdomain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tcomponents.error = components.error || \"Email address's domain name can not be converted to \" + (!options.iri ? \"ASCII\" : \"Unicode\") + \" via punycode: \" + e;\n\t\t\t\t}\n\n\t\t\t\tto[x] = localPart + \"@\" + domain;\n\t\t\t}\n\n\t\t\tcomponents.path = to.join(\",\");\n\t\t}\n\n\t\tconst headers = mailtoComponents.headers = mailtoComponents.headers || {};\n\n\t\tif (mailtoComponents.subject) headers[\"subject\"] = mailtoComponents.subject;\n\t\tif (mailtoComponents.body) headers[\"body\"] = mailtoComponents.body;\n\n\t\tconst fields = [];\n\t\tfor (const name in headers) {\n\t\t\tif (headers[name] !== O[name]) {\n\t\t\t\tfields.push(\n\t\t\t\t\tname.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) +\n\t\t\t\t\t\"=\" +\n\t\t\t\t\theaders[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (fields.length) {\n\t\t\tcomponents.query = fields.join(\"&\");\n\t\t}\n\n\t\treturn components;\n\t}\n}\n\nexport default handler;","import { URIRegExps } from \"./uri\";\nimport { buildExps } from \"./regexps-uri\";\n\nexport default buildExps(true);\n","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"http\",\n\n\tdomainHost : true,\n\n\tparse : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\t//report missing host\n\t\tif (!components.host) {\n\t\t\tcomponents.error = components.error || \"HTTP URIs must have a host.\";\n\t\t}\n\n\t\treturn components;\n\t},\n\n\tserialize : function (components:URIComponents, options:URIOptions):URIComponents {\n\t\tconst secure = String(components.scheme).toLowerCase() === \"https\";\n\n\t\t//normalize the default port\n\t\tif (components.port === (secure ? 443 : 80) || components.port === \"\") {\n\t\t\tcomponents.port = undefined;\n\t\t}\n\t\t\n\t\t//normalize the empty path\n\t\tif (!components.path) {\n\t\t\tcomponents.path = \"/\";\n\t\t}\n\n\t\t//NOTE: We do not parse query strings for HTTP URIs\n\t\t//as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n\t\t//and not the HTTP spec.\n\n\t\treturn components;\n\t}\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport http from \"./http\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"https\",\n\tdomainHost : http.domainHost,\n\tparse : http.parse,\n\tserialize : http.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport ws from \"./ws\";\n\nconst handler:URISchemeHandler = {\n\tscheme : \"wss\",\n\tdomainHost : ws.domainHost,\n\tparse : ws.parse,\n\tserialize : ws.serialize\n}\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { pctEncChar, SCHEMES } from \"../uri\";\n\nexport interface URNComponents extends URIComponents {\n\tnid?:string;\n\tnss?:string;\n}\n\nexport interface URNOptions extends URIOptions {\n\tnid?:string;\n}\n\nconst NID$ = \"(?:[0-9A-Za-z][0-9A-Za-z\\\\-]{1,31})\";\nconst PCT_ENCODED$ = \"(?:\\\\%[0-9A-Fa-f]{2})\";\nconst TRANS$$ = \"[0-9A-Za-z\\\\(\\\\)\\\\+\\\\,\\\\-\\\\.\\\\:\\\\=\\\\@\\\\;\\\\$\\\\_\\\\!\\\\*\\\\'\\\\/\\\\?\\\\#]\";\nconst NSS$ = \"(?:(?:\" + PCT_ENCODED$ + \"|\" + TRANS$$ + \")+)\";\nconst URN_SCHEME = new RegExp(\"^urn\\\\:(\" + NID$ + \")$\");\nconst URN_PATH = new RegExp(\"^(\" + NID$ + \")\\\\:(\" + NSS$ + \")$\");\nconst URN_PARSE = /^([^\\:]+)\\:(.*)/;\nconst URN_EXCLUDED = /[\\x00-\\x20\\\\\\\"\\&\\<\\>\\[\\]\\^\\`\\{\\|\\}\\~\\x7F-\\xFF]/g;\n\n//RFC 2141\nconst handler:URISchemeHandler = {\n\tscheme : \"urn\",\n\n\tparse : function (components:URIComponents, options:URNOptions):URNComponents {\n\t\tconst matches = components.path && components.path.match(URN_PARSE);\n\t\tlet urnComponents = components as URNComponents;\n\n\t\tif (matches) {\n\t\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\t\tconst nid = matches[1].toLowerCase();\n\t\t\tconst nss = matches[2];\n\t\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\t\turnComponents.nid = nid;\n\t\t\turnComponents.nss = nss;\n\t\t\turnComponents.path = undefined;\n\n\t\t\tif (schemeHandler) {\n\t\t\t\turnComponents = schemeHandler.parse(urnComponents, options) as URNComponents;\n\t\t\t}\n\t\t} else {\n\t\t\turnComponents.error = urnComponents.error || \"URN can not be parsed.\";\n\t\t}\n\n\t\treturn urnComponents;\n\t},\n\n\tserialize : function (urnComponents:URNComponents, options:URNOptions):URIComponents {\n\t\tconst scheme = options.scheme || urnComponents.scheme || \"urn\";\n\t\tconst nid = urnComponents.nid;\n\t\tconst urnScheme = `${scheme}:${options.nid || nid}`;\n\t\tconst schemeHandler = SCHEMES[urnScheme];\n\n\t\tif (schemeHandler) {\n\t\t\turnComponents = schemeHandler.serialize(urnComponents, options) as URNComponents;\n\t\t}\n\n\t\tconst uriComponents = urnComponents as URIComponents;\n\t\tconst nss = urnComponents.nss;\n\t\turiComponents.path = `${nid || options.nid}:${nss}`;\n\n\t\treturn uriComponents;\n\t},\n};\n\nexport default handler;","import { URISchemeHandler, URIComponents, URIOptions } from \"../uri\";\nimport { URNComponents } from \"./urn\";\nimport { SCHEMES } from \"../uri\";\n\nexport interface UUIDComponents extends URNComponents {\n\tuuid?: string;\n}\n\nconst UUID = /^[0-9A-Fa-f]{8}(?:\\-[0-9A-Fa-f]{4}){3}\\-[0-9A-Fa-f]{12}$/;\nconst UUID_PARSE = /^[0-9A-Fa-f\\-]{36}/;\n\n//RFC 4122\nconst handler:URISchemeHandler = {\n\tscheme : \"urn:uuid\",\n\n\tparse : function (urnComponents:URNComponents, options:URIOptions):UUIDComponents {\n\t\tconst uuidComponents = urnComponents as UUIDComponents;\n\t\tuuidComponents.uuid = uuidComponents.nss;\n\t\tuuidComponents.nss = undefined;\n\n\t\tif (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) {\n\t\t\tuuidComponents.error = uuidComponents.error || \"UUID is not valid.\";\n\t\t}\n\n\t\treturn uuidComponents;\n\t},\n\n\tserialize : function (uuidComponents:UUIDComponents, options:URIOptions):URNComponents {\n\t\tconst urnComponents = uuidComponents as URNComponents;\n\t\t//normalize UUID\n\t\turnComponents.nss = (uuidComponents.uuid || \"\").toLowerCase();\n\t\treturn urnComponents;\n\t},\n};\n\nexport default handler;","import { SCHEMES } from \"./uri\";\n\nimport http from \"./schemes/http\";\nSCHEMES[http.scheme] = http;\n\nimport https from \"./schemes/https\";\nSCHEMES[https.scheme] = https;\n\nimport ws from \"./schemes/ws\";\nSCHEMES[ws.scheme] = ws;\n\nimport wss from \"./schemes/wss\";\nSCHEMES[wss.scheme] = wss;\n\nimport mailto from \"./schemes/mailto\";\nSCHEMES[mailto.scheme] = mailto;\n\nimport urn from \"./schemes/urn\";\nSCHEMES[urn.scheme] = urn;\n\nimport uuid from \"./schemes/urn-uuid\";\nSCHEMES[uuid.scheme] = uuid;\n\nexport * from \"./uri\";\n"]} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.d.ts new file mode 100644 index 0000000..f6be760 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.d.ts @@ -0,0 +1 @@ +export * from "./uri"; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.js new file mode 100644 index 0000000..e3531b5 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.js @@ -0,0 +1,17 @@ +import { SCHEMES } from "./uri"; +import http from "./schemes/http"; +SCHEMES[http.scheme] = http; +import https from "./schemes/https"; +SCHEMES[https.scheme] = https; +import ws from "./schemes/ws"; +SCHEMES[ws.scheme] = ws; +import wss from "./schemes/wss"; +SCHEMES[wss.scheme] = wss; +import mailto from "./schemes/mailto"; +SCHEMES[mailto.scheme] = mailto; +import urn from "./schemes/urn"; +SCHEMES[urn.scheme] = urn; +import uuid from "./schemes/urn-uuid"; +SCHEMES[uuid.scheme] = uuid; +export * from "./uri"; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.js.map new file mode 100644 index 0000000..0971f6e --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,IAAI,MAAM,gBAAgB,CAAC;AAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;AAE9B,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9B,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;AAExB,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEhC,OAAO,GAAG,MAAM,eAAe,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAE1B,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAE5B,cAAc,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.d.ts new file mode 100644 index 0000000..c91cdac --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.d.ts @@ -0,0 +1,3 @@ +import { URIRegExps } from "./uri"; +declare const _default: URIRegExps; +export default _default; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.js new file mode 100644 index 0000000..34e7de9 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.js @@ -0,0 +1,3 @@ +import { buildExps } from "./regexps-uri"; +export default buildExps(true); +//# sourceMappingURL=regexps-iri.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.js.map new file mode 100644 index 0000000..2269c58 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-iri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"regexps-iri.js","sourceRoot":"","sources":["../../src/regexps-iri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,eAAe,SAAS,CAAC,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.d.ts new file mode 100644 index 0000000..6096bda --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.d.ts @@ -0,0 +1,4 @@ +import { URIRegExps } from "./uri"; +export declare function buildExps(isIRI: boolean): URIRegExps; +declare const _default: URIRegExps; +export default _default; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.js new file mode 100644 index 0000000..1cc659f --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.js @@ -0,0 +1,42 @@ +import { merge, subexp } from "./util"; +export function buildExps(isIRI) { + const ALPHA$$ = "[A-Za-z]", CR$ = "[\\x0D]", DIGIT$$ = "[0-9]", DQUOTE$$ = "[\\x22]", HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), //case-insensitive + LF$$ = "[\\x0A]", SP$$ = "[\\x20]", PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), H16$ = subexp(HEXDIG$$ + "{1,4}"), LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), PORT$ = subexp(DIGIT$$ + "*"), AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), SEGMENT$ = subexp(PCHAR$ + "*"), SEGMENT_NZ$ = subexp(PCHAR$ + "+"), SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} +export default buildExps(false); +//# sourceMappingURL=regexps-uri.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.js.map new file mode 100644 index 0000000..cb028b8 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/regexps-uri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"regexps-uri.js","sourceRoot":"","sources":["../../src/regexps-uri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,oBAAoB,KAAa;IACtC,MACC,OAAO,GAAG,UAAU,EACpB,GAAG,GAAG,SAAS,EACf,OAAO,GAAG,OAAO,EACjB,QAAQ,GAAG,SAAS,EACpB,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,EAAG,kBAAkB;IAC1D,IAAI,GAAG,SAAS,EAChB,IAAI,GAAG,SAAS,EAChB,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,aAAa,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC,EAAG,UAAU;IACvO,YAAY,GAAG,yBAAyB,EACxC,YAAY,GAAG,qCAAqC,EACpD,UAAU,GAAG,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,EAC9C,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,6EAA6E,CAAC,CAAC,CAAC,IAAI,EAAG,0CAA0C;IACrJ,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAG,QAAQ;IAC1D,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,EACnE,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,GAAG,GAAG,CAAC,EACxE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,EACjG,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,EACnK,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,EAAG,uBAAuB;IAC3M,YAAY,GAAG,MAAM,CAAC,kBAAkB,GAAG,KAAK,GAAG,kBAAkB,GAAG,KAAK,GAAG,kBAAkB,GAAG,KAAK,GAAG,kBAAkB,CAAC,EAChI,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,EACjC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,YAAY,CAAC,EAChE,aAAa,GAAG,MAAM,CAA6D,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,8CAA8C;IACxK,aAAa,GAAG,MAAM,CAAkD,QAAQ,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,8CAA8C;IACxK,aAAa,GAAG,MAAM,CAAC,MAAM,CAAkC,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,8CAA8C;IACxK,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,8CAA8C;IACxK,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,8CAA8C;IACxK,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,SAAS,GAAU,IAAI,GAAG,KAAK,GAAY,KAAK,CAAC,EAAE,8CAA8C;IACxK,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,SAAS,GAAkC,KAAK,CAAC,EAAE,8CAA8C;IACxK,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,SAAS,GAAkC,IAAI,CAAE,EAAE,6CAA6C;IACvK,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,SAAS,CAAwC,EAAE,4BAA4B;IACtJ,YAAY,GAAG,MAAM,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACxK,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,EAAG,UAAU;IAC9E,UAAU,GAAG,MAAM,CAAC,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,EAAG,UAAU;IAClE,kBAAkB,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,EAAG,sCAAsC;IACzI,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,EAClG,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,kBAAkB,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC,EAAG,UAAU;IACrH,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,EACxF,KAAK,GAAG,MAAM,CAAC,WAAW,GAAG,GAAG,GAAG,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC,EAC5F,KAAK,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,EAC7B,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,EACxF,MAAM,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,EACnF,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,EAC/B,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,EAClC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,EACtG,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,EACtD,cAAc,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,EAAG,YAAY;IACzF,cAAc,GAAG,MAAM,CAAC,cAAc,GAAG,aAAa,CAAC,EAAG,YAAY;IACtE,cAAc,GAAG,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC,EAAG,YAAY;IACnE,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,GAAG,EAClC,KAAK,GAAG,MAAM,CAAC,aAAa,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,WAAW,CAAC,EACtH,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,EAC3E,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,EACtD,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,WAAW,CAAC,EACpI,IAAI,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,EAC5G,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,WAAW,CAAC,EACxI,SAAS,GAAG,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,EACnG,cAAc,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,SAAS,CAAC,EAC/C,aAAa,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,EAEnF,YAAY,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,aAAa,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,EAC7U,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,aAAa,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,EAC/T,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,aAAa,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,EACrS,YAAY,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,EAC5D,cAAc,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAChH;IAED,OAAO;QACN,UAAU,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC;QAC3E,YAAY,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC;QAC9E,QAAQ,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC;QAChF,QAAQ,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC;QAChF,iBAAiB,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC;QACtF,SAAS,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC;QACtG,YAAY,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC;QAC7F,MAAM,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC;QAClE,UAAU,EAAG,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;QAC1C,WAAW,EAAG,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC;QACxE,WAAW,EAAG,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC;QAC3C,WAAW,EAAG,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC;QACpD,WAAW,EAAG,IAAI,MAAM,CAAC,QAAQ,GAAG,YAAY,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAE,sCAAsC;KACrL,CAAC;AACH,CAAC;AAED,eAAe,SAAS,CAAC,KAAK,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.d.ts new file mode 100644 index 0000000..fe5b2f3 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.d.ts @@ -0,0 +1,3 @@ +import { URISchemeHandler } from "../uri"; +declare const handler: URISchemeHandler; +export default handler; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.js new file mode 100644 index 0000000..6abf0fe --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.js @@ -0,0 +1,28 @@ +const handler = { + scheme: "http", + domainHost: true, + parse: function (components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function (components, options) { + const secure = String(components.scheme).toLowerCase() === "https"; + //normalize the default port + if (components.port === (secure ? 443 : 80) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; +export default handler; +//# sourceMappingURL=http.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.js.map new file mode 100644 index 0000000..8211897 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/http.js.map @@ -0,0 +1 @@ +{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/schemes/http.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,MAAM;IAEf,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,qBAAqB;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,6BAA6B,CAAC;SACrE;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,SAAS,EAAG,UAAU,UAAwB,EAAE,OAAkB;QACjE,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;QAEnE,4BAA4B;QAC5B,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,EAAE,EAAE;YACtE,UAAU,CAAC,IAAI,GAAG,SAAS,CAAC;SAC5B;QAED,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACrB,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;SACtB;QAED,mDAAmD;QACnD,oEAAoE;QACpE,wBAAwB;QAExB,OAAO,UAAU,CAAC;IACnB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.d.ts new file mode 100644 index 0000000..fe5b2f3 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.d.ts @@ -0,0 +1,3 @@ +import { URISchemeHandler } from "../uri"; +declare const handler: URISchemeHandler; +export default handler; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.js new file mode 100644 index 0000000..ec4b6e7 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.js @@ -0,0 +1,9 @@ +import http from "./http"; +const handler = { + scheme: "https", + domainHost: http.domainHost, + parse: http.parse, + serialize: http.serialize +}; +export default handler; +//# sourceMappingURL=https.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.js.map new file mode 100644 index 0000000..385b8ef --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/https.js.map @@ -0,0 +1 @@ +{"version":3,"file":"https.js","sourceRoot":"","sources":["../../../src/schemes/https.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,OAAO;IAChB,UAAU,EAAG,IAAI,CAAC,UAAU;IAC5B,KAAK,EAAG,IAAI,CAAC,KAAK;IAClB,SAAS,EAAG,IAAI,CAAC,SAAS;CAC1B,CAAA;AAED,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts new file mode 100644 index 0000000..e2aefc2 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts @@ -0,0 +1,12 @@ +import { URISchemeHandler, URIComponents } from "../uri"; +export interface MailtoHeaders { + [hfname: string]: string; +} +export interface MailtoComponents extends URIComponents { + to: Array; + headers?: MailtoHeaders; + subject?: string; + body?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.js new file mode 100644 index 0000000..2553713 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.js @@ -0,0 +1,148 @@ +import { pctEncChar, pctDecChars, unescapeComponent } from "../uri"; +import punycode from "punycode"; +import { merge, subexp, toUpperCase, toArray } from "../util"; +const O = {}; +const isIRI = true; +//RFC 3986 +const UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +const HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +const PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +const ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +const QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +const VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +const DOT_ATOM_TEXT$ = subexp(ATEXT$$ + "+" + subexp("\\." + ATEXT$$ + "+") + "*"); +const QUOTED_PAIR$ = subexp("\\\\" + VCHAR$$); +const QCONTENT$ = subexp(QTEXT$$ + "|" + QUOTED_PAIR$); +const QUOTED_STRING$ = subexp('\\"' + QCONTENT$ + "*" + '\\"'); +//RFC 6068 +const DTEXT_NO_OBS$$ = "[\\x21-\\x5A\\x5E-\\x7E]"; //%d33-90 / %d94-126 +const SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +const QCHAR$ = subexp(UNRESERVED$$ + "|" + PCT_ENCODED$ + "|" + SOME_DELIMS$$); +const DOMAIN$ = subexp(DOT_ATOM_TEXT$ + "|" + "\\[" + DTEXT_NO_OBS$$ + "*" + "\\]"); +const LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + "|" + QUOTED_STRING$); +const ADDR_SPEC$ = subexp(LOCAL_PART$ + "\\@" + DOMAIN$); +const TO$ = subexp(ADDR_SPEC$ + subexp("\\," + ADDR_SPEC$) + "*"); +const HFNAME$ = subexp(QCHAR$ + "*"); +const HFVALUE$ = HFNAME$; +const HFIELD$ = subexp(HFNAME$ + "\\=" + HFVALUE$); +const HFIELDS2$ = subexp(HFIELD$ + subexp("\\&" + HFIELD$) + "*"); +const HFIELDS$ = subexp("\\?" + HFIELDS2$); +const MAILTO_URI = new RegExp("^mailto\\:" + TO$ + "?" + HFIELDS$ + "?$"); +const UNRESERVED = new RegExp(UNRESERVED$$, "g"); +const PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +const NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +const NOT_DOMAIN = new RegExp(merge("[^]", ATEXT$$, "[\\.]", "[\\[]", DTEXT_NO_OBS$$, "[\\]]"), "g"); +const NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +const NOT_HFVALUE = NOT_HFNAME; +const TO = new RegExp("^" + TO$ + "$"); +const HFIELDS = new RegExp("^" + HFIELDS2$ + "$"); +function decodeUnreserved(str) { + const decStr = pctDecChars(str); + return (!decStr.match(UNRESERVED) ? str : decStr); +} +const handler = { + scheme: "mailto", + parse: function (components, options) { + const mailtoComponents = components; + const to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(",") : []); + mailtoComponents.path = undefined; + if (mailtoComponents.query) { + let unknownHeaders = false; + const headers = {}; + const hfields = mailtoComponents.query.split("&"); + for (let x = 0, xl = hfields.length; x < xl; ++x) { + const hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + const toAddrs = hfield[1].split(","); + for (let x = 0, xl = toAddrs.length; x < xl; ++x) { + to.push(toAddrs[x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) + mailtoComponents.headers = headers; + } + mailtoComponents.query = undefined; + for (let x = 0, xl = to.length; x < xl; ++x) { + const addr = to[x].split("@"); + addr[0] = unescapeComponent(addr[0]); + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } + catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } + else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + to[x] = addr.join("@"); + } + return mailtoComponents; + }, + serialize: function (mailtoComponents, options) { + const components = mailtoComponents; + const to = toArray(mailtoComponents.to); + if (to) { + for (let x = 0, xl = to.length; x < xl; ++x) { + const toAddr = String(to[x]); + const atIdx = toAddr.lastIndexOf("@"); + const localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + let domain = toAddr.slice(atIdx + 1); + //convert IDN via punycode + try { + domain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain)); + } + catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + const headers = mailtoComponents.headers = mailtoComponents.headers || {}; + if (mailtoComponents.subject) + headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) + headers["body"] = mailtoComponents.body; + const fields = []; + for (const name in headers) { + if (headers[name] !== O[name]) { + fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + + "=" + + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } +}; +export default handler; +//# sourceMappingURL=mailto.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.js.map new file mode 100644 index 0000000..82dba9a --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/mailto.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mailto.js","sourceRoot":"","sources":["../../../src/schemes/mailto.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAa9D,MAAM,CAAC,GAAiB,EAAE,CAAC;AAC3B,MAAM,KAAK,GAAG,IAAI,CAAC;AAEnB,UAAU;AACV,MAAM,YAAY,GAAG,wBAAwB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,2EAA2E,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;AACjJ,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAE,kBAAkB;AACnD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,aAAa,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAE,UAAU;AAE7O,qEAAqE;AACrE,yFAAyF;AACzF,+BAA+B;AAC/B,uGAAuG;AACvG,+GAA+G;AAC/G,kCAAkC;AAClC,+BAA+B;AAC/B,wGAAwG;AACxG,8EAA8E;AAC9E,8FAA8F;AAC9F,mGAAmG;AACnG,MAAM,OAAO,GAAG,uDAAuD,CAAC;AACxE,MAAM,OAAO,GAAG,4DAA4D,CAAC;AAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACnF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;AAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,YAAY,CAAC,CAAC;AACvD,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;AAE/D,UAAU;AACV,MAAM,cAAc,GAAG,0BAA0B,CAAC,CAAE,oBAAoB;AACxE,MAAM,aAAa,GAAG,qCAAqC,CAAC;AAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,YAAY,GAAG,GAAG,GAAG,aAAa,CAAC,CAAC;AAC/E,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,GAAG,GAAG,GAAG,KAAK,GAAG,cAAc,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;AACpF,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,GAAG,GAAG,GAAG,cAAc,CAAC,CAAC;AAClE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC;AACzD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;AAClE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC,CAAC;AACnD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;AAC3C,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,YAAY,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE1E,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AAClD,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AACzF,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AACrG,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9E,MAAM,WAAW,GAAG,UAAU,CAAC;AAC/B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AACvC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC;AAElD,0BAA0B,GAAU;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,OAAO,GAAuC;IACnD,MAAM,EAAG,QAAQ;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,gBAAgB,GAAG,UAA8B,CAAC;QACxD,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjG,gBAAgB,CAAC,IAAI,GAAG,SAAS,CAAC;QAElC,IAAI,gBAAgB,CAAC,KAAK,EAAE;YAC3B,IAAI,cAAc,GAAG,KAAK,CAAA;YAC1B,MAAM,OAAO,GAAiB,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;gBACjD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAErC,QAAQ,MAAM,CAAC,CAAC,CAAC,EAAE;oBAClB,KAAK,IAAI;wBACR,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;4BACjD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;yBACpB;wBACD,MAAM;oBACP,KAAK,SAAS;wBACb,gBAAgB,CAAC,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBACjE,MAAM;oBACP,KAAK,MAAM;wBACV,gBAAgB,CAAC,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBAC9D,MAAM;oBACP;wBACC,cAAc,GAAG,IAAI,CAAC;wBACtB,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBACvF,MAAM;iBACP;aACD;YAED,IAAI,cAAc;gBAAE,gBAAgB,CAAC,OAAO,GAAG,OAAO,CAAC;SACvD;QAED,gBAAgB,CAAC,KAAK,GAAG,SAAS,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;YAC5C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAErC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;gBAC5B,kCAAkC;gBAClC,IAAI;oBACH,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;iBAC9E;gBAAC,OAAO,CAAC,EAAE;oBACX,gBAAgB,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,IAAI,0EAA0E,GAAG,CAAC,CAAC;iBAClI;aACD;iBAAM;gBACN,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;aAC5D;YAED,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB;QAED,OAAO,gBAAgB,CAAC;IACzB,CAAC;IAED,SAAS,EAAG,UAAU,gBAAiC,EAAE,OAAkB;QAC1E,MAAM,UAAU,GAAG,gBAAiC,CAAC;QACrD,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,EAAE,EAAE;YACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;gBAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;gBACxJ,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAErC,0BAA0B;gBAC1B,IAAI;oBACH,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;iBAC1H;gBAAC,OAAO,CAAC,EAAE;oBACX,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,sDAAsD,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC;iBAC7J;gBAED,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,GAAG,MAAM,CAAC;aACjC;YAED,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC/B;QAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC;QAE1E,IAAI,gBAAgB,CAAC,OAAO;YAAE,OAAO,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC;QAC5E,IAAI,gBAAgB,CAAC,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAEnE,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;YAC3B,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE;gBAC9B,MAAM,CAAC,IAAI,CACV,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;oBAC7G,GAAG;oBACH,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CACvH,CAAC;aACF;SACD;QACD,IAAI,MAAM,CAAC,MAAM,EAAE;YAClB,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACpC;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;CACD,CAAA;AAED,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts new file mode 100644 index 0000000..e75f2e7 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts @@ -0,0 +1,7 @@ +import { URISchemeHandler, URIOptions } from "../uri"; +import { URNComponents } from "./urn"; +export interface UUIDComponents extends URNComponents { + uuid?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js new file mode 100644 index 0000000..d1fce49 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js @@ -0,0 +1,23 @@ +const UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +const UUID_PARSE = /^[0-9A-Fa-f\-]{36}/; +//RFC 4122 +const handler = { + scheme: "urn:uuid", + parse: function (urnComponents, options) { + const uuidComponents = urnComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + return uuidComponents; + }, + serialize: function (uuidComponents, options) { + const urnComponents = uuidComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + }, +}; +export default handler; +//# sourceMappingURL=urn-uuid.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map new file mode 100644 index 0000000..3b7a8b3 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map @@ -0,0 +1 @@ +{"version":3,"file":"urn-uuid.js","sourceRoot":"","sources":["../../../src/schemes/urn-uuid.ts"],"names":[],"mappings":"AAQA,MAAM,IAAI,GAAG,0DAA0D,CAAC;AACxE,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,UAAU;AACV,MAAM,OAAO,GAA+D;IAC3E,MAAM,EAAG,UAAU;IAEnB,KAAK,EAAG,UAAU,aAA2B,EAAE,OAAkB;QAChE,MAAM,cAAc,GAAG,aAA+B,CAAC;QACvD,cAAc,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC;QACzC,cAAc,CAAC,GAAG,GAAG,SAAS,CAAC;QAE/B,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;YACpF,cAAc,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,IAAI,oBAAoB,CAAC;SACpE;QAED,OAAO,cAAc,CAAC;IACvB,CAAC;IAED,SAAS,EAAG,UAAU,cAA6B,EAAE,OAAkB;QACtE,MAAM,aAAa,GAAG,cAA+B,CAAC;QACtD,gBAAgB;QAChB,aAAa,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.d.ts new file mode 100644 index 0000000..7e0c2fb --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.d.ts @@ -0,0 +1,10 @@ +import { URISchemeHandler, URIComponents, URIOptions } from "../uri"; +export interface URNComponents extends URIComponents { + nid?: string; + nss?: string; +} +export interface URNOptions extends URIOptions { + nid?: string; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.js new file mode 100644 index 0000000..5d3f10a --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.js @@ -0,0 +1,49 @@ +import { SCHEMES } from "../uri"; +const NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})"; +const PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})"; +const TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]"; +const NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)"; +const URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$"); +const URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$"); +const URN_PARSE = /^([^\:]+)\:(.*)/; +const URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g; +//RFC 2141 +const handler = { + scheme: "urn", + parse: function (components, options) { + const matches = components.path && components.path.match(URN_PARSE); + let urnComponents = components; + if (matches) { + const scheme = options.scheme || urnComponents.scheme || "urn"; + const nid = matches[1].toLowerCase(); + const nss = matches[2]; + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = SCHEMES[urnScheme]; + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options); + } + } + else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + return urnComponents; + }, + serialize: function (urnComponents, options) { + const scheme = options.scheme || urnComponents.scheme || "urn"; + const nid = urnComponents.nid; + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = SCHEMES[urnScheme]; + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options); + } + const uriComponents = urnComponents; + const nss = urnComponents.nss; + uriComponents.path = `${nid || options.nid}:${nss}`; + return uriComponents; + }, +}; +export default handler; +//# sourceMappingURL=urn.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.js.map new file mode 100644 index 0000000..ea43b0b --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/urn.js.map @@ -0,0 +1 @@ +{"version":3,"file":"urn.js","sourceRoot":"","sources":["../../../src/schemes/urn.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,OAAO,EAAE,MAAM,QAAQ,CAAC;AAW7C,MAAM,IAAI,GAAG,qCAAqC,CAAC;AACnD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAC7C,MAAM,OAAO,GAAG,mEAAmE,CAAC;AACpF,MAAM,IAAI,GAAG,QAAQ,GAAG,YAAY,GAAG,GAAG,GAAG,OAAO,GAAG,KAAK,CAAC;AAC7D,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACxD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,YAAY,GAAG,iDAAiD,CAAC;AAEvE,UAAU;AACV,MAAM,OAAO,GAA8C;IAC1D,MAAM,EAAG,KAAK;IAEd,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,aAAa,GAAG,UAA2B,CAAC;QAEhD,IAAI,OAAO,EAAE;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;YAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAEzC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;YACxB,aAAa,CAAC,IAAI,GAAG,SAAS,CAAC;YAE/B,IAAI,aAAa,EAAE;gBAClB,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;aAC7E;SACD;aAAM;YACN,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,wBAAwB,CAAC;SACtE;QAED,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,SAAS,EAAG,UAAU,aAA2B,EAAE,OAAkB;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,IAAI,KAAK,CAAC;QAC/D,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,aAAa,EAAE;YAClB,aAAa,GAAG,aAAa,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,CAAkB,CAAC;SACjF;QAED,MAAM,aAAa,GAAG,aAA8B,CAAC;QACrD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,aAAa,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QAEpD,OAAO,aAAa,CAAC;IACtB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.d.ts new file mode 100644 index 0000000..47f4835 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.d.ts @@ -0,0 +1,7 @@ +import { URISchemeHandler, URIComponents } from "../uri"; +export interface WSComponents extends URIComponents { + resourceName?: string; + secure?: boolean; +} +declare const handler: URISchemeHandler; +export default handler; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.js new file mode 100644 index 0000000..9277f03 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.js @@ -0,0 +1,41 @@ +function isSecure(wsComponents) { + return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss"; +} +//RFC 6455 +const handler = { + scheme: "ws", + domainHost: true, + parse: function (components, options) { + const wsComponents = components; + //indicate if the secure flag is set + wsComponents.secure = isSecure(wsComponents); + //construct resouce name + wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : ''); + wsComponents.path = undefined; + wsComponents.query = undefined; + return wsComponents; + }, + serialize: function (wsComponents, options) { + //normalize the default port + if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") { + wsComponents.port = undefined; + } + //ensure scheme matches secure flag + if (typeof wsComponents.secure === 'boolean') { + wsComponents.scheme = (wsComponents.secure ? 'wss' : 'ws'); + wsComponents.secure = undefined; + } + //reconstruct path from resource name + if (wsComponents.resourceName) { + const [path, query] = wsComponents.resourceName.split('?'); + wsComponents.path = (path && path !== '/' ? path : undefined); + wsComponents.query = query; + wsComponents.resourceName = undefined; + } + //forbid fragment component + wsComponents.fragment = undefined; + return wsComponents; + } +}; +export default handler; +//# sourceMappingURL=ws.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.js.map new file mode 100644 index 0000000..186818c --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/ws.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../../src/schemes/ws.ts"],"names":[],"mappings":"AAOA,kBAAkB,YAAyB;IAC1C,OAAO,OAAO,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;AAC7H,CAAC;AAED,UAAU;AACV,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,IAAI;IAEb,UAAU,EAAG,IAAI;IAEjB,KAAK,EAAG,UAAU,UAAwB,EAAE,OAAkB;QAC7D,MAAM,YAAY,GAAG,UAA0B,CAAC;QAEhD,oCAAoC;QACpC,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QAE7C,wBAAwB;QACxB,YAAY,CAAC,YAAY,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9G,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;QAC9B,YAAY,CAAC,KAAK,GAAG,SAAS,CAAC;QAE/B,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,SAAS,EAAG,UAAU,YAAyB,EAAE,OAAkB;QAClE,4BAA4B;QAC5B,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,KAAK,EAAE,EAAE;YAC1F,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;SAC9B;QAED,mCAAmC;QACnC,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE;YAC7C,YAAY,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC;SAChC;QAED,qCAAqC;QACrC,IAAI,YAAY,CAAC,YAAY,EAAE;YAC9B,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3D,YAAY,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC9D,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;YAC3B,YAAY,CAAC,YAAY,GAAG,SAAS,CAAC;SACtC;QAED,2BAA2B;QAC3B,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC;QAElC,OAAO,YAAY,CAAC;IACrB,CAAC;CACD,CAAC;AAEF,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.d.ts new file mode 100644 index 0000000..fe5b2f3 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.d.ts @@ -0,0 +1,3 @@ +import { URISchemeHandler } from "../uri"; +declare const handler: URISchemeHandler; +export default handler; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.js new file mode 100644 index 0000000..d1e22cc --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.js @@ -0,0 +1,9 @@ +import ws from "./ws"; +const handler = { + scheme: "wss", + domainHost: ws.domainHost, + parse: ws.parse, + serialize: ws.serialize +}; +export default handler; +//# sourceMappingURL=wss.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.js.map new file mode 100644 index 0000000..e19006d --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/schemes/wss.js.map @@ -0,0 +1 @@ +{"version":3,"file":"wss.js","sourceRoot":"","sources":["../../../src/schemes/wss.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,MAAM,CAAC;AAEtB,MAAM,OAAO,GAAoB;IAChC,MAAM,EAAG,KAAK;IACd,UAAU,EAAG,EAAE,CAAC,UAAU;IAC1B,KAAK,EAAG,EAAE,CAAC,KAAK;IAChB,SAAS,EAAG,EAAE,CAAC,SAAS;CACxB,CAAA;AAED,eAAe,OAAO,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.d.ts new file mode 100644 index 0000000..da51e23 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.d.ts @@ -0,0 +1,59 @@ +export interface URIComponents { + scheme?: string; + userinfo?: string; + host?: string; + port?: number | string; + path?: string; + query?: string; + fragment?: string; + reference?: string; + error?: string; +} +export interface URIOptions { + scheme?: string; + reference?: string; + tolerant?: boolean; + absolutePath?: boolean; + iri?: boolean; + unicodeSupport?: boolean; + domainHost?: boolean; +} +export interface URISchemeHandler { + scheme: string; + parse(components: ParentComponents, options: Options): Components; + serialize(components: Components, options: Options): ParentComponents; + unicodeSupport?: boolean; + domainHost?: boolean; + absolutePath?: boolean; +} +export interface URIRegExps { + NOT_SCHEME: RegExp; + NOT_USERINFO: RegExp; + NOT_HOST: RegExp; + NOT_PATH: RegExp; + NOT_PATH_NOSCHEME: RegExp; + NOT_QUERY: RegExp; + NOT_FRAGMENT: RegExp; + ESCAPE: RegExp; + UNRESERVED: RegExp; + OTHER_CHARS: RegExp; + PCT_ENCODED: RegExp; + IPV4ADDRESS: RegExp; + IPV6ADDRESS: RegExp; +} +export declare const SCHEMES: { + [scheme: string]: URISchemeHandler; +}; +export declare function pctEncChar(chr: string): string; +export declare function pctDecChars(str: string): string; +export declare function parse(uriString: string, options?: URIOptions): URIComponents; +export declare function removeDotSegments(input: string): string; +export declare function serialize(components: URIComponents, options?: URIOptions): string; +export declare function resolveComponents(base: URIComponents, relative: URIComponents, options?: URIOptions, skipNormalization?: boolean): URIComponents; +export declare function resolve(baseURI: string, relativeURI: string, options?: URIOptions): string; +export declare function normalize(uri: string, options?: URIOptions): string; +export declare function normalize(uri: URIComponents, options?: URIOptions): URIComponents; +export declare function equal(uriA: string, uriB: string, options?: URIOptions): boolean; +export declare function equal(uriA: URIComponents, uriB: URIComponents, options?: URIOptions): boolean; +export declare function escapeComponent(str: string, options?: URIOptions): string; +export declare function unescapeComponent(str: string, options?: URIOptions): string; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.js new file mode 100644 index 0000000..659ce26 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.js @@ -0,0 +1,480 @@ +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +import URI_PROTOCOL from "./regexps-uri"; +import IRI_PROTOCOL from "./regexps-iri"; +import punycode from "punycode"; +import { toUpperCase, typeOf, assign } from "./util"; +export const SCHEMES = {}; +export function pctEncChar(chr) { + const c = chr.charCodeAt(0); + let e; + if (c < 16) + e = "%0" + c.toString(16).toUpperCase(); + else if (c < 128) + e = "%" + c.toString(16).toUpperCase(); + else if (c < 2048) + e = "%" + ((c >> 6) | 192).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + else + e = "%" + ((c >> 12) | 224).toString(16).toUpperCase() + "%" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + return e; +} +export function pctDecChars(str) { + let newStr = ""; + let i = 0; + const il = str.length; + while (i < il) { + const c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } + else if (c >= 194 && c < 224) { + if ((il - i) >= 6) { + const c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + } + else { + newStr += str.substr(i, 6); + } + i += 6; + } + else if (c >= 224) { + if ((il - i) >= 9) { + const c2 = parseInt(str.substr(i + 4, 2), 16); + const c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + } + else { + newStr += str.substr(i, 9); + } + i += 9; + } + else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; +} +function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + const decStr = pctDecChars(str); + return (!decStr.match(protocol.UNRESERVED) ? str : decStr); + } + if (components.scheme) + components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) + components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) + components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) + components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace((components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME), pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) + components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) + components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; +} +; +function _stripLeadingZeros(str) { + return str.replace(/^0*(.*)/, "$1") || "0"; +} +function _normalizeIPv4(host, protocol) { + const matches = host.match(protocol.IPV4ADDRESS) || []; + const [, address] = matches; + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } + else { + return host; + } +} +function _normalizeIPv6(host, protocol) { + const matches = host.match(protocol.IPV6ADDRESS) || []; + const [, address, zone] = matches; + if (address) { + const [last, first] = address.toLowerCase().split('::').reverse(); + const firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + const lastFields = last.split(":").map(_stripLeadingZeros); + const isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + const fieldCount = isLastFieldIPv4Address ? 7 : 8; + const lastFieldsStart = lastFields.length - fieldCount; + const fields = Array(fieldCount); + for (let x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + const allZeroFields = fields.reduce((acc, field, index) => { + if (!field || field === "0") { + const lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } + else { + acc.push({ index, length: 1 }); + } + } + return acc; + }, []); + const longestZeroFields = allZeroFields.sort((a, b) => b.length - a.length)[0]; + let newHost; + if (longestZeroFields && longestZeroFields.length > 1) { + const newFirst = fields.slice(0, longestZeroFields.index); + const newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } + else { + newHost = fields.join(":"); + } + if (zone) { + newHost += "%" + zone; + } + return newHost; + } + else { + return host; + } +} +const URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +const NO_MATCH_IS_UNDEFINED = ("").match(/(){0}/)[1] === undefined; +export function parse(uriString, options = {}) { + const components = {}; + const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL); + if (options.reference === "suffix") + uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + const matches = uriString.match(URI_PARSE); + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } + else { //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = (uriString.indexOf("@") !== -1 ? matches[3] : undefined); + components.host = (uriString.indexOf("//") !== -1 ? matches[4] : undefined); + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = (uriString.indexOf("?") !== -1 ? matches[7] : undefined); + components.fragment = (uriString.indexOf("#") !== -1 ? matches[8] : undefined); + //fix port number + if (isNaN(components.port)) { + components.port = (uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined); + } + } + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } + else if (components.scheme === undefined) { + components.reference = "relative"; + } + else if (components.fragment === undefined) { + components.reference = "absolute"; + } + else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost))) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } + catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } + else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } + else { + components.error = components.error || "URI can not be parsed."; + } + return components; +} +; +function _recomposeAuthority(components, options) { + const protocol = (options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL); + const uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, (_, $1, $2) => "[" + $1 + ($2 ? "%25" + $2 : "") + "]")); + } + if (typeof components.port === "number" || typeof components.port === "string") { + uriTokens.push(":"); + uriTokens.push(String(components.port)); + } + return uriTokens.length ? uriTokens.join("") : undefined; +} +; +const RDS1 = /^\.\.?\//; +const RDS2 = /^\/\.(\/|$)/; +const RDS3 = /^\/\.\.(\/|$)/; +const RDS4 = /^\.\.?$/; +const RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; +export function removeDotSegments(input) { + const output = []; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } + else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } + else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } + else if (input === "." || input === "..") { + input = ""; + } + else { + const im = input.match(RDS5); + if (im) { + const s = im[0]; + input = input.slice(s.length); + output.push(s); + } + else { + throw new Error("Unexpected dot segment condition"); + } + } + } + return output.join(""); +} +; +export function serialize(components, options = {}) { + const protocol = (options.iri ? IRI_PROTOCOL : URI_PROTOCOL); + const uriTokens = []; + //find scheme handler + const schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) + schemeHandler.serialize(components, options); + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) { + //TODO: normalize IPv6 address as per RFC 5952 + } + //if host component is a domain name + else if (options.domainHost || (schemeHandler && schemeHandler.domainHost)) { + //convert IDN via punycode + try { + components.host = (!options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host)); + } + catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + const authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + let s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(""); //merge tokens into a string +} +; +export function resolveComponents(base, relative, options = {}, skipNormalization) { + const target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } + else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } + else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } + else { + target.query = base.query; + } + } + else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } + else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } + else if (!base.path) { + target.path = relative.path; + } + else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; +} +; +export function resolve(baseURI, relativeURI, options) { + const schemelessOptions = assign({ scheme: 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +} +; +export function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } + else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; +} +; +export function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } + else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } + else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; +} +; +export function escapeComponent(str, options) { + return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE), pctEncChar); +} +; +export function unescapeComponent(str, options) { + return str && str.toString().replace((!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED), pctDecChars); +} +; +//# sourceMappingURL=uri.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.js.map new file mode 100644 index 0000000..2e72ab1 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/uri.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/uri.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAiDrD,MAAM,CAAC,MAAM,OAAO,GAAsC,EAAE,CAAC;AAE7D,MAAM,qBAAqB,GAAU;IACpC,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAQ,CAAC;IAEb,IAAI,CAAC,GAAG,EAAE;QAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;SAC/C,IAAI,CAAC,GAAG,GAAG;QAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;SACpD,IAAI,CAAC,GAAG,IAAI;QAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;;QACxH,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAE3K,OAAO,CAAC,CAAC;AACV,CAAC;AAED,MAAM,sBAAsB,GAAU;IACrC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAEtB,OAAO,CAAC,GAAG,EAAE,EAAE;QACd,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,GAAG,GAAG,EAAE;YACZ,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC,IAAI,CAAC,CAAC;SACP;aACI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE;YAC7B,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE;gBAClB,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;aAC3D;iBAAM;gBACN,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3B;YACD,CAAC,IAAI,CAAC,CAAC;SACP;aACI,IAAI,CAAC,IAAI,GAAG,EAAE;YAClB,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE;gBAClB,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;aAC/E;iBAAM;gBACN,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC3B;YACD,CAAC,IAAI,CAAC,CAAC;SACP;aACI;YACJ,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,CAAC,IAAI,CAAC,CAAC;SACP;KACD;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,qCAAqC,UAAwB,EAAE,QAAmB;IACjF,0BAA0B,GAAU;QACnC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,UAAU,CAAC,MAAM;QAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACpK,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS;QAAE,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC/N,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS;QAAE,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7N,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS;QAAE,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAClQ,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS;QAAE,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnN,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS;QAAE,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAE/N,OAAO,UAAU,CAAC;AACnB,CAAC;AAAA,CAAC;AAEF,4BAA4B,GAAU;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC;AAC5C,CAAC;AAED,wBAAwB,IAAW,EAAE,QAAmB;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,EAAE;QACZ,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC5D;SAAM;QACN,OAAO,IAAI,CAAC;KACZ;AACF,CAAC;AAED,wBAAwB,IAAW,EAAE,QAAmB;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;IAElC,IAAI,OAAO,EAAE;QACZ,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,sBAAsB,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC;QACvD,MAAM,MAAM,GAAG,KAAK,CAAS,UAAU,CAAC,CAAC;QAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,EAAE;YACpC,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,eAAe,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;SACpE;QAED,IAAI,sBAAsB,EAAE;YAC3B,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;SAC1E;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAsC,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9F,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG,EAAE;gBAC5B,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACxC,IAAI,WAAW,IAAI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,KAAK,KAAK,EAAE;oBACpE,WAAW,CAAC,MAAM,EAAE,CAAC;iBACrB;qBAAM;oBACN,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAG,CAAC,EAAE,CAAC,CAAC;iBAChC;aACD;YACD,OAAO,GAAG,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/E,IAAI,OAAc,CAAC;QACnB,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;YACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAE;YAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACjF,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACxD;aAAM;YACN,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC3B;QAED,IAAI,IAAI,EAAE;YACT,OAAO,IAAI,GAAG,GAAG,IAAI,CAAC;SACtB;QAED,OAAO,OAAO,CAAC;KACf;SAAM;QACN,OAAO,IAAI,CAAC;KACZ;AACF,CAAC;AAED,MAAM,SAAS,GAAG,iIAAiI,CAAC;AACpJ,MAAM,qBAAqB,GAAsB,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;AAEvF,MAAM,gBAAgB,SAAgB,EAAE,UAAqB,EAAE;IAC9D,MAAM,UAAU,GAAiB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAEvE,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ;QAAE,SAAS,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAEhH,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE3C,IAAI,OAAO,EAAE;QACZ,IAAI,qBAAqB,EAAE;YAC1B,sBAAsB;YACtB,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/B,UAAU,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7B,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,UAAU,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9B,UAAU,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAEjC,iBAAiB;YACjB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC3B,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;aAC7B;SACD;aAAM,EAAG,qCAAqC;YAC9C,sBAAsB;YACtB,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YAC5C,UAAU,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC/E,UAAU,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5E,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,UAAU,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5E,UAAU,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAE/E,iBAAiB;YACjB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC3B,UAAU,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aAC9F;SACD;QAED,IAAI,UAAU,CAAC,IAAI,EAAE;YACpB,oBAAoB;YACpB,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;SACtF;QAED,0BAA0B;QAC1B,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE;YACjM,UAAU,CAAC,SAAS,GAAG,eAAe,CAAC;SACvC;aAAM,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE;YAC3C,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC;SAClC;aAAM,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE;YAC7C,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC;SAClC;aAAM;YACN,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC;SAC7B;QAED,4BAA4B;QAC5B,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,EAAE;YACtG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,eAAe,GAAG,OAAO,CAAC,SAAS,GAAG,aAAa,CAAC;SAC3F;QAED,qBAAqB;QACrB,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzF,mCAAmC;QACnC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;YACjF,oCAAoC;YACpC,IAAI,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE;gBAC3F,kCAAkC;gBAClC,IAAI;oBACH,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;iBAC7G;gBAAC,OAAO,CAAC,EAAE;oBACX,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,iEAAiE,GAAG,CAAC,CAAC;iBAC7G;aACD;YACD,oBAAoB;YACpB,2BAA2B,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;SACtD;aAAM;YACN,qBAAqB;YACrB,2BAA2B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;SAClD;QAED,iCAAiC;QACjC,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,EAAE;YACzC,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;SACzC;KACD;SAAM;QACN,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,wBAAwB,CAAC;KAChE;IAED,OAAO,UAAU,CAAC;AACnB,CAAC;AAAA,CAAC;AAEF,6BAA6B,UAAwB,EAAE,OAAkB;IACxE,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACvE,MAAM,SAAS,GAAiB,EAAE,CAAC;IAEnC,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE;QACtC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACpC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACpB;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE;QAClC,qEAAqE;QACrE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;KAClL;IAED,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE;QAC/E,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;KACxC;IAED,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAAA,CAAC;AAEF,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,IAAI,GAAG,aAAa,CAAC;AAC3B,MAAM,IAAI,GAAG,eAAe,CAAC;AAC7B,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,IAAI,GAAG,wBAAwB,CAAC;AAEtC,MAAM,4BAA4B,KAAY;IAC7C,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,OAAO,KAAK,CAAC,MAAM,EAAE;QACpB,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACtB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SAChC;aAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC7B,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SACjC;aAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC7B,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,EAAE,CAAC;SACb;aAAM,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,EAAE;YAC3C,KAAK,GAAG,EAAE,CAAC;SACX;aAAM;YACN,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,EAAE,EAAE;gBACP,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACf;iBAAM;gBACN,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;aACpD;SACD;KACD;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAAA,CAAC;AAEF,MAAM,oBAAoB,UAAwB,EAAE,UAAqB,EAAE;IAC1E,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAiB,EAAE,CAAC;IAEnC,qBAAqB;IACrB,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEzF,uCAAuC;IACvC,IAAI,aAAa,IAAI,aAAa,CAAC,SAAS;QAAE,aAAa,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE3F,IAAI,UAAU,CAAC,IAAI,EAAE;QACpB,sCAAsC;QACtC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC/C,8CAA8C;SAC9C;QAED,oCAAoC;aAC/B,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE;YAC3E,0BAA0B;YAC1B,IAAI;gBACH,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;aACpK;YAAC,OAAO,CAAC,EAAE;gBACX,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,6CAA6C,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC;aACpJ;SACD;KACD;IAED,oBAAoB;IACpB,2BAA2B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAElD,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,EAAE;QACxD,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACpB;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,SAAS,KAAK,SAAS,EAAE;QAC5B,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE;YACnC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACrB;QAED,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1B,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YACzD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACpB;KACD;IAED,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE;QAClC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC;QAExB,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;YAC7E,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;SACzB;QAED,IAAI,SAAS,KAAK,SAAS,EAAE;YAC5B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAE,yCAAyC;SAC1E;QAED,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAClB;IAED,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE;QACnC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;KACjC;IAED,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE;QACtC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;KACpC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAE,4BAA4B;AACzD,CAAC;AAAA,CAAC;AAEF,MAAM,4BAA4B,IAAkB,EAAE,QAAsB,EAAE,UAAqB,EAAE,EAAE,iBAA0B;IAChI,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,IAAI,CAAC,iBAAiB,EAAE;QACvB,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAE,2BAA2B;QAC7E,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAE,+BAA+B;KACzF;IACD,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAExB,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE;QACzC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAChC,wCAAwC;QACxC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACpC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC5B,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;KAC9B;SAAM;QACN,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;YAClG,wCAAwC;YACxC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACpC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC5B,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;SAC9B;aAAM;YACN,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACnB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACxB,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE;oBACjC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;iBAC9B;qBAAM;oBACN,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;iBAC1B;aACD;iBAAM;gBACN,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;oBACpC,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;iBAC/C;qBAAM;oBACN,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;wBACtG,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;qBAClC;yBAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;wBACtB,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;qBAC5B;yBAAM;wBACN,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;qBACjF;oBACD,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;iBAC7C;gBACD,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;aAC9B;YACD,oCAAoC;YACpC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAChC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACxB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;SACxB;QACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;KAC5B;IAED,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAEpC,OAAO,MAAM,CAAC;AACf,CAAC;AAAA,CAAC;AAEF,MAAM,kBAAkB,OAAc,EAAE,WAAkB,EAAE,OAAmB;IAC9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,MAAM,EAAG,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;AAC3J,CAAC;AAAA,CAAC;AAIF,MAAM,oBAAoB,GAAO,EAAE,OAAmB;IACrD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC5B,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;KAC9C;SAAM,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;QACpC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAgB,GAAG,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;KAC7D;IAED,OAAO,GAAG,CAAC;AACZ,CAAC;AAAA,CAAC;AAIF,MAAM,gBAAgB,IAAQ,EAAE,IAAQ,EAAE,OAAmB;IAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC7B,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;KAChD;SAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;QACrC,IAAI,GAAG,SAAS,CAAgB,IAAI,EAAE,OAAO,CAAC,CAAC;KAC/C;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC7B,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;KAChD;SAAM,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE;QACrC,IAAI,GAAG,SAAS,CAAgB,IAAI,EAAE,OAAO,CAAC,CAAC;KAC/C;IAED,OAAO,IAAI,KAAK,IAAI,CAAC;AACtB,CAAC;AAAA,CAAC;AAEF,MAAM,0BAA0B,GAAU,EAAE,OAAmB;IAC9D,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AAC1H,CAAC;AAAA,CAAC;AAEF,MAAM,4BAA4B,GAAU,EAAE,OAAmB;IAChE,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;AACrI,CAAC;AAAA,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.d.ts b/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.d.ts new file mode 100644 index 0000000..7c12857 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.d.ts @@ -0,0 +1,6 @@ +export declare function merge(...sets: Array): string; +export declare function subexp(str: string): string; +export declare function typeOf(o: any): string; +export declare function toUpperCase(str: string): string; +export declare function toArray(obj: any): Array; +export declare function assign(target: object, source: any): any; diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.js b/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.js new file mode 100644 index 0000000..072711e --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.js @@ -0,0 +1,36 @@ +export function merge(...sets) { + if (sets.length > 1) { + sets[0] = sets[0].slice(0, -1); + const xl = sets.length - 1; + for (let x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } + else { + return sets[0]; + } +} +export function subexp(str) { + return "(?:" + str + ")"; +} +export function typeOf(o) { + return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase()); +} +export function toUpperCase(str) { + return str.toUpperCase(); +} +export function toArray(obj) { + return obj !== undefined && obj !== null ? (obj instanceof Array ? obj : (typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj))) : []; +} +export function assign(target, source) { + const obj = target; + if (source) { + for (const key in source) { + obj[key] = source[key]; + } + } + return obj; +} +//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.js.map b/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.js.map new file mode 100644 index 0000000..05d9df0 --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/dist/esnext/util.js.map @@ -0,0 +1 @@ +{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,IAAkB;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACrB;SAAM;QACN,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;KACf;AACF,CAAC;AAED,MAAM,iBAAiB,GAAU;IAChC,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1B,CAAC;AAED,MAAM,iBAAiB,CAAK;IAC3B,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACpJ,CAAC;AAED,MAAM,sBAAsB,GAAU;IACrC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,kBAAkB,GAAO;IAC9B,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvM,CAAC;AAGD,MAAM,iBAAiB,MAAc,EAAE,MAAW;IACjD,MAAM,GAAG,GAAG,MAAa,CAAC;IAC1B,IAAI,MAAM,EAAE;QACX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;SACvB;KACD;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"} \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/uri-js/package.json b/packages/字体精简工具/node_modules/uri-js/package.json new file mode 100644 index 0000000..7b1df9d --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/package.json @@ -0,0 +1,105 @@ +{ + "_from": "uri-js@^4.2.2", + "_id": "uri-js@4.4.1", + "_inBundle": false, + "_integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", + "_location": "/uri-js", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "uri-js@^4.2.2", + "name": "uri-js", + "escapedName": "uri-js", + "rawSpec": "^4.2.2", + "saveSpec": null, + "fetchSpec": "^4.2.2" + }, + "_requiredBy": [ + "/ajv" + ], + "_resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237586670&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz", + "_shasum": "9b1a52595225859e55f669d928f88c6c57f2a77e", + "_spec": "uri-js@^4.2.2", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\ajv", + "author": { + "name": "Gary Court", + "email": "gary.court@gmail.com" + }, + "bugs": { + "url": "https://github.com/garycourt/uri-js/issues" + }, + "bundleDependencies": false, + "dependencies": { + "punycode": "^2.1.0" + }, + "deprecated": false, + "description": "An RFC 3986/3987 compliant, scheme extendable URI/IRI parsing/validating/resolving library for JavaScript.", + "devDependencies": { + "babel-cli": "^6.26.0", + "babel-plugin-external-helpers": "^6.22.0", + "babel-preset-latest": "^6.24.1", + "mocha": "^8.2.1", + "mocha-qunit-ui": "^0.1.3", + "rollup": "^0.41.6", + "rollup-plugin-babel": "^2.7.1", + "rollup-plugin-node-resolve": "^2.0.0", + "sorcery": "^0.10.0", + "typescript": "^2.8.1", + "uglify-js": "^2.8.14" + }, + "directories": { + "test": "tests" + }, + "files": [ + "dist", + "package.json", + "yarn.lock", + "README.md", + "CHANGELOG", + "LICENSE" + ], + "homepage": "https://github.com/garycourt/uri-js", + "keywords": [ + "URI", + "IRI", + "IDN", + "URN", + "UUID", + "HTTP", + "HTTPS", + "WS", + "WSS", + "MAILTO", + "RFC3986", + "RFC3987", + "RFC5891", + "RFC2616", + "RFC2818", + "RFC2141", + "RFC4122", + "RFC4291", + "RFC5952", + "RFC6068", + "RFC6455", + "RFC6874" + ], + "license": "BSD-2-Clause", + "main": "dist/es5/uri.all.js", + "name": "uri-js", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/garycourt/uri-js.git" + }, + "scripts": { + "build": "npm run build:esnext && npm run build:es5 && npm run build:es5:min", + "build:es5": "rollup -c && cp dist/esnext/uri.d.ts dist/es5/uri.all.d.ts && npm run build:es5:fix-sourcemap", + "build:es5:fix-sourcemap": "sorcery -i dist/es5/uri.all.js", + "build:es5:min": "uglifyjs dist/es5/uri.all.js --support-ie8 --output dist/es5/uri.all.min.js --in-source-map dist/es5/uri.all.js.map --source-map uri.all.min.js.map --comments --compress --mangle --pure-funcs merge subexp && mv uri.all.min.js.map dist/es5/ && cp dist/es5/uri.all.d.ts dist/es5/uri.all.min.d.ts", + "build:esnext": "tsc", + "clean": "rm -rf dist", + "test": "mocha -u mocha-qunit-ui dist/es5/uri.all.js tests/tests.js" + }, + "types": "dist/es5/uri.all.d.ts", + "version": "4.4.1" +} diff --git a/packages/字体精简工具/node_modules/uri-js/yarn.lock b/packages/字体精简工具/node_modules/uri-js/yarn.lock new file mode 100644 index 0000000..3c42ded --- /dev/null +++ b/packages/字体精简工具/node_modules/uri-js/yarn.lock @@ -0,0 +1,2558 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@6: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-external-helpers@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz#2285f48b02bd5dede85175caf8c62e86adccefa1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-es2015@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-es2016@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz#f900bf93e2ebc0d276df9b8ab59724ebfd959f8b" + dependencies: + babel-plugin-transform-exponentiation-operator "^6.24.1" + +babel-preset-es2017@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz#597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.24.1" + +babel-preset-latest@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-latest/-/babel-preset-latest-6.24.1.tgz#677de069154a7485c2d25c577c02f624b85b85e8" + dependencies: + babel-preset-es2015 "^6.24.1" + babel-preset-es2016 "^6.24.1" + babel-preset-es2017 "^6.24.1" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-resolve@^1.11.0: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-crc32@^0.2.5: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +builtin-modules@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.11.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +debug@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +diff@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.0.0: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@7.1.6, glob@^7.1.2, glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +graceful-fs@^4.1.11, graceful-fs@^4.1.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +graceful-fs@^4.1.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.4: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha-qunit-ui@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/mocha-qunit-ui/-/mocha-qunit-ui-0.1.3.tgz#e3e1ff1dac33222b10cef681efd7f82664141ea9" + +mocha@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.2.1.tgz#f2fa68817ed0e53343d989df65ccd358bc3a4b39" + integrity sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.4.3" + debug "4.2.0" + diff "4.0.2" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "3.14.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.2" + nanoid "3.1.12" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "7.2.0" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.0.2" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanoid@3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" + integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +private@^0.1.6, private@^0.1.7, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^2.0.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +regenerate@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6: + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" + dependencies: + path-parse "^1.0.5" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@^2.5.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + dependencies: + glob "^7.1.3" + +rollup-plugin-babel@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-2.7.1.tgz#16528197b0f938a1536f44683c7a93d573182f57" + dependencies: + babel-core "6" + babel-plugin-transform-es2015-classes "^6.9.0" + object-assign "^4.1.0" + rollup-pluginutils "^1.5.0" + +rollup-plugin-node-resolve@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.1.1.tgz#cbb783b0d15b02794d58915350b2f0d902b8ddc8" + dependencies: + browser-resolve "^1.11.0" + builtin-modules "^1.1.0" + resolve "^1.1.6" + +rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + +rollup@^0.41.6: + version "0.41.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" + dependencies: + source-map-support "^0.4.0" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +sander@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" + dependencies: + es6-promise "^3.1.2" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" + +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sorcery@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" + dependencies: + buffer-crc32 "^0.2.5" + minimist "^1.2.0" + sander "^0.5.0" + sourcemap-codec "^1.3.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.0, source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +sourcemap-codec@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz#c8fd92d91889e902a07aee392bdd2c5863958ba2" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@7.2.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +typescript@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" + +uglify-js@^2.8.14: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= + dependencies: + user-home "^1.1.1" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +workerpool@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438" + integrity sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +y18n@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +yargs-parser@13.1.2, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/packages/字体精简工具/node_modules/util-deprecate/History.md b/packages/字体精简工具/node_modules/util-deprecate/History.md new file mode 100644 index 0000000..acc8675 --- /dev/null +++ b/packages/字体精简工具/node_modules/util-deprecate/History.md @@ -0,0 +1,16 @@ + +1.0.2 / 2015-10-07 +================== + + * use try/catch when checking `localStorage` (#3, @kumavis) + +1.0.1 / 2014-11-25 +================== + + * browser: use `console.warn()` for deprecation calls + * browser: more jsdocs + +1.0.0 / 2014-04-30 +================== + + * initial commit diff --git a/packages/字体精简工具/node_modules/util-deprecate/LICENSE b/packages/字体精简工具/node_modules/util-deprecate/LICENSE new file mode 100644 index 0000000..6a60e8c --- /dev/null +++ b/packages/字体精简工具/node_modules/util-deprecate/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/util-deprecate/README.md b/packages/字体精简工具/node_modules/util-deprecate/README.md new file mode 100644 index 0000000..75622fa --- /dev/null +++ b/packages/字体精简工具/node_modules/util-deprecate/README.md @@ -0,0 +1,53 @@ +util-deprecate +============== +### The Node.js `util.deprecate()` function with browser support + +In Node.js, this module simply re-exports the `util.deprecate()` function. + +In the web browser (i.e. via browserify), a browser-specific implementation +of the `util.deprecate()` function is used. + + +## API + +A `deprecate()` function is the only thing exposed by this module. + +``` javascript +// setup: +exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead'); + + +// users see: +foo(); +// foo() is deprecated, use bar() instead +foo(); +foo(); +``` + + +## License + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/util-deprecate/browser.js b/packages/字体精简工具/node_modules/util-deprecate/browser.js new file mode 100644 index 0000000..549ae2f --- /dev/null +++ b/packages/字体精简工具/node_modules/util-deprecate/browser.js @@ -0,0 +1,67 @@ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} diff --git a/packages/字体精简工具/node_modules/util-deprecate/node.js b/packages/字体精简工具/node_modules/util-deprecate/node.js new file mode 100644 index 0000000..5e6fcff --- /dev/null +++ b/packages/字体精简工具/node_modules/util-deprecate/node.js @@ -0,0 +1,6 @@ + +/** + * For Node.js, simply re-export the core `util.deprecate` function. + */ + +module.exports = require('util').deprecate; diff --git a/packages/字体精简工具/node_modules/util-deprecate/package.json b/packages/字体精简工具/node_modules/util-deprecate/package.json new file mode 100644 index 0000000..881b81d --- /dev/null +++ b/packages/字体精简工具/node_modules/util-deprecate/package.json @@ -0,0 +1,57 @@ +{ + "_from": "util-deprecate@~1.0.1", + "_id": "util-deprecate@1.0.2", + "_inBundle": false, + "_integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "_location": "/util-deprecate", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "util-deprecate@~1.0.1", + "name": "util-deprecate", + "escapedName": "util-deprecate", + "rawSpec": "~1.0.1", + "saveSpec": null, + "fetchSpec": "~1.0.1" + }, + "_requiredBy": [ + "/readable-stream", + "/through2/readable-stream" + ], + "_resolved": "https://registry.nlark.com/util-deprecate/download/util-deprecate-1.0.2.tgz", + "_shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "_spec": "util-deprecate@~1.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\readable-stream", + "author": { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/" + }, + "browser": "browser.js", + "bugs": { + "url": "https://github.com/TooTallNate/util-deprecate/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "The Node.js `util.deprecate()` function with browser support", + "homepage": "https://github.com/TooTallNate/util-deprecate", + "keywords": [ + "util", + "deprecate", + "browserify", + "browser", + "node" + ], + "license": "MIT", + "main": "node.js", + "name": "util-deprecate", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/util-deprecate.git" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "version": "1.0.2" +} diff --git a/packages/字体精简工具/node_modules/uuid/.npmignore b/packages/字体精简工具/node_modules/uuid/.npmignore new file mode 100644 index 0000000..fd4f2b0 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/.npmignore @@ -0,0 +1,2 @@ +node_modules +.DS_Store diff --git a/packages/字体精简工具/node_modules/uuid/.travis.yml b/packages/字体精简工具/node_modules/uuid/.travis.yml new file mode 100644 index 0000000..9400c11 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - "0.6" + - "0.8" + - "0.10" diff --git a/packages/字体精简工具/node_modules/uuid/LICENSE.md b/packages/字体精简工具/node_modules/uuid/LICENSE.md new file mode 100644 index 0000000..f039427 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/LICENSE.md @@ -0,0 +1,2 @@ +Copyright (c) 2010-2012 Robert Kieffer +MIT License - http://opensource.org/licenses/mit-license.php diff --git a/packages/字体精简工具/node_modules/uuid/README.md b/packages/字体精简工具/node_modules/uuid/README.md new file mode 100644 index 0000000..c04bf89 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/README.md @@ -0,0 +1,205 @@ +# uuid [![Build Status](https://secure.travis-ci.org/defunctzombie/node-uuid.svg?branch=master)](http://travis-ci.org/defunctzombie/node-uuid) # + +[![browser support](https://ci.testling.com/defunctzombie/node-uuid.png)](https://ci.testling.com/defunctzombie/node-uuid) + +Simple, fast generation of [RFC4122](http://www.ietf.org/rfc/rfc4122.txt) UUIDS. + +Features: + +* Generate RFC4122 version 1 or version 4 UUIDs +* Runs in node.js and all browsers. +* Cryptographically strong random # generation on supporting platforms +* 1185 bytes minified and gzip'ed (Want something smaller? Check this [crazy shit](https://gist.github.com/982883) out! ) +* [Annotated source code](http://broofa.github.com/node-uuid/docs/uuid.html) + +## Getting Started + +Install it in your browser: + +```html + +``` + +Or in node.js: + +``` +npm install uuid +``` + +```javascript +var uuid = require('uuid'); + +// Generate a v1 (time-based) id +uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' + +// Generate a v4 (random) id +uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' +``` + +## API + +### uuid.v1([`options` [, `buffer` [, `offset`]]]) + +Generate and return a RFC4122 v1 (timestamp-based) UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + + * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID. See note 1. + * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence. Default: An internally maintained clockseq is used. + * `msecs` - (Number | Date) Time in milliseconds since unix Epoch. Default: The current time is used. + * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2. + +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Notes: + +1. The randomly generated node id is only guaranteed to stay constant for the lifetime of the current JS runtime. (Future versions of this module may use persistent storage mechanisms to extend this guarantee.) + +Example: Generate string UUID with fully-specified options + +```javascript +uuid.v1({ + node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab], + clockseq: 0x1234, + msecs: new Date('2011-11-01').getTime(), + nsecs: 5678 +}); // -> "710b962e-041c-11e1-9234-0123456789ab" +``` + +Example: In-place generation of two binary IDs + +```javascript +// Generate two ids in an array +var arr = new Array(32); // -> [] +uuid.v1(null, arr, 0); // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15] +uuid.v1(null, arr, 16); // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15 02 a3 1c b0 14 32 11 e1 85 58 0b 48 8e 4f c1 15] + +// Optionally use uuid.unparse() to get stringify the ids +uuid.unparse(buffer); // -> '02a2ce90-1432-11e1-8558-0b488e4fc115' +uuid.unparse(buffer, 16) // -> '02a31cb0-1432-11e1-8558-0b488e4fc115' +``` + +### uuid.v4([`options` [, `buffer` [, `offset`]]]) + +Generate and return a RFC4122 v4 UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + + * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values + * `rng` - (Function) Random # generator to use. Set to one of the built-in generators - `uuid.mathRNG` (all platforms), `uuid.nodeRNG` (node.js only), `uuid.whatwgRNG` (WebKit only) - or a custom function that returns an array[16] of byte values. + +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: Generate string UUID with fully-specified options + +```javascript +uuid.v4({ + random: [ + 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea, + 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36 + ] +}); +// -> "109156be-c4fb-41ea-b1b4-efe1671c5836" +``` + +Example: Generate two IDs in a single buffer + +```javascript +var buffer = new Array(32); // (or 'new Buffer' in node.js) +uuid.v4(null, buffer, 0); +uuid.v4(null, buffer, 16); +``` + +### uuid.parse(id[, buffer[, offset]]) +### uuid.unparse(buffer[, offset]) + +Parse and unparse UUIDs + + * `id` - (String) UUID(-like) string + * `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. Default: A new Array or Buffer is used + * `offset` - (Number) Starting index in `buffer` at which to begin writing. Default: 0 + +Example parsing and unparsing a UUID string + +```javascript +var bytes = uuid.parse('797ff043-11eb-11e1-80d6-510998755d10'); // -> +var string = uuid.unparse(bytes); // -> '797ff043-11eb-11e1-80d6-510998755d10' +``` + +### uuid.noConflict() + +(Browsers only) Set `uuid` property back to it's previous value. + +Returns the uuid object. + +Example: + +```javascript +var myUuid = uuid.noConflict(); +myUuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' +``` + +## Deprecated APIs + +Support for the following v1.2 APIs is available in v1.3, but is deprecated and will be removed in the next major version. + +### uuid([format [, buffer [, offset]]]) + +uuid() has become uuid.v4(), and the `format` argument is now implicit in the `buffer` argument. (i.e. if you specify a buffer, the format is assumed to be binary). + +## Testing + +In node.js + +``` +> cd test +> node test.js +``` + +In Browser + +``` +open test/test.html +``` + +### Benchmarking + +Requires node.js + +``` +cd benchmark/ +npm install +node benchmark.js +``` + +For a more complete discussion of uuid performance, please see the `benchmark/README.md` file, and the [benchmark wiki](https://github.com/broofa/uuid/wiki/Benchmark) + +For browser performance [checkout the JSPerf tests](http://jsperf.com/node-uuid-performance). + +## Release notes + +### 2.0.0 + +* Removed uuid.BufferClass + +### 1.4.0 + +* Improved module context detection +* Removed public RNG functions + +### 1.3.2 + +* Improve tests and handling of v1() options (Issue #24) +* Expose RNG option to allow for perf testing with different generators + +### 1.3.0 + +* Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)! +* Support for node.js crypto API +* De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code diff --git a/packages/字体精简工具/node_modules/uuid/benchmark/README.md b/packages/字体精简工具/node_modules/uuid/benchmark/README.md new file mode 100644 index 0000000..aaeb2ea --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/benchmark/README.md @@ -0,0 +1,53 @@ +# node-uuid Benchmarks + +### Results + +To see the results of our benchmarks visit https://github.com/broofa/node-uuid/wiki/Benchmark + +### Run them yourself + +node-uuid comes with some benchmarks to measure performance of generating UUIDs. These can be run using node.js. node-uuid is being benchmarked against some other uuid modules, that are available through npm namely `uuid` and `uuid-js`. + +To prepare and run the benchmark issue; + +``` +npm install uuid uuid-js +node benchmark/benchmark.js +``` + +You'll see an output like this one: + +``` +# v4 +nodeuuid.v4(): 854700 uuids/second +nodeuuid.v4('binary'): 788643 uuids/second +nodeuuid.v4('binary', buffer): 1336898 uuids/second +uuid(): 479386 uuids/second +uuid('binary'): 582072 uuids/second +uuidjs.create(4): 312304 uuids/second + +# v1 +nodeuuid.v1(): 938086 uuids/second +nodeuuid.v1('binary'): 683060 uuids/second +nodeuuid.v1('binary', buffer): 1644736 uuids/second +uuidjs.create(1): 190621 uuids/second +``` + +* The `uuid()` entries are for Nikhil Marathe's [uuid module](https://bitbucket.org/nikhilm/uuidjs) which is a wrapper around the native libuuid library. +* The `uuidjs()` entries are for Patrick Negri's [uuid-js module](https://github.com/pnegri/uuid-js) which is a pure javascript implementation based on [UUID.js](https://github.com/LiosK/UUID.js) by LiosK. + +If you want to get more reliable results you can run the benchmark multiple times and write the output into a log file: + +``` +for i in {0..9}; do node benchmark/benchmark.js >> benchmark/bench_0.4.12.log; done; +``` + +If you're interested in how performance varies between different node versions, you can issue the above command multiple times. + +You can then use the shell script `bench.sh` provided in this directory to calculate the averages over all benchmark runs and draw a nice plot: + +``` +(cd benchmark/ && ./bench.sh) +``` + +This assumes you have [gnuplot](http://www.gnuplot.info/) and [ImageMagick](http://www.imagemagick.org/) installed. You'll find a nice `bench.png` graph in the `benchmark/` directory then. diff --git a/packages/字体精简工具/node_modules/uuid/benchmark/bench.gnu b/packages/字体精简工具/node_modules/uuid/benchmark/bench.gnu new file mode 100644 index 0000000..a342fbb --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/benchmark/bench.gnu @@ -0,0 +1,174 @@ +#!/opt/local/bin/gnuplot -persist +# +# +# G N U P L O T +# Version 4.4 patchlevel 3 +# last modified March 2011 +# System: Darwin 10.8.0 +# +# Copyright (C) 1986-1993, 1998, 2004, 2007-2010 +# Thomas Williams, Colin Kelley and many others +# +# gnuplot home: http://www.gnuplot.info +# faq, bugs, etc: type "help seeking-assistance" +# immediate help: type "help" +# plot window: hit 'h' +set terminal postscript eps noenhanced defaultplex \ + leveldefault color colortext \ + solid linewidth 1.2 butt noclip \ + palfuncparam 2000,0.003 \ + "Helvetica" 14 +set output 'bench.eps' +unset clip points +set clip one +unset clip two +set bar 1.000000 front +set border 31 front linetype -1 linewidth 1.000 +set xdata +set ydata +set zdata +set x2data +set y2data +set timefmt x "%d/%m/%y,%H:%M" +set timefmt y "%d/%m/%y,%H:%M" +set timefmt z "%d/%m/%y,%H:%M" +set timefmt x2 "%d/%m/%y,%H:%M" +set timefmt y2 "%d/%m/%y,%H:%M" +set timefmt cb "%d/%m/%y,%H:%M" +set boxwidth +set style fill empty border +set style rectangle back fc lt -3 fillstyle solid 1.00 border lt -1 +set style circle radius graph 0.02, first 0, 0 +set dummy x,y +set format x "% g" +set format y "% g" +set format x2 "% g" +set format y2 "% g" +set format z "% g" +set format cb "% g" +set angles radians +unset grid +set key title "" +set key outside left top horizontal Right noreverse enhanced autotitles columnhead nobox +set key noinvert samplen 4 spacing 1 width 0 height 0 +set key maxcolumns 2 maxrows 0 +unset label +unset arrow +set style increment default +unset style line +set style line 1 linetype 1 linewidth 2.000 pointtype 1 pointsize default pointinterval 0 +unset style arrow +set style histogram clustered gap 2 title offset character 0, 0, 0 +unset logscale +set offsets graph 0.05, 0.15, 0, 0 +set pointsize 1.5 +set pointintervalbox 1 +set encoding default +unset polar +unset parametric +unset decimalsign +set view 60, 30, 1, 1 +set samples 100, 100 +set isosamples 10, 10 +set surface +unset contour +set clabel '%8.3g' +set mapping cartesian +set datafile separator whitespace +unset hidden3d +set cntrparam order 4 +set cntrparam linear +set cntrparam levels auto 5 +set cntrparam points 5 +set size ratio 0 1,1 +set origin 0,0 +set style data points +set style function lines +set xzeroaxis linetype -2 linewidth 1.000 +set yzeroaxis linetype -2 linewidth 1.000 +set zzeroaxis linetype -2 linewidth 1.000 +set x2zeroaxis linetype -2 linewidth 1.000 +set y2zeroaxis linetype -2 linewidth 1.000 +set ticslevel 0.5 +set mxtics default +set mytics default +set mztics default +set mx2tics default +set my2tics default +set mcbtics default +set xtics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 +set xtics norangelimit +set xtics () +set ytics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 +set ytics autofreq norangelimit +set ztics border in scale 1,0.5 nomirror norotate offset character 0, 0, 0 +set ztics autofreq norangelimit +set nox2tics +set noy2tics +set cbtics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 +set cbtics autofreq norangelimit +set title "" +set title offset character 0, 0, 0 font "" norotate +set timestamp bottom +set timestamp "" +set timestamp offset character 0, 0, 0 font "" norotate +set rrange [ * : * ] noreverse nowriteback # (currently [8.98847e+307:-8.98847e+307] ) +set autoscale rfixmin +set autoscale rfixmax +set trange [ * : * ] noreverse nowriteback # (currently [-5.00000:5.00000] ) +set autoscale tfixmin +set autoscale tfixmax +set urange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) +set autoscale ufixmin +set autoscale ufixmax +set vrange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) +set autoscale vfixmin +set autoscale vfixmax +set xlabel "" +set xlabel offset character 0, 0, 0 font "" textcolor lt -1 norotate +set x2label "" +set x2label offset character 0, 0, 0 font "" textcolor lt -1 norotate +set xrange [ * : * ] noreverse nowriteback # (currently [-0.150000:3.15000] ) +set autoscale xfixmin +set autoscale xfixmax +set x2range [ * : * ] noreverse nowriteback # (currently [0.00000:3.00000] ) +set autoscale x2fixmin +set autoscale x2fixmax +set ylabel "" +set ylabel offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 +set y2label "" +set y2label offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 +set yrange [ 0.00000 : 1.90000e+06 ] noreverse nowriteback # (currently [:] ) +set autoscale yfixmin +set autoscale yfixmax +set y2range [ * : * ] noreverse nowriteback # (currently [0.00000:1.90000e+06] ) +set autoscale y2fixmin +set autoscale y2fixmax +set zlabel "" +set zlabel offset character 0, 0, 0 font "" textcolor lt -1 norotate +set zrange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) +set autoscale zfixmin +set autoscale zfixmax +set cblabel "" +set cblabel offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 +set cbrange [ * : * ] noreverse nowriteback # (currently [8.98847e+307:-8.98847e+307] ) +set autoscale cbfixmin +set autoscale cbfixmax +set zero 1e-08 +set lmargin -1 +set bmargin -1 +set rmargin -1 +set tmargin -1 +set pm3d explicit at s +set pm3d scansautomatic +set pm3d interpolate 1,1 flush begin noftriangles nohidden3d corners2color mean +set palette positive nops_allcF maxcolors 0 gamma 1.5 color model RGB +set palette rgbformulae 7, 5, 15 +set colorbox default +set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.05, 0.6, 0 front bdefault +set loadpath +set fontpath +set fit noerrorvariables +GNUTERM = "aqua" +plot 'bench_results.txt' using 2:xticlabel(1) w lp lw 2, '' using 3:xticlabel(1) w lp lw 2, '' using 4:xticlabel(1) w lp lw 2, '' using 5:xticlabel(1) w lp lw 2, '' using 6:xticlabel(1) w lp lw 2, '' using 7:xticlabel(1) w lp lw 2, '' using 8:xticlabel(1) w lp lw 2, '' using 9:xticlabel(1) w lp lw 2 +# EOF diff --git a/packages/字体精简工具/node_modules/uuid/benchmark/bench.sh b/packages/字体精简工具/node_modules/uuid/benchmark/bench.sh new file mode 100644 index 0000000..d870a0c --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/benchmark/bench.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# for a given node version run: +# for i in {0..9}; do node benchmark.js >> bench_0.6.2.log; done; + +PATTERNS=('nodeuuid.v1()' "nodeuuid.v1('binary'," 'nodeuuid.v4()' "nodeuuid.v4('binary'," "uuid()" "uuid('binary')" 'uuidjs.create(1)' 'uuidjs.create(4)' '140byte') +FILES=(node_uuid_v1_string node_uuid_v1_buf node_uuid_v4_string node_uuid_v4_buf libuuid_v4_string libuuid_v4_binary uuidjs_v1_string uuidjs_v4_string 140byte_es) +INDICES=(2 3 2 3 2 2 2 2 2) +VERSIONS=$( ls bench_*.log | sed -e 's/^bench_\([0-9\.]*\)\.log/\1/' | tr "\\n" " " ) +TMPJOIN="tmp_join" +OUTPUT="bench_results.txt" + +for I in ${!FILES[*]}; do + F=${FILES[$I]} + P=${PATTERNS[$I]} + INDEX=${INDICES[$I]} + echo "version $F" > $F + for V in $VERSIONS; do + (VAL=$( grep "$P" bench_$V.log | LC_ALL=en_US awk '{ sum += $'$INDEX' } END { print sum/NR }' ); echo $V $VAL) >> $F + done + if [ $I == 0 ]; then + cat $F > $TMPJOIN + else + join $TMPJOIN $F > $OUTPUT + cp $OUTPUT $TMPJOIN + fi + rm $F +done + +rm $TMPJOIN + +gnuplot bench.gnu +convert -density 200 -resize 800x560 -flatten bench.eps bench.png +rm bench.eps diff --git a/packages/字体精简工具/node_modules/uuid/benchmark/benchmark-native.c b/packages/字体精简工具/node_modules/uuid/benchmark/benchmark-native.c new file mode 100644 index 0000000..dbfc75f --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/benchmark/benchmark-native.c @@ -0,0 +1,34 @@ +/* +Test performance of native C UUID generation + +To Compile: cc -luuid benchmark-native.c -o benchmark-native +*/ + +#include +#include +#include +#include + +int main() { + uuid_t myid; + char buf[36+1]; + int i; + struct timeval t; + double start, finish; + + gettimeofday(&t, NULL); + start = t.tv_sec + t.tv_usec/1e6; + + int n = 2e5; + for (i = 0; i < n; i++) { + uuid_generate(myid); + uuid_unparse(myid, buf); + } + + gettimeofday(&t, NULL); + finish = t.tv_sec + t.tv_usec/1e6; + double dur = finish - start; + + printf("%d uuids/sec", (int)(n/dur)); + return 0; +} diff --git a/packages/字体精简工具/node_modules/uuid/benchmark/benchmark.js b/packages/字体精简工具/node_modules/uuid/benchmark/benchmark.js new file mode 100644 index 0000000..40e6efb --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/benchmark/benchmark.js @@ -0,0 +1,84 @@ +try { + var nodeuuid = require('../uuid'); +} catch (e) { + console.error('node-uuid require failed - skipping tests'); +} + +try { + var uuid = require('uuid'); +} catch (e) { + console.error('uuid require failed - skipping tests'); +} + +try { + var uuidjs = require('uuid-js'); +} catch (e) { + console.error('uuid-js require failed - skipping tests'); +} + +var N = 5e5; + +function rate(msg, t) { + console.log(msg + ': ' + + (N / (Date.now() - t) * 1e3 | 0) + + ' uuids/second'); +} + +console.log('# v4'); + +// node-uuid - string form +if (nodeuuid) { + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4(); + rate('nodeuuid.v4() - using node.js crypto RNG', t); + + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4({rng: nodeuuid.mathRNG}); + rate('nodeuuid.v4() - using Math.random() RNG', t); + + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary'); + rate('nodeuuid.v4(\'binary\')', t); + + var buffer = new nodeuuid.BufferClass(16); + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary', buffer); + rate('nodeuuid.v4(\'binary\', buffer)', t); +} + +// libuuid - string form +if (uuid) { + for (var i = 0, t = Date.now(); i < N; i++) uuid(); + rate('uuid()', t); + + for (var i = 0, t = Date.now(); i < N; i++) uuid('binary'); + rate('uuid(\'binary\')', t); +} + +// uuid-js - string form +if (uuidjs) { + for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(4); + rate('uuidjs.create(4)', t); +} + +// 140byte.es +for (var i = 0, t = Date.now(); i < N; i++) 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(s,r){r=Math.random()*16|0;return (s=='x'?r:r&0x3|0x8).toString(16)}); +rate('140byte.es_v4', t); + +console.log(''); +console.log('# v1'); + +// node-uuid - v1 string form +if (nodeuuid) { + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1(); + rate('nodeuuid.v1()', t); + + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary'); + rate('nodeuuid.v1(\'binary\')', t); + + var buffer = new nodeuuid.BufferClass(16); + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary', buffer); + rate('nodeuuid.v1(\'binary\', buffer)', t); +} + +// uuid-js - v1 string form +if (uuidjs) { + for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(1); + rate('uuidjs.create(1)', t); +} diff --git a/packages/字体精简工具/node_modules/uuid/benchmark/package.json b/packages/字体精简工具/node_modules/uuid/benchmark/package.json new file mode 100644 index 0000000..94e0b59 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/benchmark/package.json @@ -0,0 +1,9 @@ +{ + "name": "benchmark-uuid", + "private": true, + "description": "Benchmarks for node-uuid", + "dependencies": { + "uuid": "1.4.1", + "uuid-js": "0.7.4" + } +} diff --git a/packages/字体精简工具/node_modules/uuid/misc/compare.js b/packages/字体精简工具/node_modules/uuid/misc/compare.js new file mode 100644 index 0000000..3de3415 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/misc/compare.js @@ -0,0 +1,62 @@ +var assert = require('assert'), + nodeuuid = require('../'), + uuidjs = require('uuid-js'), + util = require('util'), + exec = require('child_process').exec, + os = require('os'); + +// On Mac Os X / macports there's only the ossp-uuid package that provides uuid +// On Linux there's uuid-runtime which provides uuidgen +var uuidCmd = os.type() === 'Darwin' ? 'uuid -1' : 'uuidgen -t'; + +function compare(ids) { + console.log(ids); + for (var i = 0; i < ids.length; i++) { + var id = ids[i].split('-'); + id = [id[2], id[1], id[0]].join(''); + ids[i] = id; + } + var sorted = ([].concat(ids)).sort(); + + if (sorted.toString() !== ids.toString()) { + console.log('Warning: sorted !== ids'); + } else { + console.log('everything in order!'); + } +} + +// Test time order of v1 uuids +var ids = []; +while (ids.length < 10e3) ids.push(nodeuuid.v1()); + +var max = 10; +console.log('node-uuid:'); +ids = []; +for (var i = 0; i < max; i++) ids.push(nodeuuid.v1()); +compare(ids); + +console.log(''); +console.log('uuidjs:'); +ids = []; +for (var i = 0; i < max; i++) ids.push(uuidjs.create(1).toString()); +compare(ids); + +console.log(''); +console.log('libuuid:'); +ids = []; +var count = 0; +var last = function() { + compare(ids); +} +var cb = function(err, stdout, stderr) { + ids.push(stdout.substring(0, stdout.length-1)); + count++; + if (count < max) { + return next(); + } + last(); +}; +var next = function() { + exec(uuidCmd, cb); +}; +next(); diff --git a/packages/字体精简工具/node_modules/uuid/misc/perf.js b/packages/字体精简工具/node_modules/uuid/misc/perf.js new file mode 100644 index 0000000..bdc9eb4 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/misc/perf.js @@ -0,0 +1,102 @@ +var assert = require('assert'); + +var uuid = require('../'); + +var log = console.log; + +var generators = { + v1: uuid.v1, + v4: uuid.v4 +}; + +var UUID_FORMAT = { + v1: /[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i, + v4: /[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i +}; + +var N = 1e4; + +// Get %'age an actual value differs from the ideal value +function divergence(actual, ideal) { + return Math.round(100*100*(actual - ideal)/ideal)/100; +} + +function rate(msg, t) { + log(msg + ': ' + (N / (Date.now() - t) * 1e3 | 0) + ' uuids\/second'); +} + +for (var version in generators) { + var counts = {}, max = 0; + var generator = generators[version]; + var format = UUID_FORMAT[version]; + + log('\nSanity check ' + N + ' ' + version + ' uuids'); + for (var i = 0, ok = 0; i < N; i++) { + id = generator(); + if (!format.test(id)) { + throw Error(id + ' is not a valid UUID string'); + } + + if (id != uuid.unparse(uuid.parse(id))) { + assert(fail, id + ' is not a valid id'); + } + + // Count digits for our randomness check + if (version == 'v4') { + var digits = id.replace(/-/g, '').split(''); + for (var j = digits.length-1; j >= 0; j--) { + var c = digits[j]; + max = Math.max(max, counts[c] = (counts[c] || 0) + 1); + } + } + } + + // Check randomness for v4 UUIDs + if (version == 'v4') { + // Limit that we get worried about randomness. (Purely empirical choice, this!) + var limit = 2*100*Math.sqrt(1/N); + + log('\nChecking v4 randomness. Distribution of Hex Digits (% deviation from ideal)'); + + for (var i = 0; i < 16; i++) { + var c = i.toString(16); + var bar = '', n = counts[c], p = Math.round(n/max*100|0); + + // 1-3,5-8, and D-F: 1:16 odds over 30 digits + var ideal = N*30/16; + if (i == 4) { + // 4: 1:1 odds on 1 digit, plus 1:16 odds on 30 digits + ideal = N*(1 + 30/16); + } else if (i >= 8 && i <= 11) { + // 8-B: 1:4 odds on 1 digit, plus 1:16 odds on 30 digits + ideal = N*(1/4 + 30/16); + } else { + // Otherwise: 1:16 odds on 30 digits + ideal = N*30/16; + } + var d = divergence(n, ideal); + + // Draw bar using UTF squares (just for grins) + var s = n/max*50 | 0; + while (s--) bar += '='; + + assert(Math.abs(d) < limit, c + ' |' + bar + '| ' + counts[c] + ' (' + d + '% < ' + limit + '%)'); + } + } +} + +// Perf tests +for (var version in generators) { + log('\nPerformance testing ' + version + ' UUIDs'); + var generator = generators[version]; + var buf = new uuid.BufferClass(16); + + for (var i = 0, t = Date.now(); i < N; i++) generator(); + rate('uuid.' + version + '()', t); + + for (var i = 0, t = Date.now(); i < N; i++) generator('binary'); + rate('uuid.' + version + '(\'binary\')', t); + + for (var i = 0, t = Date.now(); i < N; i++) generator('binary', buf); + rate('uuid.' + version + '(\'binary\', buffer)', t); +} diff --git a/packages/字体精简工具/node_modules/uuid/package.json b/packages/字体精简工具/node_modules/uuid/package.json new file mode 100644 index 0000000..42ef395 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/package.json @@ -0,0 +1,78 @@ +{ + "_from": "uuid@^2.0.1", + "_id": "uuid@2.0.3", + "_inBundle": false, + "_integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "_location": "/uuid", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "uuid@^2.0.1", + "name": "uuid", + "escapedName": "uuid", + "rawSpec": "^2.0.1", + "saveSpec": null, + "fetchSpec": "^2.0.1" + }, + "_requiredBy": [ + "/buffer-to-vinyl" + ], + "_resolved": "https://registry.npm.taobao.org/uuid/download/uuid-2.0.3.tgz", + "_shasum": "67e2e863797215530dff318e5bf9dcebfd47b21a", + "_spec": "uuid@^2.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\buffer-to-vinyl", + "author": { + "name": "Robert Kieffer", + "email": "robert@broofa.com" + }, + "browser": { + "./rng.js": "./rng-browser.js" + }, + "bugs": { + "url": "https://github.com/defunctzombie/node-uuid/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Christoph Tavan", + "email": "dev@tavan.de" + }, + { + "name": "Vincent Voyer", + "email": "vincent@zeroload.net" + } + ], + "deprecated": false, + "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.", + "devDependencies": { + "mocha": "1.8.0" + }, + "homepage": "https://github.com/defunctzombie/node-uuid#readme", + "keywords": [ + "uuid", + "guid", + "rfc4122" + ], + "license": "MIT", + "main": "./uuid.js", + "name": "uuid", + "repository": { + "type": "git", + "url": "git+https://github.com/defunctzombie/node-uuid.git" + }, + "scripts": { + "test": "mocha test/test.js" + }, + "testling": { + "browsers": [ + "ie6..latest", + "firefox/3.6..latest", + "chrome/22..latest", + "safari/5.1..latest" + ], + "harness": "mocha-tdd", + "files": "test/*.js" + }, + "version": "2.0.3" +} diff --git a/packages/字体精简工具/node_modules/uuid/rng-browser.js b/packages/字体精简工具/node_modules/uuid/rng-browser.js new file mode 100644 index 0000000..82ffaf6 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/rng-browser.js @@ -0,0 +1,32 @@ + +var rng; + +var crypto = global.crypto || global.msCrypto; // for IE 11 +if (crypto && crypto.getRandomValues) { + // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto + // Moderately fast, high quality + var _rnds8 = new Uint8Array(16); + rng = function whatwgRNG() { + crypto.getRandomValues(_rnds8); + return _rnds8; + }; +} + +if (!rng) { + // Math.random()-based (RNG) + // + // If all else fails, use Math.random(). It's fast, but is of unspecified + // quality. + var _rnds = new Array(16); + rng = function() { + for (var i = 0, r; i < 16; i++) { + if ((i & 0x03) === 0) r = Math.random() * 0x100000000; + _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return _rnds; + }; +} + +module.exports = rng; + diff --git a/packages/字体精简工具/node_modules/uuid/rng.js b/packages/字体精简工具/node_modules/uuid/rng.js new file mode 100644 index 0000000..3977f79 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/rng.js @@ -0,0 +1,4 @@ +var rb = require('crypto').randomBytes; +module.exports = function() { + return rb(16); +}; diff --git a/packages/字体精简工具/node_modules/uuid/test/mocha.opts b/packages/字体精简工具/node_modules/uuid/test/mocha.opts new file mode 100644 index 0000000..e2bfcc5 --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/test/mocha.opts @@ -0,0 +1 @@ +--ui qunit diff --git a/packages/字体精简工具/node_modules/uuid/test/test.js b/packages/字体精简工具/node_modules/uuid/test/test.js new file mode 100644 index 0000000..4c9872f --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/test/test.js @@ -0,0 +1,105 @@ +var assert = require('assert'); + +var uuid = require('../'); + +// Verify ordering of v1 ids created with explicit times +var TIME = 1321644961388; // 2011-11-18 11:36:01.388-08:00 + +function compare(name, ids) { + test(name, function() { + // avoid .map for older browsers + for (var i=0 ; i 10k ids created in 1ms', function() { + // Verify throw if too many ids created + var thrown = false; + try { + uuid.v1({msecs: TIME, nsecs: 10000}); + } catch (e) { + thrown = true; + } + assert(thrown, 'Exception thrown when > 10K ids created in 1 ms'); +}); + +test('clock regression by msec', function() { + // Verify clock regression bumps clockseq + var uidt = uuid.v1({msecs: TIME}); + var uidtb = uuid.v1({msecs: TIME - 1}); + assert( + parseInt(uidtb.split('-')[3], 16) - parseInt(uidt.split('-')[3], 16) === 1, + 'Clock regression by msec increments the clockseq' + ); +}); + +test('clock regression by nsec', function() { + // Verify clock regression bumps clockseq + var uidtn = uuid.v1({msecs: TIME, nsecs: 10}); + var uidtnb = uuid.v1({msecs: TIME, nsecs: 9}); + assert( + parseInt(uidtnb.split('-')[3], 16) - parseInt(uidtn.split('-')[3], 16) === 1, + 'Clock regression by nsec increments the clockseq' + ); +}); + +test('explicit options product expected id', function() { + // Verify explicit options produce expected id + var id = uuid.v1({ + msecs: 1321651533573, + nsecs: 5432, + clockseq: 0x385c, + node: [ 0x61, 0xcd, 0x3c, 0xbb, 0x32, 0x10 ] + }); + assert(id == 'd9428888-122b-11e1-b85c-61cd3cbb3210', 'Explicit options produce expected id'); +}); + +test('ids spanning 1ms boundary are 100ns apart', function() { + // Verify adjacent ids across a msec boundary are 1 time unit apart + var u0 = uuid.v1({msecs: TIME, nsecs: 9999}); + var u1 = uuid.v1({msecs: TIME + 1, nsecs: 0}); + + var before = u0.split('-')[0], after = u1.split('-')[0]; + var dt = parseInt(after, 16) - parseInt(before, 16); + assert(dt === 1, 'Ids spanning 1ms boundary are 100ns apart'); +}); + +test('parse/unparse', function() { + var id = '00112233445566778899aabbccddeeff'; + assert(uuid.unparse(uuid.parse(id.substr(0,10))) == + '00112233-4400-0000-0000-000000000000', 'Short parse'); + assert(uuid.unparse(uuid.parse('(this is the uuid -> ' + id + id)) == + '00112233-4455-6677-8899-aabbccddeeff', 'Dirty parse'); +}); + diff --git a/packages/字体精简工具/node_modules/uuid/uuid.js b/packages/字体精简工具/node_modules/uuid/uuid.js new file mode 100644 index 0000000..be5bfed --- /dev/null +++ b/packages/字体精简工具/node_modules/uuid/uuid.js @@ -0,0 +1,183 @@ +// uuid.js +// +// Copyright (c) 2010-2012 Robert Kieffer +// MIT License - http://opensource.org/licenses/mit-license.php + +// Unique ID creation requires a high quality random # generator. We feature +// detect to determine the best RNG source, normalizing to a function that +// returns 128-bits of randomness, since that's what's usually required +var _rng = require('./rng'); + +// Maps for number <-> hex string conversion +var _byteToHex = []; +var _hexToByte = {}; +for (var i = 0; i < 256; i++) { + _byteToHex[i] = (i + 0x100).toString(16).substr(1); + _hexToByte[_byteToHex[i]] = i; +} + +// **`parse()` - Parse a UUID into it's component bytes** +function parse(s, buf, offset) { + var i = (buf && offset) || 0, ii = 0; + + buf = buf || []; + s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { + if (ii < 16) { // Don't overflow! + buf[i + ii++] = _hexToByte[oct]; + } + }); + + // Zero out remaining bytes if string was short + while (ii < 16) { + buf[i + ii++] = 0; + } + + return buf; +} + +// **`unparse()` - Convert UUID byte array (ala parse()) into a string** +function unparse(buf, offset) { + var i = offset || 0, bth = _byteToHex; + return bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]]; +} + +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +// random #'s we need to init node and clockseq +var _seedBytes = _rng(); + +// Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) +var _nodeId = [ + _seedBytes[0] | 0x01, + _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] +]; + +// Per 4.2.2, randomize (14 bit) clockseq +var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff; + +// Previous uuid creation time +var _lastMSecs = 0, _lastNSecs = 0; + +// See https://github.com/broofa/node-uuid for API details +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + + options = options || {}; + + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; + + // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime(); + + // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; + + // Time since last uuid creation (in msecs) + var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; + + // Per 4.2.1.2, Bump clockseq on clock regression + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } + + // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } + + // Per 4.2.1.2 Throw error if too many uuids are requested + if (nsecs >= 10000) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + + // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + msecs += 12219292800000; + + // `time_low` + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; + + // `time_mid` + var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; + + // `time_high_and_version` + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + b[i++] = tmh >>> 16 & 0xff; + + // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + b[i++] = clockseq >>> 8 | 0x80; + + // `clock_seq_low` + b[i++] = clockseq & 0xff; + + // `node` + var node = options.node || _nodeId; + for (var n = 0; n < 6; n++) { + b[i + n] = node[n]; + } + + return buf ? buf : unparse(b); +} + +// **`v4()` - Generate random UUID** + +// See https://github.com/broofa/node-uuid for API details +function v4(options, buf, offset) { + // Deprecated - 'format' argument, as supported in v1.2 + var i = buf && offset || 0; + + if (typeof(options) == 'string') { + buf = options == 'binary' ? new Array(16) : null; + options = null; + } + options = options || {}; + + var rnds = options.random || (options.rng || _rng)(); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + + // Copy bytes to buffer, if provided + if (buf) { + for (var ii = 0; ii < 16; ii++) { + buf[i + ii] = rnds[ii]; + } + } + + return buf || unparse(rnds); +} + +// Export public API +var uuid = v4; +uuid.v1 = v1; +uuid.v4 = v4; +uuid.parse = parse; +uuid.unparse = unparse; + +module.exports = uuid; diff --git a/packages/字体精简工具/node_modules/validate-npm-package-license/LICENSE b/packages/字体精简工具/node_modules/validate-npm-package-license/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/packages/字体精简工具/node_modules/validate-npm-package-license/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/字体精简工具/node_modules/validate-npm-package-license/README.md b/packages/字体精简工具/node_modules/validate-npm-package-license/README.md new file mode 100644 index 0000000..702bc7b --- /dev/null +++ b/packages/字体精简工具/node_modules/validate-npm-package-license/README.md @@ -0,0 +1,113 @@ +validate-npm-package-license +============================ + +Give me a string and I'll tell you if it's a valid npm package license string. + +```javascript +var valid = require('validate-npm-package-license'); +``` + +SPDX license identifiers are valid license strings: + +```javascript + +var assert = require('assert'); +var validSPDXExpression = { + validForNewPackages: true, + validForOldPackages: true, + spdx: true +}; + +assert.deepEqual(valid('MIT'), validSPDXExpression); +assert.deepEqual(valid('BSD-2-Clause'), validSPDXExpression); +assert.deepEqual(valid('Apache-2.0'), validSPDXExpression); +assert.deepEqual(valid('ISC'), validSPDXExpression); +``` +The function will return a warning and suggestion for nearly-correct license identifiers: + +```javascript +assert.deepEqual( + valid('Apache 2.0'), + { + validForOldPackages: false, + validForNewPackages: false, + warnings: [ + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "', + 'license is similar to the valid expression "Apache-2.0"' + ] + } +); +``` + +SPDX expressions are valid, too ... + +```javascript +// Simple SPDX license expression for dual licensing +assert.deepEqual( + valid('(GPL-3.0-only OR BSD-2-Clause)'), + validSPDXExpression +); +``` + +... except if they contain `LicenseRef`: + +```javascript +var warningAboutLicenseRef = { + validForOldPackages: false, + validForNewPackages: false, + spdx: true, + warnings: [ + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "', + ] +}; + +assert.deepEqual( + valid('LicenseRef-Made-Up'), + warningAboutLicenseRef +); + +assert.deepEqual( + valid('(MIT OR LicenseRef-Made-Up)'), + warningAboutLicenseRef +); +``` + +If you can't describe your licensing terms with standardized SPDX identifiers, put the terms in a file in the package and point users there: + +```javascript +assert.deepEqual( + valid('SEE LICENSE IN LICENSE.txt'), + { + validForNewPackages: true, + validForOldPackages: true, + inFile: 'LICENSE.txt' + } +); + +assert.deepEqual( + valid('SEE LICENSE IN license.md'), + { + validForNewPackages: true, + validForOldPackages: true, + inFile: 'license.md' + } +); +``` + +If there aren't any licensing terms, use `UNLICENSED`: + +```javascript +var unlicensed = { + validForNewPackages: true, + validForOldPackages: true, + unlicensed: true +}; +assert.deepEqual(valid('UNLICENSED'), unlicensed); +assert.deepEqual(valid('UNLICENCED'), unlicensed); +``` diff --git a/packages/字体精简工具/node_modules/validate-npm-package-license/index.js b/packages/字体精简工具/node_modules/validate-npm-package-license/index.js new file mode 100644 index 0000000..35eaa73 --- /dev/null +++ b/packages/字体精简工具/node_modules/validate-npm-package-license/index.js @@ -0,0 +1,86 @@ +var parse = require('spdx-expression-parse'); +var correct = require('spdx-correct'); + +var genericWarning = ( + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "' +); + +var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; + +function startsWith(prefix, string) { + return string.slice(0, prefix.length) === prefix; +} + +function usesLicenseRef(ast) { + if (ast.hasOwnProperty('license')) { + var license = ast.license; + return ( + startsWith('LicenseRef', license) || + startsWith('DocumentRef', license) + ); + } else { + return ( + usesLicenseRef(ast.left) || + usesLicenseRef(ast.right) + ); + } +} + +module.exports = function(argument) { + var ast; + + try { + ast = parse(argument); + } catch (e) { + var match + if ( + argument === 'UNLICENSED' || + argument === 'UNLICENCED' + ) { + return { + validForOldPackages: true, + validForNewPackages: true, + unlicensed: true + }; + } else if (match = fileReferenceRE.exec(argument)) { + return { + validForOldPackages: true, + validForNewPackages: true, + inFile: match[1] + }; + } else { + var result = { + validForOldPackages: false, + validForNewPackages: false, + warnings: [genericWarning] + }; + if (argument.trim().length !== 0) { + var corrected = correct(argument); + if (corrected) { + result.warnings.push( + 'license is similar to the valid expression "' + corrected + '"' + ); + } + } + return result; + } + } + + if (usesLicenseRef(ast)) { + return { + validForNewPackages: false, + validForOldPackages: false, + spdx: true, + warnings: [genericWarning] + }; + } else { + return { + validForNewPackages: true, + validForOldPackages: true, + spdx: true + }; + } +}; diff --git a/packages/字体精简工具/node_modules/validate-npm-package-license/package.json b/packages/字体精简工具/node_modules/validate-npm-package-license/package.json new file mode 100644 index 0000000..4e2b48e --- /dev/null +++ b/packages/字体精简工具/node_modules/validate-npm-package-license/package.json @@ -0,0 +1,67 @@ +{ + "_from": "validate-npm-package-license@^3.0.1", + "_id": "validate-npm-package-license@3.0.4", + "_inBundle": false, + "_integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "_location": "/validate-npm-package-license", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "validate-npm-package-license@^3.0.1", + "name": "validate-npm-package-license", + "escapedName": "validate-npm-package-license", + "rawSpec": "^3.0.1", + "saveSpec": null, + "fetchSpec": "^3.0.1" + }, + "_requiredBy": [ + "/normalize-package-data" + ], + "_resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "_shasum": "fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a", + "_spec": "validate-npm-package-license@^3.0.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\normalize-package-data", + "author": { + "name": "Kyle E. Mitchell", + "email": "kyle@kemitchell.com", + "url": "https://kemitchell.com" + }, + "bugs": { + "url": "https://github.com/kemitchell/validate-npm-package-license.js/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Mark Stacey", + "email": "markjstacey@gmail.com" + } + ], + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + }, + "deprecated": false, + "description": "Give me a string and I'll tell you if it's a valid npm package license string", + "devDependencies": { + "defence-cli": "^2.0.1", + "replace-require-self": "^1.0.0" + }, + "homepage": "https://github.com/kemitchell/validate-npm-package-license.js#readme", + "keywords": [ + "license", + "npm", + "package", + "validation" + ], + "license": "Apache-2.0", + "name": "validate-npm-package-license", + "repository": { + "type": "git", + "url": "git+https://github.com/kemitchell/validate-npm-package-license.js.git" + }, + "scripts": { + "test": "defence README.md | replace-require-self | node" + }, + "version": "3.0.4" +} diff --git a/packages/字体精简工具/node_modules/value-or-function/LICENSE b/packages/字体精简工具/node_modules/value-or-function/LICENSE new file mode 100644 index 0000000..9aedc0d --- /dev/null +++ b/packages/字体精简工具/node_modules/value-or-function/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Blaine Bublitz, Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/value-or-function/README.md b/packages/字体精简工具/node_modules/value-or-function/README.md new file mode 100644 index 0000000..44ef218 --- /dev/null +++ b/packages/字体精简工具/node_modules/value-or-function/README.md @@ -0,0 +1,132 @@ +

+ + + +

+ +# value-or-function + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Normalize a value or function, applying extra args to the function + +## Example + +```js +var normalize = require('value-or-function'); + +// Values matching type are returned +var isEnabled = normalize('boolean', true); +// isEnabled === true + +// Values not matching type return undefined +var isEnabled = normalize('boolean', 1); +// isEnabled === undefined + +// Functions are called +var isEnabled = normalize('boolean', function() { + return false; +}); +// isEnabled === false + +// Extra arguments are applied to function +var count = normalize('number', function(a, b) { + return a + b; +}, 1, 2); +// count === 3 + +// Supply the function with context +var context = { c: 3 }; +var count = normalize.call(context, 'number', function(a, b) { + return a + b + this.c; +}, 1, 2); +// count === 6 + +// Values one of multiple types are returned +var isEnabled = normalize(['string', 'boolean'], true); +// isEnabled === true + +// Provide a function as first argument to do custom coercion +var now = new Date(); +var enabledSince = normalize(function(value) { + if (value.constructor === Date) { + return value; + } +}, now); +// enabledSince === now + +// Convenience methods are available for the built-in types +var result = normalize.object({}); +var result = normalize.number(1); +var result = normalize.string(''); +var result = normalize.symbol(Symbol()); +var result = normalize.boolean(true); +var result = normalize.function(function() {}); +var result = normalize.date(new Date()); +``` + +## API + +### `normalize(coercer, value[, ...appliedArguments])` + +Takes a coercer function `coercer` to transform `value` to the desired type. +Also optionally takes any extra arguments to apply to `value` if `value` is a function. + +If the return value of `coercer(value)` is not `null` or `undefined`, that value is returned. +Otherwise, if `value` is a function, that function is called with any extra arguments +supplied to `normalize`, and its return value is passed through the coercer. + +If `coercer` is a string, it must be one of the built-in types (see below) +and the appropriate default coercer is invoked, optionally first reducing `value` +to a primitive type with `.valueOf()` if it is an Object. + +If `coercer` is an array, each element is tried until one returns something other +than `null` or `undefined`, or it results in `undefined` if all of the elements yield `null` or `undefined`. + +#### `normalize.object(value[, ...appliedArguments])` + +Convenience method for `normalize('object', ...)`. + +#### `normalize.number(value[, ...appliedArguments])` + +Convenience method for `normalize('number', ...)`. + +#### `normalize.string(value[, ...appliedArguments])` + +Convenience method for `normalize('string', ...)`. + +#### `normalize.symbol(value[, ...appliedArguments])` + +Convenience method for `normalize('symbol', ...)`. + +#### `normalize.boolean(value[, ...appliedArguments])` + +Convenience method for `normalize('boolean', ...)`. + +#### `normalize.function(value[, ...appliedArguments])` + +Convenience method for `normalize('function', ...)`. + +#### `normalize.date(value[, ...appliedArguments])` + +Convenience method for `normalize('date', ...)`. + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/value-or-function.svg +[npm-url]: https://npmjs.org/package/value-or-function +[npm-image]: http://img.shields.io/npm/v/value-or-function.svg + +[travis-url]: https://travis-ci.org/gulpjs/value-or-function +[travis-image]: http://img.shields.io/travis/gulpjs/value-or-function.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/value-or-function +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/value-or-function.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/value-or-function +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/value-or-function/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/packages/字体精简工具/node_modules/value-or-function/index.js b/packages/字体精简工具/node_modules/value-or-function/index.js new file mode 100644 index 0000000..1be06dc --- /dev/null +++ b/packages/字体精简工具/node_modules/value-or-function/index.js @@ -0,0 +1,113 @@ +'use strict'; + +// Built-in types +var types = [ + 'object', + 'number', + 'string', + 'symbol', + 'boolean', + 'date', + 'function', // Weird to expose this +]; + + +function normalize(coercer, value) { + if (typeof value === 'function') { + if (coercer === 'function') { + return value; + } + value = value.apply(this, slice(arguments, 2)); + } + return coerce(this, coercer, value); +} + + +function coerce(ctx, coercer, value) { + + // Handle built-in types + if (typeof coercer === 'string') { + if (coerce[coercer]) { + return coerce[coercer].call(ctx, value); + } + return typeOf(coercer, value); + } + + // Handle custom coercer + if (typeof coercer === 'function') { + return coercer.call(ctx, value); + } + + // Array of coercers, try in order until one returns a non-null value + var result; + coercer.some(function(coercer) { + result = coerce(ctx, coercer, value); + return result != null; + }); + + return result; +} + + +coerce.string = function(value) { + if (value != null && + typeof value === 'object' && + typeof value.toString === 'function') { + + value = value.toString(); + } + return typeOf('string', primitive(value)); +}; + + +coerce.number = function(value) { + return typeOf('number', primitive(value)); +}; + + +coerce.boolean = function(value) { + return typeOf('boolean', primitive(value)); +}; + + +coerce.date = function(value) { + value = primitive(value); + if (typeof value === 'number' && !isNaN(value) && isFinite(value)) { + return new Date(value); + } +}; + + +function typeOf(type, value) { + if (typeof value === type) { + return value; + } +} + + +function primitive(value) { + if (value != null && + typeof value === 'object' && + typeof value.valueOf === 'function') { + + value = value.valueOf(); + } + return value; +} + +function slice(value, from) { + return Array.prototype.slice.call(value, from); +} + +// Add methods for each type +types.forEach(function(type) { + // Make it an array for easier concat + var typeArg = [type]; + + normalize[type] = function() { + var args = slice(arguments); + return normalize.apply(this, typeArg.concat(args)); + }; +}); + +module.exports = normalize; diff --git a/packages/字体精简工具/node_modules/value-or-function/package.json b/packages/字体精简工具/node_modules/value-or-function/package.json new file mode 100644 index 0000000..756a82b --- /dev/null +++ b/packages/字体精简工具/node_modules/value-or-function/package.json @@ -0,0 +1,86 @@ +{ + "_from": "value-or-function@^3.0.0", + "_id": "value-or-function@3.0.0", + "_inBundle": false, + "_integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "_location": "/value-or-function", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "value-or-function@^3.0.0", + "name": "value-or-function", + "escapedName": "value-or-function", + "rawSpec": "^3.0.0", + "saveSpec": null, + "fetchSpec": "^3.0.0" + }, + "_requiredBy": [ + "/resolve-options", + "/vinyl-fs" + ], + "_resolved": "https://registry.npm.taobao.org/value-or-function/download/value-or-function-3.0.0.tgz", + "_shasum": "1c243a50b595c1be54a754bfece8563b9ff8d813", + "_spec": "value-or-function@^3.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/value-or-function/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + }, + { + "name": "Hugo Wood", + "email": "hx4.5@free.fr" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "Normalize a value or function, applying extra args to the function", + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.16.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^2.4.5" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/gulpjs/value-or-function#readme", + "keywords": [ + "options", + "normalize", + "value", + "function" + ], + "license": "MIT", + "main": "index.js", + "name": "value-or-function", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/value-or-function.git" + }, + "scripts": { + "cover": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls", + "lint": "eslint . && jscs index.js test/", + "pretest": "npm run lint", + "test": "mocha --async-only" + }, + "version": "3.0.0" +} diff --git a/packages/字体精简工具/node_modules/verror/.npmignore b/packages/字体精简工具/node_modules/verror/.npmignore new file mode 100644 index 0000000..f14aec8 --- /dev/null +++ b/packages/字体精简工具/node_modules/verror/.npmignore @@ -0,0 +1,9 @@ +.gitignore +.gitmodules +deps +examples +experiments +jsl.node.conf +Makefile +Makefile.targ +test diff --git a/packages/字体精简工具/node_modules/verror/CHANGES.md b/packages/字体精简工具/node_modules/verror/CHANGES.md new file mode 100644 index 0000000..bbb745a --- /dev/null +++ b/packages/字体精简工具/node_modules/verror/CHANGES.md @@ -0,0 +1,28 @@ +# Changelog + +## Not yet released + +None yet. + +## v1.10.0 + +* #49 want convenience functions for MultiErrors + +## v1.9.0 + +* #47 could use VError.hasCauseWithName() + +## v1.8.1 + +* #39 captureStackTrace lost when inheriting from WError + +## v1.8.0 + +* #23 Preserve original stack trace(s) + +## v1.7.0 + +* #10 better support for extra properties on Errors +* #11 make it easy to find causes of a particular kind +* #29 No documentation on how to Install this package +* #36 elide development-only files from npm package diff --git a/packages/字体精简工具/node_modules/verror/CONTRIBUTING.md b/packages/字体精简工具/node_modules/verror/CONTRIBUTING.md new file mode 100644 index 0000000..750cef8 --- /dev/null +++ b/packages/字体精简工具/node_modules/verror/CONTRIBUTING.md @@ -0,0 +1,19 @@ +# Contributing + +This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new +changes. Anyone can submit changes. To get started, see the [cr.joyent.us user +guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md). +This repo does not use GitHub pull requests. + +See the [Joyent Engineering +Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general +best practices expected in this repository. + +Contributions should be "make prepush" clean. The "prepush" target runs the +"check" target, which requires these separate tools: + +* https://github.com/davepacheco/jsstyle +* https://github.com/davepacheco/javascriptlint + +If you're changing something non-trivial or user-facing, you may want to submit +an issue first. diff --git a/packages/字体精简工具/node_modules/verror/LICENSE b/packages/字体精简工具/node_modules/verror/LICENSE new file mode 100644 index 0000000..82a5cb8 --- /dev/null +++ b/packages/字体精简工具/node_modules/verror/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016, Joyent, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE diff --git a/packages/字体精简工具/node_modules/verror/README.md b/packages/字体精简工具/node_modules/verror/README.md new file mode 100644 index 0000000..c1f0635 --- /dev/null +++ b/packages/字体精简工具/node_modules/verror/README.md @@ -0,0 +1,528 @@ +# verror: rich JavaScript errors + +This module provides several classes in support of Joyent's [Best Practices for +Error Handling in Node.js](http://www.joyent.com/developers/node/design/errors). +If you find any of the behavior here confusing or surprising, check out that +document first. + +The error classes here support: + +* printf-style arguments for the message +* chains of causes +* properties to provide extra information about the error +* creating your own subclasses that support all of these + +The classes here are: + +* **VError**, for chaining errors while preserving each one's error message. + This is useful in servers and command-line utilities when you want to + propagate an error up a call stack, but allow various levels to add their own + context. See examples below. +* **WError**, for wrapping errors while hiding the lower-level messages from the + top-level error. This is useful for API endpoints where you don't want to + expose internal error messages, but you still want to preserve the error chain + for logging and debugging. +* **SError**, which is just like VError but interprets printf-style arguments + more strictly. +* **MultiError**, which is just an Error that encapsulates one or more other + errors. (This is used for parallel operations that return several errors.) + + +# Quick start + +First, install the package: + + npm install verror + +If nothing else, you can use VError as a drop-in replacement for the built-in +JavaScript Error class, with the addition of printf-style messages: + +```javascript +var err = new VError('missing file: "%s"', '/etc/passwd'); +console.log(err.message); +``` + +This prints: + + missing file: "/etc/passwd" + +You can also pass a `cause` argument, which is any other Error object: + +```javascript +var fs = require('fs'); +var filename = '/nonexistent'; +fs.stat(filename, function (err1) { + var err2 = new VError(err1, 'stat "%s"', filename); + console.error(err2.message); +}); +``` + +This prints out: + + stat "/nonexistent": ENOENT, stat '/nonexistent' + +which resembles how Unix programs typically report errors: + + $ sort /nonexistent + sort: open failed: /nonexistent: No such file or directory + +To match the Unixy feel, when you print out the error, just prepend the +program's name to the VError's `message`. Or just call +[node-cmdutil.fail(your_verror)](https://github.com/joyent/node-cmdutil), which +does this for you. + +You can get the next-level Error using `err.cause()`: + +```javascript +console.error(err2.cause().message); +``` + +prints: + + ENOENT, stat '/nonexistent' + +Of course, you can chain these as many times as you want, and it works with any +kind of Error: + +```javascript +var err1 = new Error('No such file or directory'); +var err2 = new VError(err1, 'failed to stat "%s"', '/junk'); +var err3 = new VError(err2, 'request failed'); +console.error(err3.message); +``` + +This prints: + + request failed: failed to stat "/junk": No such file or directory + +The idea is that each layer in the stack annotates the error with a description +of what it was doing. The end result is a message that explains what happened +at each level. + +You can also decorate Error objects with additional information so that callers +can not only handle each kind of error differently, but also construct their own +error messages (e.g., to localize them, format them, group them by type, and so +on). See the example below. + + +# Deeper dive + +The two main goals for VError are: + +* **Make it easy to construct clear, complete error messages intended for + people.** Clear error messages greatly improve both user experience and + debuggability, so we wanted to make it easy to build them. That's why the + constructor takes printf-style arguments. +* **Make it easy to construct objects with programmatically-accessible + metadata** (which we call _informational properties_). Instead of just saying + "connection refused while connecting to 192.168.1.2:80", you can add + properties like `"ip": "192.168.1.2"` and `"tcpPort": 80`. This can be used + for feeding into monitoring systems, analyzing large numbers of Errors (as + from a log file), or localizing error messages. + +To really make this useful, it also needs to be easy to compose Errors: +higher-level code should be able to augment the Errors reported by lower-level +code to provide a more complete description of what happened. Instead of saying +"connection refused", you can say "operation X failed: connection refused". +That's why VError supports `causes`. + +In order for all this to work, programmers need to know that it's generally safe +to wrap lower-level Errors with higher-level ones. If you have existing code +that handles Errors produced by a library, you should be able to wrap those +Errors with a VError to add information without breaking the error handling +code. There are two obvious ways that this could break such consumers: + +* The error's name might change. People typically use `name` to determine what + kind of Error they've got. To ensure compatibility, you can create VErrors + with custom names, but this approach isn't great because it prevents you from + representing complex failures. For this reason, VError provides + `findCauseByName`, which essentially asks: does this Error _or any of its + causes_ have this specific type? If error handling code uses + `findCauseByName`, then subsystems can construct very specific causal chains + for debuggability and still let people handle simple cases easily. There's an + example below. +* The error's properties might change. People often hang additional properties + off of Error objects. If we wrap an existing Error in a new Error, those + properties would be lost unless we copied them. But there are a variety of + both standard and non-standard Error properties that should _not_ be copied in + this way: most obviously `name`, `message`, and `stack`, but also `fileName`, + `lineNumber`, and a few others. Plus, it's useful for some Error subclasses + to have their own private properties -- and there'd be no way to know whether + these should be copied. For these reasons, VError first-classes these + information properties. You have to provide them in the constructor, you can + only fetch them with the `info()` function, and VError takes care of making + sure properties from causes wind up in the `info()` output. + +Let's put this all together with an example from the node-fast RPC library. +node-fast implements a simple RPC protocol for Node programs. There's a server +and client interface, and clients make RPC requests to servers. Let's say the +server fails with an UnauthorizedError with message "user 'bob' is not +authorized". The client wraps all server errors with a FastServerError. The +client also wraps all request errors with a FastRequestError that includes the +name of the RPC call being made. The result of this failed RPC might look like +this: + + name: FastRequestError + message: "request failed: server error: user 'bob' is not authorized" + rpcMsgid: + rpcMethod: GetObject + cause: + name: FastServerError + message: "server error: user 'bob' is not authorized" + cause: + name: UnauthorizedError + message: "user 'bob' is not authorized" + rpcUser: "bob" + +When the caller uses `VError.info()`, the information properties are collapsed +so that it looks like this: + + message: "request failed: server error: user 'bob' is not authorized" + rpcMsgid: + rpcMethod: GetObject + rpcUser: "bob" + +Taking this apart: + +* The error's message is a complete description of the problem. The caller can + report this directly to its caller, which can potentially make its way back to + an end user (if appropriate). It can also be logged. +* The caller can tell that the request failed on the server, rather than as a + result of a client problem (e.g., failure to serialize the request), a + transport problem (e.g., failure to connect to the server), or something else + (e.g., a timeout). They do this using `findCauseByName('FastServerError')` + rather than checking the `name` field directly. +* If the caller logs this error, the logs can be analyzed to aggregate + errors by cause, by RPC method name, by user, or whatever. Or the + error can be correlated with other events for the same rpcMsgid. +* It wasn't very hard for any part of the code to contribute to this Error. + Each part of the stack has just a few lines to provide exactly what it knows, + with very little boilerplate. + +It's not expected that you'd use these complex forms all the time. Despite +supporting the complex case above, you can still just do: + + new VError("my service isn't working"); + +for the simple cases. + + +# Reference: VError, WError, SError + +VError, WError, and SError are convenient drop-in replacements for `Error` that +support printf-style arguments, first-class causes, informational properties, +and other useful features. + + +## Constructors + +The VError constructor has several forms: + +```javascript +/* + * This is the most general form. You can specify any supported options + * (including "cause" and "info") this way. + */ +new VError(options, sprintf_args...) + +/* + * This is a useful shorthand when the only option you need is "cause". + */ +new VError(cause, sprintf_args...) + +/* + * This is a useful shorthand when you don't need any options at all. + */ +new VError(sprintf_args...) +``` + +All of these forms construct a new VError that behaves just like the built-in +JavaScript `Error` class, with some additional methods described below. + +In the first form, `options` is a plain object with any of the following +optional properties: + +Option name | Type | Meaning +---------------- | ---------------- | ------- +`name` | string | Describes what kind of error this is. This is intended for programmatic use to distinguish between different kinds of errors. Note that in modern versions of Node.js, this name is ignored in the `stack` property value, but callers can still use the `name` property to get at it. +`cause` | any Error object | Indicates that the new error was caused by `cause`. See `cause()` below. If unspecified, the cause will be `null`. +`strict` | boolean | If true, then `null` and `undefined` values in `sprintf_args` are passed through to `sprintf()`. Otherwise, these are replaced with the strings `'null'`, and '`undefined`', respectively. +`constructorOpt` | function | If specified, then the stack trace for this error ends at function `constructorOpt`. Functions called by `constructorOpt` will not show up in the stack. This is useful when this class is subclassed. +`info` | object | Specifies arbitrary informational properties that are available through the `VError.info(err)` static class method. See that method for details. + +The second form is equivalent to using the first form with the specified `cause` +as the error's cause. This form is distinguished from the first form because +the first argument is an Error. + +The third form is equivalent to using the first form with all default option +values. This form is distinguished from the other forms because the first +argument is not an object or an Error. + +The `WError` constructor is used exactly the same way as the `VError` +constructor. The `SError` constructor is also used the same way as the +`VError` constructor except that in all cases, the `strict` property is +overriden to `true. + + +## Public properties + +`VError`, `WError`, and `SError` all provide the same public properties as +JavaScript's built-in Error objects. + +Property name | Type | Meaning +------------- | ------ | ------- +`name` | string | Programmatically-usable name of the error. +`message` | string | Human-readable summary of the failure. Programmatically-accessible details are provided through `VError.info(err)` class method. +`stack` | string | Human-readable stack trace where the Error was constructed. + +For all of these classes, the printf-style arguments passed to the constructor +are processed with `sprintf()` to form a message. For `WError`, this becomes +the complete `message` property. For `SError` and `VError`, this message is +prepended to the message of the cause, if any (with a suitable separator), and +the result becomes the `message` property. + +The `stack` property is managed entirely by the underlying JavaScript +implementation. It's generally implemented using a getter function because +constructing the human-readable stack trace is somewhat expensive. + +## Class methods + +The following methods are defined on the `VError` class and as exported +functions on the `verror` module. They're defined this way rather than using +methods on VError instances so that they can be used on Errors not created with +`VError`. + +### `VError.cause(err)` + +The `cause()` function returns the next Error in the cause chain for `err`, or +`null` if there is no next error. See the `cause` argument to the constructor. +Errors can have arbitrarily long cause chains. You can walk the `cause` chain +by invoking `VError.cause(err)` on each subsequent return value. If `err` is +not a `VError`, the cause is `null`. + +### `VError.info(err)` + +Returns an object with all of the extra error information that's been associated +with this Error and all of its causes. These are the properties passed in using +the `info` option to the constructor. Properties not specified in the +constructor for this Error are implicitly inherited from this error's cause. + +These properties are intended to provide programmatically-accessible metadata +about the error. For an error that indicates a failure to resolve a DNS name, +informational properties might include the DNS name to be resolved, or even the +list of resolvers used to resolve it. The values of these properties should +generally be plain objects (i.e., consisting only of null, undefined, numbers, +booleans, strings, and objects and arrays containing only other plain objects). + +### `VError.fullStack(err)` + +Returns a string containing the full stack trace, with all nested errors recursively +reported as `'caused by:' + err.stack`. + +### `VError.findCauseByName(err, name)` + +The `findCauseByName()` function traverses the cause chain for `err`, looking +for an error whose `name` property matches the passed in `name` value. If no +match is found, `null` is returned. + +If all you want is to know _whether_ there's a cause (and you don't care what it +is), you can use `VError.hasCauseWithName(err, name)`. + +If a vanilla error or a non-VError error is passed in, then there is no cause +chain to traverse. In this scenario, the function will check the `name` +property of only `err`. + +### `VError.hasCauseWithName(err, name)` + +Returns true if and only if `VError.findCauseByName(err, name)` would return +a non-null value. This essentially determines whether `err` has any cause in +its cause chain that has name `name`. + +### `VError.errorFromList(errors)` + +Given an array of Error objects (possibly empty), return a single error +representing the whole collection of errors. If the list has: + +* 0 elements, returns `null` +* 1 element, returns the sole error +* more than 1 element, returns a MultiError referencing the whole list + +This is useful for cases where an operation may produce any number of errors, +and you ultimately want to implement the usual `callback(err)` pattern. You can +accumulate the errors in an array and then invoke +`callback(VError.errorFromList(errors))` when the operation is complete. + + +### `VError.errorForEach(err, func)` + +Convenience function for iterating an error that may itself be a MultiError. + +In all cases, `err` must be an Error. If `err` is a MultiError, then `func` is +invoked as `func(errorN)` for each of the underlying errors of the MultiError. +If `err` is any other kind of error, `func` is invoked once as `func(err)`. In +all cases, `func` is invoked synchronously. + +This is useful for cases where an operation may produce any number of warnings +that may be encapsulated with a MultiError -- but may not be. + +This function does not iterate an error's cause chain. + + +## Examples + +The "Demo" section above covers several basic cases. Here's a more advanced +case: + +```javascript +var err1 = new VError('something bad happened'); +/* ... */ +var err2 = new VError({ + 'name': 'ConnectionError', + 'cause': err1, + 'info': { + 'errno': 'ECONNREFUSED', + 'remote_ip': '127.0.0.1', + 'port': 215 + } +}, 'failed to connect to "%s:%d"', '127.0.0.1', 215); + +console.log(err2.message); +console.log(err2.name); +console.log(VError.info(err2)); +console.log(err2.stack); +``` + +This outputs: + + failed to connect to "127.0.0.1:215": something bad happened + ConnectionError + { errno: 'ECONNREFUSED', remote_ip: '127.0.0.1', port: 215 } + ConnectionError: failed to connect to "127.0.0.1:215": something bad happened + at Object. (/home/dap/node-verror/examples/info.js:5:12) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + at node.js:935:3 + +Information properties are inherited up the cause chain, with values at the top +of the chain overriding same-named values lower in the chain. To continue that +example: + +```javascript +var err3 = new VError({ + 'name': 'RequestError', + 'cause': err2, + 'info': { + 'errno': 'EBADREQUEST' + } +}, 'request failed'); + +console.log(err3.message); +console.log(err3.name); +console.log(VError.info(err3)); +console.log(err3.stack); +``` + +This outputs: + + request failed: failed to connect to "127.0.0.1:215": something bad happened + RequestError + { errno: 'EBADREQUEST', remote_ip: '127.0.0.1', port: 215 } + RequestError: request failed: failed to connect to "127.0.0.1:215": something bad happened + at Object. (/home/dap/node-verror/examples/info.js:20:12) + at Module._compile (module.js:456:26) + at Object.Module._extensions..js (module.js:474:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + at Function.Module.runMain (module.js:497:10) + at startup (node.js:119:16) + at node.js:935:3 + +You can also print the complete stack trace of combined `Error`s by using +`VError.fullStack(err).` + +```javascript +var err1 = new VError('something bad happened'); +/* ... */ +var err2 = new VError(err1, 'something really bad happened here'); + +console.log(VError.fullStack(err2)); +``` + +This outputs: + + VError: something really bad happened here: something bad happened + at Object. (/home/dap/node-verror/examples/fullStack.js:5:12) + at Module._compile (module.js:409:26) + at Object.Module._extensions..js (module.js:416:10) + at Module.load (module.js:343:32) + at Function.Module._load (module.js:300:12) + at Function.Module.runMain (module.js:441:10) + at startup (node.js:139:18) + at node.js:968:3 + caused by: VError: something bad happened + at Object. (/home/dap/node-verror/examples/fullStack.js:3:12) + at Module._compile (module.js:409:26) + at Object.Module._extensions..js (module.js:416:10) + at Module.load (module.js:343:32) + at Function.Module._load (module.js:300:12) + at Function.Module.runMain (module.js:441:10) + at startup (node.js:139:18) + at node.js:968:3 + +`VError.fullStack` is also safe to use on regular `Error`s, so feel free to use +it whenever you need to extract the stack trace from an `Error`, regardless if +it's a `VError` or not. + +# Reference: MultiError + +MultiError is an Error class that represents a group of Errors. This is used +when you logically need to provide a single Error, but you want to preserve +information about multiple underying Errors. A common case is when you execute +several operations in parallel and some of them fail. + +MultiErrors are constructed as: + +```javascript +new MultiError(error_list) +``` + +`error_list` is an array of at least one `Error` object. + +The cause of the MultiError is the first error provided. None of the other +`VError` options are supported. The `message` for a MultiError consists the +`message` from the first error, prepended with a message indicating that there +were other errors. + +For example: + +```javascript +err = new MultiError([ + new Error('failed to resolve DNS name "abc.example.com"'), + new Error('failed to resolve DNS name "def.example.com"'), +]); + +console.error(err.message); +``` + +outputs: + + first of 2 errors: failed to resolve DNS name "abc.example.com" + +See the convenience function `VError.errorFromList`, which is sometimes simpler +to use than this constructor. + +## Public methods + + +### `errors()` + +Returns an array of the errors used to construct this MultiError. + + +# Contributing + +See separate [contribution guidelines](CONTRIBUTING.md). diff --git a/packages/字体精简工具/node_modules/verror/lib/verror.js b/packages/字体精简工具/node_modules/verror/lib/verror.js new file mode 100644 index 0000000..8663dde --- /dev/null +++ b/packages/字体精简工具/node_modules/verror/lib/verror.js @@ -0,0 +1,451 @@ +/* + * verror.js: richer JavaScript errors + */ + +var mod_assertplus = require('assert-plus'); +var mod_util = require('util'); + +var mod_extsprintf = require('extsprintf'); +var mod_isError = require('core-util-is').isError; +var sprintf = mod_extsprintf.sprintf; + +/* + * Public interface + */ + +/* So you can 'var VError = require('verror')' */ +module.exports = VError; +/* For compatibility */ +VError.VError = VError; +/* Other exported classes */ +VError.SError = SError; +VError.WError = WError; +VError.MultiError = MultiError; + +/* + * Common function used to parse constructor arguments for VError, WError, and + * SError. Named arguments to this function: + * + * strict force strict interpretation of sprintf arguments, even + * if the options in "argv" don't say so + * + * argv error's constructor arguments, which are to be + * interpreted as described in README.md. For quick + * reference, "argv" has one of the following forms: + * + * [ sprintf_args... ] (argv[0] is a string) + * [ cause, sprintf_args... ] (argv[0] is an Error) + * [ options, sprintf_args... ] (argv[0] is an object) + * + * This function normalizes these forms, producing an object with the following + * properties: + * + * options equivalent to "options" in third form. This will never + * be a direct reference to what the caller passed in + * (i.e., it may be a shallow copy), so it can be freely + * modified. + * + * shortmessage result of sprintf(sprintf_args), taking options.strict + * into account as described in README.md. + */ +function parseConstructorArguments(args) +{ + var argv, options, sprintf_args, shortmessage, k; + + mod_assertplus.object(args, 'args'); + mod_assertplus.bool(args.strict, 'args.strict'); + mod_assertplus.array(args.argv, 'args.argv'); + argv = args.argv; + + /* + * First, figure out which form of invocation we've been given. + */ + if (argv.length === 0) { + options = {}; + sprintf_args = []; + } else if (mod_isError(argv[0])) { + options = { 'cause': argv[0] }; + sprintf_args = argv.slice(1); + } else if (typeof (argv[0]) === 'object') { + options = {}; + for (k in argv[0]) { + options[k] = argv[0][k]; + } + sprintf_args = argv.slice(1); + } else { + mod_assertplus.string(argv[0], + 'first argument to VError, SError, or WError ' + + 'constructor must be a string, object, or Error'); + options = {}; + sprintf_args = argv; + } + + /* + * Now construct the error's message. + * + * extsprintf (which we invoke here with our caller's arguments in order + * to construct this Error's message) is strict in its interpretation of + * values to be processed by the "%s" specifier. The value passed to + * extsprintf must actually be a string or something convertible to a + * String using .toString(). Passing other values (notably "null" and + * "undefined") is considered a programmer error. The assumption is + * that if you actually want to print the string "null" or "undefined", + * then that's easy to do that when you're calling extsprintf; on the + * other hand, if you did NOT want that (i.e., there's actually a bug + * where the program assumes some variable is non-null and tries to + * print it, which might happen when constructing a packet or file in + * some specific format), then it's better to stop immediately than + * produce bogus output. + * + * However, sometimes the bug is only in the code calling VError, and a + * programmer might prefer to have the error message contain "null" or + * "undefined" rather than have the bug in the error path crash the + * program (making the first bug harder to identify). For that reason, + * by default VError converts "null" or "undefined" arguments to their + * string representations and passes those to extsprintf. Programmers + * desiring the strict behavior can use the SError class or pass the + * "strict" option to the VError constructor. + */ + mod_assertplus.object(options); + if (!options.strict && !args.strict) { + sprintf_args = sprintf_args.map(function (a) { + return (a === null ? 'null' : + a === undefined ? 'undefined' : a); + }); + } + + if (sprintf_args.length === 0) { + shortmessage = ''; + } else { + shortmessage = sprintf.apply(null, sprintf_args); + } + + return ({ + 'options': options, + 'shortmessage': shortmessage + }); +} + +/* + * See README.md for reference documentation. + */ +function VError() +{ + var args, obj, parsed, cause, ctor, message, k; + + args = Array.prototype.slice.call(arguments, 0); + + /* + * This is a regrettable pattern, but JavaScript's built-in Error class + * is defined to work this way, so we allow the constructor to be called + * without "new". + */ + if (!(this instanceof VError)) { + obj = Object.create(VError.prototype); + VError.apply(obj, arguments); + return (obj); + } + + /* + * For convenience and backwards compatibility, we support several + * different calling forms. Normalize them here. + */ + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': false + }); + + /* + * If we've been given a name, apply it now. + */ + if (parsed.options.name) { + mod_assertplus.string(parsed.options.name, + 'error\'s "name" must be a string'); + this.name = parsed.options.name; + } + + /* + * For debugging, we keep track of the original short message (attached + * this Error particularly) separately from the complete message (which + * includes the messages of our cause chain). + */ + this.jse_shortmsg = parsed.shortmessage; + message = parsed.shortmessage; + + /* + * If we've been given a cause, record a reference to it and update our + * message appropriately. + */ + cause = parsed.options.cause; + if (cause) { + mod_assertplus.ok(mod_isError(cause), 'cause is not an Error'); + this.jse_cause = cause; + + if (!parsed.options.skipCauseMessage) { + message += ': ' + cause.message; + } + } + + /* + * If we've been given an object with properties, shallow-copy that + * here. We don't want to use a deep copy in case there are non-plain + * objects here, but we don't want to use the original object in case + * the caller modifies it later. + */ + this.jse_info = {}; + if (parsed.options.info) { + for (k in parsed.options.info) { + this.jse_info[k] = parsed.options.info[k]; + } + } + + this.message = message; + Error.call(this, message); + + if (Error.captureStackTrace) { + ctor = parsed.options.constructorOpt || this.constructor; + Error.captureStackTrace(this, ctor); + } + + return (this); +} + +mod_util.inherits(VError, Error); +VError.prototype.name = 'VError'; + +VError.prototype.toString = function ve_toString() +{ + var str = (this.hasOwnProperty('name') && this.name || + this.constructor.name || this.constructor.prototype.name); + if (this.message) + str += ': ' + this.message; + + return (str); +}; + +/* + * This method is provided for compatibility. New callers should use + * VError.cause() instead. That method also uses the saner `null` return value + * when there is no cause. + */ +VError.prototype.cause = function ve_cause() +{ + var cause = VError.cause(this); + return (cause === null ? undefined : cause); +}; + +/* + * Static methods + * + * These class-level methods are provided so that callers can use them on + * instances of Errors that are not VErrors. New interfaces should be provided + * only using static methods to eliminate the class of programming mistake where + * people fail to check whether the Error object has the corresponding methods. + */ + +VError.cause = function (err) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + return (mod_isError(err.jse_cause) ? err.jse_cause : null); +}; + +VError.info = function (err) +{ + var rv, cause, k; + + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + cause = VError.cause(err); + if (cause !== null) { + rv = VError.info(cause); + } else { + rv = {}; + } + + if (typeof (err.jse_info) == 'object' && err.jse_info !== null) { + for (k in err.jse_info) { + rv[k] = err.jse_info[k]; + } + } + + return (rv); +}; + +VError.findCauseByName = function (err, name) +{ + var cause; + + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + mod_assertplus.string(name, 'name'); + mod_assertplus.ok(name.length > 0, 'name cannot be empty'); + + for (cause = err; cause !== null; cause = VError.cause(cause)) { + mod_assertplus.ok(mod_isError(cause)); + if (cause.name == name) { + return (cause); + } + } + + return (null); +}; + +VError.hasCauseWithName = function (err, name) +{ + return (VError.findCauseByName(err, name) !== null); +}; + +VError.fullStack = function (err) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + + var cause = VError.cause(err); + + if (cause) { + return (err.stack + '\ncaused by: ' + VError.fullStack(cause)); + } + + return (err.stack); +}; + +VError.errorFromList = function (errors) +{ + mod_assertplus.arrayOfObject(errors, 'errors'); + + if (errors.length === 0) { + return (null); + } + + errors.forEach(function (e) { + mod_assertplus.ok(mod_isError(e)); + }); + + if (errors.length == 1) { + return (errors[0]); + } + + return (new MultiError(errors)); +}; + +VError.errorForEach = function (err, func) +{ + mod_assertplus.ok(mod_isError(err), 'err must be an Error'); + mod_assertplus.func(func, 'func'); + + if (err instanceof MultiError) { + err.errors().forEach(function iterError(e) { func(e); }); + } else { + func(err); + } +}; + + +/* + * SError is like VError, but stricter about types. You cannot pass "null" or + * "undefined" as string arguments to the formatter. + */ +function SError() +{ + var args, obj, parsed, options; + + args = Array.prototype.slice.call(arguments, 0); + if (!(this instanceof SError)) { + obj = Object.create(SError.prototype); + SError.apply(obj, arguments); + return (obj); + } + + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': true + }); + + options = parsed.options; + VError.call(this, options, '%s', parsed.shortmessage); + + return (this); +} + +/* + * We don't bother setting SError.prototype.name because once constructed, + * SErrors are just like VErrors. + */ +mod_util.inherits(SError, VError); + + +/* + * Represents a collection of errors for the purpose of consumers that generally + * only deal with one error. Callers can extract the individual errors + * contained in this object, but may also just treat it as a normal single + * error, in which case a summary message will be printed. + */ +function MultiError(errors) +{ + mod_assertplus.array(errors, 'list of errors'); + mod_assertplus.ok(errors.length > 0, 'must be at least one error'); + this.ase_errors = errors; + + VError.call(this, { + 'cause': errors[0] + }, 'first of %d error%s', errors.length, errors.length == 1 ? '' : 's'); +} + +mod_util.inherits(MultiError, VError); +MultiError.prototype.name = 'MultiError'; + +MultiError.prototype.errors = function me_errors() +{ + return (this.ase_errors.slice(0)); +}; + + +/* + * See README.md for reference details. + */ +function WError() +{ + var args, obj, parsed, options; + + args = Array.prototype.slice.call(arguments, 0); + if (!(this instanceof WError)) { + obj = Object.create(WError.prototype); + WError.apply(obj, args); + return (obj); + } + + parsed = parseConstructorArguments({ + 'argv': args, + 'strict': false + }); + + options = parsed.options; + options['skipCauseMessage'] = true; + VError.call(this, options, '%s', parsed.shortmessage); + + return (this); +} + +mod_util.inherits(WError, VError); +WError.prototype.name = 'WError'; + +WError.prototype.toString = function we_toString() +{ + var str = (this.hasOwnProperty('name') && this.name || + this.constructor.name || this.constructor.prototype.name); + if (this.message) + str += ': ' + this.message; + if (this.jse_cause && this.jse_cause.message) + str += '; caused by ' + this.jse_cause.toString(); + + return (str); +}; + +/* + * For purely historical reasons, WError's cause() function allows you to set + * the cause. + */ +WError.prototype.cause = function we_cause(c) +{ + if (mod_isError(c)) + this.jse_cause = c; + + return (this.jse_cause); +}; diff --git a/packages/字体精简工具/node_modules/verror/package.json b/packages/字体精简工具/node_modules/verror/package.json new file mode 100644 index 0000000..07d5793 --- /dev/null +++ b/packages/字体精简工具/node_modules/verror/package.json @@ -0,0 +1,51 @@ +{ + "_from": "verror@1.10.0", + "_id": "verror@1.10.0", + "_inBundle": false, + "_integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "_location": "/verror", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "verror@1.10.0", + "name": "verror", + "escapedName": "verror", + "rawSpec": "1.10.0", + "saveSpec": null, + "fetchSpec": "1.10.0" + }, + "_requiredBy": [ + "/jsprim" + ], + "_resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", + "_shasum": "3a105ca17053af55d6e270c1f8288682e18da400", + "_spec": "verror@1.10.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\jsprim", + "bugs": { + "url": "https://github.com/davepacheco/node-verror/issues" + }, + "bundleDependencies": false, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "deprecated": false, + "description": "richer JavaScript errors", + "engines": [ + "node >=0.6.0" + ], + "homepage": "https://github.com/davepacheco/node-verror#readme", + "license": "MIT", + "main": "./lib/verror.js", + "name": "verror", + "repository": { + "type": "git", + "url": "git://github.com/davepacheco/node-verror.git" + }, + "scripts": { + "test": "make test" + }, + "version": "1.10.0" +} diff --git a/packages/字体精简工具/node_modules/vinyl-fs/LICENSE b/packages/字体精简工具/node_modules/vinyl-fs/LICENSE new file mode 100644 index 0000000..6355a4b --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2017 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-fs/README.md b/packages/字体精简工具/node_modules/vinyl-fs/README.md new file mode 100644 index 0000000..786ad1b --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/README.md @@ -0,0 +1,341 @@ +

+ + + +

+ +# vinyl-fs + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +[Vinyl][vinyl] adapter for the file system. + +## What is Vinyl? + +[Vinyl][vinyl] is a very simple metadata object that describes a file. When you think of a file, two attributes come to mind: `path` and `contents`. These are the main attributes on a [Vinyl][vinyl] object. A file does not necessarily represent something on your computer’s file system. You have files on S3, FTP, Dropbox, Box, CloudThingly.io and other services. [Vinyl][vinyl] can be used to describe files from all of these sources. + +## What is a Vinyl Adapter? + +While Vinyl provides a clean way to describe a file, we now need a way to access these files. Each file source needs what we call a "Vinyl adapter". A Vinyl adapter simply exposes a `src(globs)` and a `dest(folder)` method. Each return a stream. The `src` stream produces Vinyl objects, and the `dest` stream consumes Vinyl objects. Vinyl adapters can expose extra methods that might be specific to their input/output medium, such as the `symlink` method `vinyl-fs` provides. + +## Usage + +```javascript +var map = require('map-stream'); +var vfs = require('vinyl-fs'); + +var log = function(file, cb) { + console.log(file.path); + cb(null, file); +}; + +vfs.src(['./js/**/*.js', '!./js/vendor/*.js']) + .pipe(map(log)) + .pipe(vfs.dest('./output')); +``` + +## API + +### `src(globs[, options])` + +Takes a glob string or an array of glob strings as the first argument and an options object as the second. +Returns a stream of [vinyl] `File` objects. + +__Note: UTF-8 BOM will be removed from all UTF-8 files read with `.src` unless disabled in the options.__ + +#### Globs + +Globs are executed in order, so negations should follow positive globs. + +For example: + +```js +fs.src(['!b*', '*']) +``` + +would not exclude any files, but the following would exclude all files starting with "b": + +```js +fs.src(['*', '!b*']) +``` + +#### Options + +- Values passed to the options must be of the expected type, otherwise they will be ignored. +- All options can be passed a function instead of a value. The function will be called with the [vinyl] `File` object as its only argument and must return a value of the expected type for that option. + +##### `options.buffer` + +Whether or not you want to buffer the file contents into memory. Setting to `false` will make `file.contents` a paused Stream. + +Type: `Boolean` + +Default: `true` + +##### `options.read` + +Whether or not you want the file to be read at all. Useful for stuff like removing files. Setting to `false` will make `file.contents = null` and will disable writing the file to disk via `.dest()`. + +Type: `Boolean` + +Default: `true` + +##### `options.since` + +Only streams files that have been modified since the time specified. + +Type: `Date` or `Number` + +Default: `undefined` + +##### `options.removeBOM` + +Causes the BOM to be removed on UTF-8 encoded files. Set to `false` if you need the BOM for some reason. + +Type: `Boolean` + +Default: `true` + +##### `options.sourcemaps` + +Enables sourcemap support on files passed through the stream. Will load inline sourcemaps and resolve sourcemap links from files. + +Type: `Boolean` + +Default: `false` + +##### `options.resolveSymlinks` + +Whether or not to recursively resolve symlinks to their targets. Set to `false` to preserve them as symlinks and make `file.symlink` equal the original symlink's target path. + +Type: `Boolean` + +Default: `true` + +##### `options.dot` + +Whether or not you want globs to match on dot files (e.g. `.gitignore`). + +__Note: This option is not resolved from a function because it is passed verbatim to node-glob.__ + +Type: `Boolean` + +Default: `false` + +##### other + +Any glob-related options are documented in [glob-stream] and [node-glob] and are forwarded verbatim. + +### `dest(folder[, options])` + +Takes a folder path string or a function as the first argument and an options object as the second. If given a function, it will be called with each [vinyl] `File` object and must return a folder path. +Returns a stream that accepts [vinyl] `File` objects, writes them to disk at the folder/cwd specified, and passes them downstream so you can keep piping these around. + +Once the file is written to disk, an attempt is made to determine if the `stat.mode`, `stat.mtime` and `stat.atime` of the [vinyl] `File` object differ from the file on the filesystem. +If they differ and the running process owns the file, the corresponding filesystem metadata is updated. +If they don't differ or the process doesn't own the file, the attempt is skipped silently. +__This functionality is disabled on Windows operating systems or any other OS that doesn't support `process.getuid` or `process.geteuid` in node. This is due to Windows having very unexpected results through usage of `fs.fchmod` and `fs.futimes`.__ + +__Note: The `fs.futimes()` method internally converts `stat.mtime` and `stat.atime` timestamps to seconds; this division by `1000` may cause some loss of precision in 32-bit Node.js.__ + +If the file has a `symlink` attribute specifying a target path, then a symlink will be created. + +__Note: The file will be modified after being written to this stream.__ + - `cwd`, `base`, and `path` will be overwritten to match the folder. + - `stat` will be updated to match the file on the filesystem. + - `contents` will have it's position reset to the beginning if it is a stream. + +#### Options + +- Values passed to the options must be of the expected type, otherwise they will be ignored. +- All options can be passed a function instead of a value. The function will be called with the [vinyl] `File` object as its only argument and must return a value of the expected type for that option. + +##### `options.cwd` + +The working directory the folder is relative to. + +Type: `String` + +Default: `process.cwd()` + +##### `options.mode` + +The mode the files should be created with. This option is only resolved if the [vinyl] `File` is not symbolic. + +Type: `Number` + +Default: The `mode` of the input file (`file.stat.mode`) if any, or the process mode if the input file has no `mode` property. + +##### `options.dirMode` + +The mode directories should be created with. + +Type: `Number` + +Default: The process `mode`. + +##### `options.overwrite` + +Whether or not existing files with the same path should be overwritten. + +Type: `Boolean` + +Default: `true` (always overwrite existing files) + +##### `options.append` + +Whether or not new data should be appended after existing file contents (if any). + +Type: `Boolean` + +Default: `false` (always replace existing contents, if any) + +##### `options.sourcemaps` + +Enables sourcemap support on files passed through the stream. Will write inline soucemaps if specified as `true`. +Specifying a `String` path will write external sourcemaps at the given path. + +Examples: + +```js +// Write as inline comments +vfs.dest('./', { sourcemaps: true }); + +// Write as files in the same folder +vfs.dest('./', { sourcemaps: '.' }); +``` + +Type: `Boolean` or `String` + +Default: `undefined` (do not write sourcemaps) + +##### `options.relativeSymlinks` + +When creating a symlink, whether or not the created symlink should be relative. If `false`, the symlink will be absolute. + +__Note: This option will be ignored if a `junction` is being created, as they must be absolute.__ + +Type: `Boolean` + +Default: `false` + +##### `options.useJunctions` + +When creating a symlink, whether or not a directory symlink should be created as a `junction`. +This option is only relevant on Windows and ignored elsewhere. Please refer to the [Symbolic Links on Windows][symbolic-caveats] section below. + +Type: `Boolean` + +Default: `true` + +### `symlink(folder[, options])` + +Takes a folder path string or a function as the first argument and an options object as the second. If given a function, it will be called with each [vinyl] `File` object and must return a folder path. +Returns a stream that accepts [vinyl] `File` objects, creates a symbolic link (i.e. symlink) at the folder/cwd specified, and passes them downstream so you can keep piping these around. + +__Note: The file will be modified after being written to this stream.__ + - `cwd`, `base`, and `path` will be overwritten to match the folder. + - `stat` will be updated to match the symlink on the filesystem. + - `contents` will be set to `null`. + - `symlink` will be added or replaced to be the original path. + +__Note: On Windows, directory links are created using Junctions by default. Use the `useJunctions` option to disable this behavior.__ + +#### Options + +- Values passed to the options must be of the expected type, otherwise they will be ignored. +- All options can be passed a function instead of a value. The function will be called with the [vinyl] `File` object as its only argument and must return a value of the expected type for that option. + +##### `options.cwd` + +The working directory the folder is relative to. + +Type: `String` + +Default: `process.cwd()` + +##### `options.dirMode` + +The mode directories should be created with. + +Type: `Number` + +Default: The process mode. + +##### `options.overwrite` + +Whether or not existing files with the same path should be overwritten. + +Type: `Boolean` + +Default: `true` (always overwrite existing files) + +##### `options.relativeSymlinks` + +Whether or not the created symlinks should be relative. If `false`, the symlink will be absolute. + +__Note: This option will be ignored if a `junction` is being created, as they must be absolute.__ + +Type: `Boolean` + +Default: `false` + +##### `options.useJunctions` + +When creating a symlink, whether or not a directory symlink should be created as a `junction`. +This option is only relevant on Windows and ignored elsewhere. Please refer to the [Symbolic Links on Windows][symbolic-caveats] section below. + +Type: `Boolean` + +Default: `true` + +#### Symbolic Links on Windows + +When creating symbolic links on Windows, we pass a `type` argument to Node's +`fs` module which specifies the kind of target we link to (one of `'file'`, +`'dir'` or `'junction'`). Specifically, this will be `'file'` when the target +is a regular file, `'junction'` if the target is a directory, or `'dir'` if +the target is a directory and the user overrides the `useJunctions` option +default. + +However, if the user tries to make a "dangling" link (pointing to a non-existent +target) we won't be able to determine automatically which type we should use. +In these cases, `vinyl-fs` will behave slightly differently depending on +whether the dangling link is being created via `symlink()` or via `dest()`. + +For dangling links created via `symlink()`, the incoming vinyl represents the +target and so we will look to its stats to guess the desired type. In +particular, if `isDirectory()` returns false then we'll create a `'file'` type +link, otherwise we will create a `'junction'` or a `'dir'` type link depending +on the value of the `useJunctions` option. + +For dangling links created via `dest()`, the incoming vinyl represents the link - +typically read off disk via `src()` with the `resolveSymlinks` option set to +false. In this case, we won't be able to make any reasonable guess as to the +type of link and we default to using `'file'`, which may cause unexpected behavior +if you are creating a "dangling" link to a directory. It is advised to avoid this +scenario. + + +[symbolic-caveats]: #symbolic-links-on-windows +[glob-stream]: https://github.com/gulpjs/glob-stream +[node-glob]: https://github.com/isaacs/node-glob +[gaze]: https://github.com/shama/gaze +[glob-watcher]: https://github.com/wearefractal/glob-watcher +[vinyl]: https://github.com/wearefractal/vinyl + +[downloads-image]: http://img.shields.io/npm/dm/vinyl-fs.svg +[npm-url]: https://www.npmjs.com/package/vinyl-fs +[npm-image]: http://img.shields.io/npm/v/vinyl-fs.svg + +[travis-url]: https://travis-ci.org/gulpjs/vinyl-fs +[travis-image]: http://img.shields.io/travis/gulpjs/vinyl-fs.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/vinyl-fs +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/vinyl-fs.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl-fs +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/vinyl-fs/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/packages/字体精简工具/node_modules/vinyl-fs/index.js b/packages/字体精简工具/node_modules/vinyl-fs/index.js new file mode 100644 index 0000000..acdeac2 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/index.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = { + src: require('./lib/src'), + dest: require('./lib/dest'), + symlink: require('./lib/symlink'), +}; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/constants.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/constants.js new file mode 100644 index 0000000..f0c2825 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/constants.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = { + MASK_MODE: parseInt('7777', 8), + DEFAULT_FILE_MODE: parseInt('0666', 8), +}; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/index.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/index.js new file mode 100644 index 0000000..f45dd61 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/index.js @@ -0,0 +1,45 @@ +'use strict'; + +var lead = require('lead'); +var pumpify = require('pumpify'); +var mkdirpStream = require('fs-mkdirp-stream'); +var createResolver = require('resolve-options'); + +var config = require('./options'); +var prepare = require('./prepare'); +var sourcemap = require('./sourcemap'); +var writeContents = require('./write-contents'); + +var folderConfig = { + outFolder: { + type: 'string', + }, +}; + +function dest(outFolder, opt) { + if (!outFolder) { + throw new Error('Invalid dest() folder argument.' + + ' Please specify a non-empty string or a function.'); + } + + var optResolver = createResolver(config, opt); + var folderResolver = createResolver(folderConfig, { outFolder: outFolder }); + + function dirpath(file, callback) { + var dirMode = optResolver.resolve('dirMode', file); + + callback(null, file.dirname, dirMode); + } + + var saveStream = pumpify.obj( + prepare(folderResolver, optResolver), + sourcemap(optResolver), + mkdirpStream.obj(dirpath), + writeContents(optResolver) + ); + + // Sink the output stream to start flowing + return lead(saveStream); +} + +module.exports = dest; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/options.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/options.js new file mode 100644 index 0000000..d8c6d76 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/options.js @@ -0,0 +1,41 @@ +'use strict'; + +var config = { + cwd: { + type: 'string', + default: process.cwd, + }, + mode: { + type: 'number', + default: function(file) { + return file.stat ? file.stat.mode : null; + }, + }, + dirMode: { + type: 'number', + }, + overwrite: { + type: 'boolean', + default: true, + }, + append: { + type: 'boolean', + default: false, + }, + sourcemaps: { + type: ['string', 'boolean'], + default: false, + }, + // Symlink options + relativeSymlinks: { + type: 'boolean', + default: false, + }, + // This option is ignored on non-Windows platforms + useJunctions: { + type: 'boolean', + default: true, + }, +}; + +module.exports = config; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/prepare.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/prepare.js new file mode 100644 index 0000000..b3ea3d4 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/prepare.js @@ -0,0 +1,48 @@ +'use strict'; + +var path = require('path'); + +var fs = require('graceful-fs'); +var Vinyl = require('vinyl'); +var through = require('through2'); + +function prepareWrite(folderResolver, optResolver) { + if (!folderResolver) { + throw new Error('Invalid output folder'); + } + + function normalize(file, enc, cb) { + if (!Vinyl.isVinyl(file)) { + return cb(new Error('Received a non-Vinyl object in `dest()`')); + } + + // TODO: Remove this after people upgrade vinyl/transition from gulp-util + if (typeof file.isSymbolic !== 'function') { + file = new Vinyl(file); + } + + var outFolderPath = folderResolver.resolve('outFolder', file); + if (!outFolderPath) { + return cb(new Error('Invalid output folder')); + } + var cwd = path.resolve(optResolver.resolve('cwd', file)); + var basePath = path.resolve(cwd, outFolderPath); + var writePath = path.resolve(basePath, file.relative); + + // Wire up new properties + file.cwd = cwd; + file.base = basePath; + file.path = writePath; + if (!file.isSymbolic()) { + var mode = optResolver.resolve('mode', file); + file.stat = (file.stat || new fs.Stats()); + file.stat.mode = mode; + } + + cb(null, file); + } + + return through.obj(normalize); +} + +module.exports = prepareWrite; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/sourcemap.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/sourcemap.js new file mode 100644 index 0000000..c6a8961 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/sourcemap.js @@ -0,0 +1,38 @@ +'use strict'; + +var through = require('through2'); +var sourcemap = require('vinyl-sourcemap'); + +function sourcemapStream(optResolver) { + + function saveSourcemap(file, enc, callback) { + var self = this; + + var srcMap = optResolver.resolve('sourcemaps', file); + + if (!srcMap) { + return callback(null, file); + } + + var srcMapLocation = (typeof srcMap === 'string' ? srcMap : undefined); + + sourcemap.write(file, srcMapLocation, onWrite); + + function onWrite(sourcemapErr, updatedFile, sourcemapFile) { + if (sourcemapErr) { + return callback(sourcemapErr); + } + + self.push(updatedFile); + if (sourcemapFile) { + self.push(sourcemapFile); + } + + callback(); + } + } + + return through.obj(saveSourcemap); +} + +module.exports = sourcemapStream; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/index.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/index.js new file mode 100644 index 0000000..202a95f --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/index.js @@ -0,0 +1,59 @@ +'use strict'; + +var through = require('through2'); + +var writeDir = require('./write-dir'); +var writeStream = require('./write-stream'); +var writeBuffer = require('./write-buffer'); +var writeSymbolicLink = require('./write-symbolic-link'); + +var fo = require('../../file-operations'); + +function writeContents(optResolver) { + + function writeFile(file, enc, callback) { + // Write it as a symlink + if (file.isSymbolic()) { + return writeSymbolicLink(file, optResolver, onWritten); + } + + // If directory then mkdirp it + if (file.isDirectory()) { + return writeDir(file, optResolver, onWritten); + } + + // Stream it to disk yo + if (file.isStream()) { + return writeStream(file, optResolver, onWritten); + } + + // Write it like normal + if (file.isBuffer()) { + return writeBuffer(file, optResolver, onWritten); + } + + // If no contents then do nothing + if (file.isNull()) { + return onWritten(); + } + + // This is invoked by the various writeXxx modules when they've finished + // writing the contents. + function onWritten(writeErr) { + var flags = fo.getFlags({ + overwrite: optResolver.resolve('overwrite', file), + append: optResolver.resolve('append', file), + }); + if (fo.isFatalOverwriteError(writeErr, flags)) { + return callback(writeErr); + } + + callback(null, file); + } + + } + + return through.obj(writeFile); +} + +module.exports = writeContents; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-buffer.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-buffer.js new file mode 100644 index 0000000..794869e --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-buffer.js @@ -0,0 +1,31 @@ +'use strict'; + +var fo = require('../../file-operations'); + +function writeBuffer(file, optResolver, onWritten) { + var flags = fo.getFlags({ + overwrite: optResolver.resolve('overwrite', file), + append: optResolver.resolve('append', file), + }); + var opt = { + mode: file.stat.mode, + flags: flags, + }; + + fo.writeFile(file.path, file.contents, opt, onWriteFile); + + function onWriteFile(writeErr, fd) { + if (writeErr) { + return fo.closeFd(writeErr, fd, onWritten); + } + + fo.updateMetadata(fd, file, onUpdate); + + function onUpdate(updateErr) { + fo.closeFd(updateErr, fd, onWritten); + } + } + +} + +module.exports = writeBuffer; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-dir.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-dir.js new file mode 100644 index 0000000..d182728 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-dir.js @@ -0,0 +1,51 @@ +'use strict'; + +var fs = require('graceful-fs'); + +var mkdirp = require('fs-mkdirp-stream/mkdirp'); + +var fo = require('../../file-operations'); + +function writeDir(file, optResolver, onWritten) { + mkdirp(file.path, file.stat.mode, onMkdirp); + + function onMkdirp(mkdirpErr) { + if (mkdirpErr) { + return onWritten(mkdirpErr); + } + + fs.open(file.path, 'r', onOpen); + } + + function onOpen(openErr, fd) { + // If we don't have access, just move along + if (isInaccessible(openErr)) { + return fo.closeFd(null, fd, onWritten); + } + + if (openErr) { + return fo.closeFd(openErr, fd, onWritten); + } + + fo.updateMetadata(fd, file, onUpdate); + + function onUpdate(updateErr) { + fo.closeFd(updateErr, fd, onWritten); + } + } + +} + +function isInaccessible(err) { + if (!err) { + return false; + } + + if (err.code === 'EACCES') { + return true; + } + + return false; +} + +module.exports = writeDir; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-stream.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-stream.js new file mode 100644 index 0000000..2a48304 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-stream.js @@ -0,0 +1,62 @@ +'use strict'; + +var fo = require('../../file-operations'); +var readStream = require('../../src/read-contents/read-stream'); + +function writeStream(file, optResolver, onWritten) { + var flags = fo.getFlags({ + overwrite: optResolver.resolve('overwrite', file), + append: optResolver.resolve('append', file), + }); + var opt = { + mode: file.stat.mode, + // TODO: need to test this + flags: flags, + }; + + // TODO: is this the best API? + var outStream = fo.createWriteStream(file.path, opt, onFlush); + + file.contents.once('error', onComplete); + outStream.once('error', onComplete); + outStream.once('finish', onComplete); + + // TODO: should this use a clone? + file.contents.pipe(outStream); + + function onComplete(streamErr) { + // Cleanup event handlers before closing + file.contents.removeListener('error', onComplete); + outStream.removeListener('error', onComplete); + outStream.removeListener('finish', onComplete); + + // Need to guarantee the fd is closed before forwarding the error + outStream.once('close', onClose); + outStream.end(); + + function onClose(closeErr) { + onWritten(streamErr || closeErr); + } + } + + // Cleanup + function onFlush(fd, callback) { + // TODO: removing this before readStream because it replaces the stream + file.contents.removeListener('error', onComplete); + + // TODO: this is doing sync stuff & the callback seems unnecessary + // TODO: Replace the contents stream or use a clone? + readStream(file, complete); + + function complete() { + if (typeof fd !== 'number') { + return callback(); + } + + fo.updateMetadata(fd, file, callback); + } + } + +} + +module.exports = writeStream; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-symbolic-link.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-symbolic-link.js new file mode 100644 index 0000000..411a8bd --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/dest/write-contents/write-symbolic-link.js @@ -0,0 +1,77 @@ +'use strict'; + +var os = require('os'); +var path = require('path'); + +var fo = require('../../file-operations'); + +var isWindows = (os.platform() === 'win32'); + +function writeSymbolicLink(file, optResolver, onWritten) { + if (!file.symlink) { + return onWritten(new Error('Missing symlink property on symbolic vinyl')); + } + + var isRelative = optResolver.resolve('relativeSymlinks', file); + var flags = fo.getFlags({ + overwrite: optResolver.resolve('overwrite', file), + append: optResolver.resolve('append', file), + }); + + if (!isWindows) { + // On non-Windows, just use 'file' + return createLinkWithType('file'); + } + + fo.reflectStat(file.symlink, file, onReflect); + + function onReflect(statErr) { + if (statErr && statErr.code !== 'ENOENT') { + return onWritten(statErr); + } + + // This option provides a way to create a Junction instead of a + // Directory symlink on Windows. This comes with the following caveats: + // * NTFS Junctions cannot be relative. + // * NTFS Junctions MUST be directories. + // * NTFS Junctions must be on the same file system. + // * Most products CANNOT detect a directory is a Junction: + // This has the side effect of possibly having a whole directory + // deleted when a product is deleting the Junction directory. + // For example, JetBrains product lines will delete the entire contents + // of the TARGET directory because the product does not realize it's + // a symlink as the JVM and Node return false for isSymlink. + + // This function is Windows only, so we don't need to check again + var useJunctions = optResolver.resolve('useJunctions', file); + + var dirType = useJunctions ? 'junction' : 'dir'; + // Dangling links are always 'file' + var type = !statErr && file.isDirectory() ? dirType : 'file'; + + createLinkWithType(type); + } + + function createLinkWithType(type) { + // This is done after prepare() to use the adjusted file.base property + if (isRelative && type !== 'junction') { + file.symlink = path.relative(file.base, file.symlink); + } + + var opts = { + flags: flags, + type: type, + }; + fo.symlink(file.symlink, file.path, opts, onSymlink); + + function onSymlink(symlinkErr) { + if (symlinkErr) { + return onWritten(symlinkErr); + } + + fo.reflectLinkStat(file.path, file, onWritten); + } + } +} + +module.exports = writeSymbolicLink; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/file-operations.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/file-operations.js new file mode 100644 index 0000000..b0aa31b --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/file-operations.js @@ -0,0 +1,496 @@ +'use strict'; + +var util = require('util'); + +var fs = require('graceful-fs'); +var assign = require('object.assign'); +var date = require('value-or-function').date; +var Writable = require('readable-stream').Writable; + +var constants = require('./constants'); + +var APPEND_MODE_REGEXP = /a/; + +function closeFd(propagatedErr, fd, callback) { + if (typeof fd !== 'number') { + return callback(propagatedErr); + } + + fs.close(fd, onClosed); + + function onClosed(closeErr) { + if (propagatedErr || closeErr) { + return callback(propagatedErr || closeErr); + } + + callback(); + } +} + +function isValidUnixId(id) { + if (typeof id !== 'number') { + return false; + } + + if (id < 0) { + return false; + } + + return true; +} + +function getFlags(options) { + var flags = !options.append ? 'w' : 'a'; + if (!options.overwrite) { + flags += 'x'; + } + return flags; +} + +function isFatalOverwriteError(err, flags) { + if (!err) { + return false; + } + + if (err.code === 'EEXIST' && flags[1] === 'x') { + // Handle scenario for file overwrite failures. + return false; + } + + // Otherwise, this is a fatal error + return true; +} + +function isFatalUnlinkError(err) { + if (!err || err.code === 'ENOENT') { + return false; + } + + return true; +} + +function getModeDiff(fsMode, vinylMode) { + var modeDiff = 0; + + if (typeof vinylMode === 'number') { + modeDiff = (vinylMode ^ fsMode) & constants.MASK_MODE; + } + + return modeDiff; +} + +function getTimesDiff(fsStat, vinylStat) { + + var mtime = date(vinylStat.mtime) || 0; + if (!mtime) { + return; + } + + var atime = date(vinylStat.atime) || 0; + if (+mtime === +fsStat.mtime && + +atime === +fsStat.atime) { + return; + } + + if (!atime) { + atime = date(fsStat.atime) || undefined; + } + + var timesDiff = { + mtime: vinylStat.mtime, + atime: atime, + }; + + return timesDiff; +} + +function getOwnerDiff(fsStat, vinylStat) { + if (!isValidUnixId(vinylStat.uid) && + !isValidUnixId(vinylStat.gid)) { + return; + } + + if ((!isValidUnixId(fsStat.uid) && !isValidUnixId(vinylStat.uid)) || + (!isValidUnixId(fsStat.gid) && !isValidUnixId(vinylStat.gid))) { + return; + } + + var uid = fsStat.uid; // Default to current uid. + if (isValidUnixId(vinylStat.uid)) { + uid = vinylStat.uid; + } + + var gid = fsStat.gid; // Default to current gid. + if (isValidUnixId(vinylStat.gid)) { + gid = vinylStat.gid; + } + + if (uid === fsStat.uid && + gid === fsStat.gid) { + return; + } + + var ownerDiff = { + uid: uid, + gid: gid, + }; + + return ownerDiff; +} + +function isOwner(fsStat) { + var hasGetuid = (typeof process.getuid === 'function'); + var hasGeteuid = (typeof process.geteuid === 'function'); + + // If we don't have either, assume we don't have permissions. + // This should only happen on Windows. + // Windows basically noops fchmod and errors on futimes called on directories. + if (!hasGeteuid && !hasGetuid) { + return false; + } + + var uid; + if (hasGeteuid) { + uid = process.geteuid(); + } else { + uid = process.getuid(); + } + + if (fsStat.uid !== uid && uid !== 0) { + return false; + } + + return true; +} + +function reflectStat(path, file, callback) { + // Set file.stat to the reflect current state on disk + fs.stat(path, onStat); + + function onStat(statErr, stat) { + if (statErr) { + return callback(statErr); + } + + file.stat = stat; + callback(); + } +} + +function reflectLinkStat(path, file, callback) { + // Set file.stat to the reflect current state on disk + fs.lstat(path, onLstat); + + function onLstat(lstatErr, stat) { + if (lstatErr) { + return callback(lstatErr); + } + + file.stat = stat; + callback(); + } +} + +function updateMetadata(fd, file, callback) { + + fs.fstat(fd, onStat); + + function onStat(statErr, stat) { + if (statErr) { + return callback(statErr); + } + + // Check if mode needs to be updated + var modeDiff = getModeDiff(stat.mode, file.stat.mode); + + // Check if atime/mtime need to be updated + var timesDiff = getTimesDiff(stat, file.stat); + + // Check if uid/gid need to be updated + var ownerDiff = getOwnerDiff(stat, file.stat); + + // Set file.stat to the reflect current state on disk + assign(file.stat, stat); + + // Nothing to do + if (!modeDiff && !timesDiff && !ownerDiff) { + return callback(); + } + + // Check access, `futimes`, `fchmod` & `fchown` only work if we own + // the file, or if we are effectively root (`fchown` only when root). + if (!isOwner(stat)) { + return callback(); + } + + if (modeDiff) { + return mode(); + } + if (timesDiff) { + return times(); + } + owner(); + + function mode() { + var mode = stat.mode ^ modeDiff; + + fs.fchmod(fd, mode, onFchmod); + + function onFchmod(fchmodErr) { + if (!fchmodErr) { + file.stat.mode = mode; + } + if (timesDiff) { + return times(fchmodErr); + } + if (ownerDiff) { + return owner(fchmodErr); + } + callback(fchmodErr); + } + } + + function times(propagatedErr) { + fs.futimes(fd, timesDiff.atime, timesDiff.mtime, onFutimes); + + function onFutimes(futimesErr) { + if (!futimesErr) { + file.stat.atime = timesDiff.atime; + file.stat.mtime = timesDiff.mtime; + } + if (ownerDiff) { + return owner(propagatedErr || futimesErr); + } + callback(propagatedErr || futimesErr); + } + } + + function owner(propagatedErr) { + fs.fchown(fd, ownerDiff.uid, ownerDiff.gid, onFchown); + + function onFchown(fchownErr) { + if (!fchownErr) { + file.stat.uid = ownerDiff.uid; + file.stat.gid = ownerDiff.gid; + } + callback(propagatedErr || fchownErr); + } + } + } +} + +function symlink(srcPath, destPath, opts, callback) { + // Because fs.symlink does not allow atomic overwrite option with flags, we + // delete and recreate if the link already exists and overwrite is true. + if (opts.flags === 'w') { + // TODO What happens when we call unlink with windows junctions? + fs.unlink(destPath, onUnlink); + } else { + fs.symlink(srcPath, destPath, opts.type, onSymlink); + } + + function onUnlink(unlinkErr) { + if (isFatalUnlinkError(unlinkErr)) { + return callback(unlinkErr); + } + fs.symlink(srcPath, destPath, opts.type, onSymlink); + } + + function onSymlink(symlinkErr) { + if (isFatalOverwriteError(symlinkErr, opts.flags)) { + return callback(symlinkErr); + } + callback(); + } +} + +/* + Custom writeFile implementation because we need access to the + file descriptor after the write is complete. + Most of the implementation taken from node core. + */ +function writeFile(filepath, data, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + if (!Buffer.isBuffer(data)) { + return callback(new TypeError('Data must be a Buffer')); + } + + if (!options) { + options = {}; + } + + // Default the same as node + var mode = options.mode || constants.DEFAULT_FILE_MODE; + var flags = options.flags || 'w'; + var position = APPEND_MODE_REGEXP.test(flags) ? null : 0; + + fs.open(filepath, flags, mode, onOpen); + + function onOpen(openErr, fd) { + if (openErr) { + return onComplete(openErr); + } + + fs.write(fd, data, 0, data.length, position, onComplete); + + function onComplete(writeErr) { + callback(writeErr, fd); + } + } +} + +function createWriteStream(path, options, flush) { + return new WriteStream(path, options, flush); +} + +// Taken from node core and altered to receive a flush function and simplified +// To be used for cleanup (like updating times/mode/etc) +function WriteStream(path, options, flush) { + // Not exposed so we can avoid the case where someone doesn't use `new` + + if (typeof options === 'function') { + flush = options; + options = null; + } + + options = options || {}; + + Writable.call(this, options); + + this.flush = flush; + this.path = path; + + this.mode = options.mode || constants.DEFAULT_FILE_MODE; + this.flags = options.flags || 'w'; + + // Used by node's `fs.WriteStream` + this.fd = null; + this.start = null; + + this.open(); + + // Dispose on finish. + this.once('finish', this.close); +} + +util.inherits(WriteStream, Writable); + +WriteStream.prototype.open = function() { + var self = this; + + fs.open(this.path, this.flags, this.mode, onOpen); + + function onOpen(openErr, fd) { + if (openErr) { + self.destroy(); + self.emit('error', openErr); + return; + } + + self.fd = fd; + self.emit('open', fd); + } +}; + +// Use our `end` method since it is patched for flush +WriteStream.prototype.destroySoon = WriteStream.prototype.end; + +WriteStream.prototype._destroy = function(err, cb) { + this.close(function(err2) { + cb(err || err2); + }); +}; + +WriteStream.prototype.close = function(cb) { + var that = this; + + if (cb) { + this.once('close', cb); + } + + if (this.closed || typeof this.fd !== 'number') { + if (typeof this.fd !== 'number') { + this.once('open', closeOnOpen); + return; + } + + return process.nextTick(function() { + that.emit('close'); + }); + } + + this.closed = true; + + fs.close(this.fd, function(er) { + if (er) { + that.emit('error', er); + } else { + that.emit('close'); + } + }); + + this.fd = null; +}; + +WriteStream.prototype._final = function(callback) { + if (typeof this.flush !== 'function') { + return callback(); + } + + this.flush(this.fd, callback); +}; + +function closeOnOpen() { + this.close(); +} + +WriteStream.prototype._write = function(data, encoding, callback) { + var self = this; + + // This is from node core but I have no idea how to get code coverage on it + if (!Buffer.isBuffer(data)) { + return this.emit('error', new Error('Invalid data')); + } + + if (typeof this.fd !== 'number') { + return this.once('open', onOpen); + } + + fs.write(this.fd, data, 0, data.length, null, onWrite); + + function onOpen() { + self._write(data, encoding, callback); + } + + function onWrite(writeErr) { + if (writeErr) { + self.destroy(); + callback(writeErr); + return; + } + + callback(); + } +}; + +module.exports = { + closeFd: closeFd, + isValidUnixId: isValidUnixId, + getFlags: getFlags, + isFatalOverwriteError: isFatalOverwriteError, + isFatalUnlinkError: isFatalUnlinkError, + getModeDiff: getModeDiff, + getTimesDiff: getTimesDiff, + getOwnerDiff: getOwnerDiff, + isOwner: isOwner, + reflectStat: reflectStat, + reflectLinkStat: reflectLinkStat, + updateMetadata: updateMetadata, + symlink: symlink, + writeFile: writeFile, + createWriteStream: createWriteStream, +}; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/index.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/index.js new file mode 100644 index 0000000..6f531ce --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/index.js @@ -0,0 +1,38 @@ +'use strict'; + +var gs = require('glob-stream'); +var pumpify = require('pumpify'); +var toThrough = require('to-through'); +var isValidGlob = require('is-valid-glob'); +var createResolver = require('resolve-options'); + +var config = require('./options'); +var prepare = require('./prepare'); +var wrapVinyl = require('./wrap-vinyl'); +var sourcemap = require('./sourcemap'); +var readContents = require('./read-contents'); +var resolveSymlinks = require('./resolve-symlinks'); + +function src(glob, opt) { + var optResolver = createResolver(config, opt); + + if (!isValidGlob(glob)) { + throw new Error('Invalid glob argument: ' + glob); + } + + var streams = [ + gs(glob, opt), + wrapVinyl(optResolver), + resolveSymlinks(optResolver), + prepare(optResolver), + readContents(optResolver), + sourcemap(optResolver), + ]; + + var outputStream = pumpify.obj(streams); + + return toThrough(outputStream); +} + + +module.exports = src; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/options.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/options.js new file mode 100644 index 0000000..2d9861c --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/options.js @@ -0,0 +1,29 @@ +'use strict'; + +var config = { + buffer: { + type: 'boolean', + default: true, + }, + read: { + type: 'boolean', + default: true, + }, + since: { + type: 'date', + }, + removeBOM: { + type: 'boolean', + default: true, + }, + sourcemaps: { + type: 'boolean', + default: false, + }, + resolveSymlinks: { + type: 'boolean', + default: true, + }, +}; + +module.exports = config; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/prepare.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/prepare.js new file mode 100644 index 0000000..5fa18df --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/prepare.js @@ -0,0 +1,22 @@ +'use strict'; + +var through = require('through2'); + +function prepareRead(optResolver) { + + function normalize(file, enc, callback) { + + var since = optResolver.resolve('since', file); + + // Skip this file if since option is set and current file is too old + if (file.stat && file.stat.mtime <= since) { + return callback(); + } + + return callback(null, file); + } + + return through.obj(normalize); +} + +module.exports = prepareRead; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/index.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/index.js new file mode 100644 index 0000000..5c3117d --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/index.js @@ -0,0 +1,52 @@ +'use strict'; + +var through = require('through2'); + +var readDir = require('./read-dir'); +var readStream = require('./read-stream'); +var readBuffer = require('./read-buffer'); +var readSymbolicLink = require('./read-symbolic-link'); + +function readContents(optResolver) { + + function readFile(file, enc, callback) { + + // Skip reading contents if read option says so + var read = optResolver.resolve('read', file); + if (!read) { + return callback(null, file); + } + + // Don't fail to read a directory + if (file.isDirectory()) { + return readDir(file, optResolver, onRead); + } + + // Process symbolic links included with `resolveSymlinks` option + if (file.stat && file.stat.isSymbolicLink()) { + return readSymbolicLink(file, optResolver, onRead); + } + + // Read and pass full contents + var buffer = optResolver.resolve('buffer', file); + if (buffer) { + return readBuffer(file, optResolver, onRead); + } + + // Don't buffer anything - just pass streams + return readStream(file, optResolver, onRead); + + // This is invoked by the various readXxx modules when they've finished + // reading the contents. + function onRead(readErr) { + if (readErr) { + return callback(readErr); + } + return callback(null, file); + } + } + + return through.obj(readFile); +} + +module.exports = readContents; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-buffer.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-buffer.js new file mode 100644 index 0000000..c710833 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-buffer.js @@ -0,0 +1,25 @@ +'use strict'; + +var fs = require('graceful-fs'); +var removeBomBuffer = require('remove-bom-buffer'); + +function bufferFile(file, optResolver, onRead) { + fs.readFile(file.path, onReadFile); + + function onReadFile(readErr, data) { + if (readErr) { + return onRead(readErr); + } + + var removeBOM = optResolver.resolve('removeBOM', file); + if (removeBOM) { + file.contents = removeBomBuffer(data); + } else { + file.contents = data; + } + + onRead(); + } +} + +module.exports = bufferFile; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-dir.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-dir.js new file mode 100644 index 0000000..be7262b --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-dir.js @@ -0,0 +1,8 @@ +'use strict'; + +function readDir(file, optResolver, onRead) { + // Do nothing for now + onRead(); +} + +module.exports = readDir; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-stream.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-stream.js new file mode 100644 index 0000000..baa6e47 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-stream.js @@ -0,0 +1,31 @@ +'use strict'; + +var fs = require('graceful-fs'); +var removeBomStream = require('remove-bom-stream'); +var lazystream = require('lazystream'); +var createResolver = require('resolve-options'); + +function streamFile(file, optResolver, onRead) { + if (typeof optResolver === 'function') { + onRead = optResolver; + optResolver = createResolver(); + } + + var filePath = file.path; + + var removeBOM = optResolver.resolve('removeBOM', file); + + file.contents = new lazystream.Readable(function() { + var contents = fs.createReadStream(filePath); + + if (removeBOM) { + return contents.pipe(removeBomStream()); + } + + return contents; + }); + + onRead(); +} + +module.exports = streamFile; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-symbolic-link.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-symbolic-link.js new file mode 100644 index 0000000..47e24cd --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/read-contents/read-symbolic-link.js @@ -0,0 +1,20 @@ +'use strict'; + +var fs = require('graceful-fs'); + +function readLink(file, optResolver, onRead) { + fs.readlink(file.path, onReadlink); + + function onReadlink(readErr, target) { + if (readErr) { + return onRead(readErr); + } + + // Store the link target path + file.symlink = target; + + onRead(); + } +} + +module.exports = readLink; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/resolve-symlinks.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/resolve-symlinks.js new file mode 100644 index 0000000..d77f912 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/resolve-symlinks.js @@ -0,0 +1,36 @@ +'use strict'; + +var through = require('through2'); +var fo = require('../file-operations'); + +function resolveSymlinks(optResolver) { + + // A stat property is exposed on file objects as a (wanted) side effect + function resolveFile(file, enc, callback) { + + fo.reflectLinkStat(file.path, file, onReflect); + + function onReflect(statErr) { + if (statErr) { + return callback(statErr); + } + + if (!file.stat.isSymbolicLink()) { + return callback(null, file); + } + + var resolveSymlinks = optResolver.resolve('resolveSymlinks', file); + + if (!resolveSymlinks) { + return callback(null, file); + } + + // Get target's stats + fo.reflectStat(file.path, file, onReflect); + } + } + + return through.obj(resolveFile); +} + +module.exports = resolveSymlinks; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/sourcemap.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/sourcemap.js new file mode 100644 index 0000000..e03971f --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/sourcemap.js @@ -0,0 +1,29 @@ +'use strict'; + +var through = require('through2'); +var sourcemap = require('vinyl-sourcemap'); + +function sourcemapStream(optResolver) { + + function addSourcemap(file, enc, callback) { + var srcMap = optResolver.resolve('sourcemaps', file); + + if (!srcMap) { + return callback(null, file); + } + + sourcemap.add(file, onAdd); + + function onAdd(sourcemapErr, updatedFile) { + if (sourcemapErr) { + return callback(sourcemapErr); + } + + callback(null, updatedFile); + } + } + + return through.obj(addSourcemap); +} + +module.exports = sourcemapStream; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/src/wrap-vinyl.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/wrap-vinyl.js new file mode 100644 index 0000000..883c557 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/src/wrap-vinyl.js @@ -0,0 +1,18 @@ +'use strict'; + +var File = require('vinyl'); +var through = require('through2'); + +function wrapVinyl() { + + function wrapFile(globFile, enc, callback) { + + var file = new File(globFile); + + callback(null, file); + } + + return through.obj(wrapFile); +} + +module.exports = wrapVinyl; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/index.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/index.js new file mode 100644 index 0000000..6e835da --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/index.js @@ -0,0 +1,43 @@ +'use strict'; + +var pumpify = require('pumpify'); +var lead = require('lead'); +var mkdirpStream = require('fs-mkdirp-stream'); +var createResolver = require('resolve-options'); + +var config = require('./options'); +var prepare = require('./prepare'); +var linkFile = require('./link-file'); + +var folderConfig = { + outFolder: { + type: 'string', + }, +}; + +function symlink(outFolder, opt) { + if (!outFolder) { + throw new Error('Invalid symlink() folder argument.' + + ' Please specify a non-empty string or a function.'); + } + + var optResolver = createResolver(config, opt); + var folderResolver = createResolver(folderConfig, { outFolder: outFolder }); + + function dirpath(file, callback) { + var dirMode = optResolver.resolve('dirMode', file); + + callback(null, file.dirname, dirMode); + } + + var stream = pumpify.obj( + prepare(folderResolver, optResolver), + mkdirpStream.obj(dirpath), + linkFile(optResolver) + ); + + // Sink the stream to start flowing + return lead(stream); +} + +module.exports = symlink; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/link-file.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/link-file.js new file mode 100644 index 0000000..e1caf97 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/link-file.js @@ -0,0 +1,89 @@ +'use strict'; + +var os = require('os'); +var path = require('path'); + +var through = require('through2'); + +var fo = require('../file-operations'); + +var isWindows = (os.platform() === 'win32'); + +function linkStream(optResolver) { + + function linkFile(file, enc, callback) { + var isRelative = optResolver.resolve('relativeSymlinks', file); + var flags = fo.getFlags({ + overwrite: optResolver.resolve('overwrite', file), + append: false, + }); + + if (!isWindows) { + // On non-Windows, just use 'file' + return createLinkWithType('file'); + } + + fo.reflectStat(file.symlink, file, onReflectTarget); + + function onReflectTarget(statErr) { + if (statErr && statErr.code !== 'ENOENT') { + return callback(statErr); + } + // If target doesn't exist, the vinyl will still carry the target stats. + // Let's use those to determine which kind of dangling link to create. + + // This option provides a way to create a Junction instead of a + // Directory symlink on Windows. This comes with the following caveats: + // * NTFS Junctions cannot be relative. + // * NTFS Junctions MUST be directories. + // * NTFS Junctions must be on the same file system. + // * Most products CANNOT detect a directory is a Junction: + // This has the side effect of possibly having a whole directory + // deleted when a product is deleting the Junction directory. + // For example, JetBrains product lines will delete the entire contents + // of the TARGET directory because the product does not realize it's + // a symlink as the JVM and Node return false for isSymlink. + + // This function is Windows only, so we don't need to check again + var useJunctions = optResolver.resolve('useJunctions', file); + + var dirType = useJunctions ? 'junction' : 'dir'; + var type = !statErr && file.isDirectory() ? dirType : 'file'; + + createLinkWithType(type); + } + + function createLinkWithType(type) { + // This is done after prepare() to use the adjusted file.base property + if (isRelative && type !== 'junction') { + file.symlink = path.relative(file.base, file.symlink); + } + + var opts = { + flags: flags, + type: type, + }; + fo.symlink(file.symlink, file.path, opts, onSymlink); + } + + function onSymlink(symlinkErr) { + if (symlinkErr) { + return callback(symlinkErr); + } + + fo.reflectLinkStat(file.path, file, onReflectLink); + } + + function onReflectLink(reflectErr) { + if (reflectErr) { + return callback(reflectErr); + } + + callback(null, file); + } + } + + return through.obj(linkFile); +} + +module.exports = linkStream; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/options.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/options.js new file mode 100644 index 0000000..fd9e1c7 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/options.js @@ -0,0 +1,26 @@ +'use strict'; + +var config = { + cwd: { + type: 'string', + default: process.cwd, + }, + dirMode: { + type: 'number', + }, + overwrite: { + type: 'boolean', + default: true, + }, + relativeSymlinks: { + type: 'boolean', + default: false, + }, + // This option is ignored on non-Windows platforms + useJunctions: { + type: 'boolean', + default: true, + }, +}; + +module.exports = config; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/prepare.js b/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/prepare.js new file mode 100644 index 0000000..dd2ec1a --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/lib/symlink/prepare.js @@ -0,0 +1,51 @@ +'use strict'; + +var path = require('path'); + +var fs = require('graceful-fs'); +var Vinyl = require('vinyl'); +var through = require('through2'); + +function prepareSymlink(folderResolver, optResolver) { + if (!folderResolver) { + throw new Error('Invalid output folder'); + } + + function normalize(file, enc, cb) { + if (!Vinyl.isVinyl(file)) { + return cb(new Error('Received a non-Vinyl object in `symlink()`')); + } + + // TODO: Remove this after people upgrade vinyl/transition from gulp-util + if (typeof file.isSymbolic !== 'function') { + file = new Vinyl(file); + } + + var cwd = path.resolve(optResolver.resolve('cwd', file)); + + var outFolderPath = folderResolver.resolve('outFolder', file); + if (!outFolderPath) { + return cb(new Error('Invalid output folder')); + } + var basePath = path.resolve(cwd, outFolderPath); + var writePath = path.resolve(basePath, file.relative); + + // Wire up new properties + // Note: keep the target stats for now, we may need them in link-file + file.stat = (file.stat || new fs.Stats()); + file.cwd = cwd; + file.base = basePath; + // This is the path we are linking *TO* + file.symlink = file.path; + file.path = writePath; + // We have to set contents to null for a link + // Otherwise `isSymbolic()` returns false + file.contents = null; + + cb(null, file); + } + + return through.obj(normalize); +} + +module.exports = prepareSymlink; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/LICENSE.md b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/LICENSE.md new file mode 100644 index 0000000..146cb32 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/LICENSE.md @@ -0,0 +1,21 @@ +## The MIT License (MIT) ## + +Copyright (c) 2014 Hugh Kennedy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/README.md b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/README.md new file mode 100644 index 0000000..8b12b6f --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/README.md @@ -0,0 +1,17 @@ +# clone-stats [![Flattr this!](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=hughskennedy&url=http://github.com/hughsk/clone-stats&title=clone-stats&description=hughsk/clone-stats%20on%20GitHub&language=en_GB&tags=flattr,github,javascript&category=software)[![experimental](http://hughsk.github.io/stability-badges/dist/experimental.svg)](http://github.com/hughsk/stability-badges) # + +Safely clone node's +[`fs.Stats`](http://nodejs.org/api/fs.html#fs_class_fs_stats) instances without +losing their class methods, i.e. `stat.isDirectory()` and co. + +## Usage ## + +[![clone-stats](https://nodei.co/npm/clone-stats.png?mini=true)](https://nodei.co/npm/clone-stats) + +### `copy = require('clone-stats')(stat)` ### + +Returns a clone of the original `fs.Stats` instance (`stat`). + +## License ## + +MIT. See [LICENSE.md](http://github.com/hughsk/clone-stats/blob/master/LICENSE.md) for details. diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/index.js b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/index.js new file mode 100644 index 0000000..e797cfe --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/index.js @@ -0,0 +1,13 @@ +var Stat = require('fs').Stats + +module.exports = cloneStats + +function cloneStats(stats) { + var replacement = new Stat + + Object.keys(stats).forEach(function(key) { + replacement[key] = stats[key] + }) + + return replacement +} diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/package.json b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/package.json new file mode 100644 index 0000000..3ead893 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/package.json @@ -0,0 +1,60 @@ +{ + "_from": "clone-stats@^1.0.0", + "_id": "clone-stats@1.0.0", + "_inBundle": false, + "_integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "_location": "/vinyl-fs/clone-stats", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "clone-stats@^1.0.0", + "name": "clone-stats", + "escapedName": "clone-stats", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/vinyl-fs/vinyl" + ], + "_resolved": "https://registry.nlark.com/clone-stats/download/clone-stats-1.0.0.tgz", + "_shasum": "b3782dff8bb5474e18b9b6bf0fdfe782f8777680", + "_spec": "clone-stats@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs\\node_modules\\vinyl", + "author": { + "name": "Hugh Kennedy", + "email": "hughskennedy@gmail.com", + "url": "http://hughsk.io/" + }, + "browser": "index.js", + "bugs": { + "url": "https://github.com/hughsk/clone-stats/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Safely clone node's fs.Stats instances without losing their class methods", + "devDependencies": { + "tape": "~2.3.2" + }, + "homepage": "https://github.com/hughsk/clone-stats", + "keywords": [ + "stats", + "fs", + "clone", + "copy", + "prototype" + ], + "license": "MIT", + "main": "index.js", + "name": "clone-stats", + "repository": { + "type": "git", + "url": "git://github.com/hughsk/clone-stats.git" + }, + "scripts": { + "test": "node test" + }, + "version": "1.0.0" +} diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/test.js b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/test.js new file mode 100644 index 0000000..e4bb281 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone-stats/test.js @@ -0,0 +1,36 @@ +var test = require('tape') +var clone = require('./') +var fs = require('fs') + +test('file', function(t) { + compare(t, fs.statSync(__filename)) + t.end() +}) + +test('directory', function(t) { + compare(t, fs.statSync(__dirname)) + t.end() +}) + +function compare(t, stat) { + var copy = clone(stat) + + t.deepEqual(stat, copy, 'clone has equal properties') + t.ok(stat instanceof fs.Stats, 'original is an fs.Stat') + t.ok(copy instanceof fs.Stats, 'copy is an fs.Stat') + + ;['isDirectory' + , 'isFile' + , 'isBlockDevice' + , 'isCharacterDevice' + , 'isSymbolicLink' + , 'isFIFO' + , 'isSocket' + ].forEach(function(method) { + t.equal( + stat[method].call(stat) + , copy[method].call(copy) + , 'equal value for stat.' + method + '()' + ) + }) +} diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/.npmignore b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/.npmignore new file mode 100644 index 0000000..2ff84f0 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/.npmignore @@ -0,0 +1,4 @@ +/node_modules/ +/test.js +/.travis.yml +*.html diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/LICENSE b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/LICENSE new file mode 100644 index 0000000..cc3c87b --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/LICENSE @@ -0,0 +1,18 @@ +Copyright © 2011-2015 Paul Vorbach + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/README.md b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/README.md new file mode 100644 index 0000000..207e60a --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/README.md @@ -0,0 +1,194 @@ +# clone + +[![build status](https://secure.travis-ci.org/pvorb/clone.svg)](http://travis-ci.org/pvorb/clone) [![downloads](https://img.shields.io/npm/dt/clone.svg)](http://npm-stat.com/charts.html?package=clone) + +offers foolproof _deep cloning_ of objects, arrays, numbers, strings, maps, +sets, promises, etc. in JavaScript. + +**XSS vulnerability detected** + + +## Installation + + npm install clone + +(It also works with browserify, ender or standalone. You may want to use the +option `noParse` in browserify to reduce the resulting file size, since usually +`Buffer`s are not needed in browsers.) + + +## Example + +~~~ javascript +var clone = require('clone'); + +var a, b; + +a = { foo: { bar: 'baz' } }; // initial value of a + +b = clone(a); // clone a -> b +a.foo.bar = 'foo'; // change a + +console.log(a); // show a +console.log(b); // show b +~~~ + +This will print: + +~~~ javascript +{ foo: { bar: 'foo' } } +{ foo: { bar: 'baz' } } +~~~ + +**clone** masters cloning simple objects (even with custom prototype), arrays, +Date objects, and RegExp objects. Everything is cloned recursively, so that you +can clone dates in arrays in objects, for example. + + +## API + +`clone(val, circular, depth)` + + * `val` -- the value that you want to clone, any type allowed + * `circular` -- boolean + + Call `clone` with `circular` set to `false` if you are certain that `obj` + contains no circular references. This will give better performance if + needed. There is no error if `undefined` or `null` is passed as `obj`. + * `depth` -- depth to which the object is to be cloned (optional, + defaults to infinity) + * `prototype` -- sets the prototype to be used when cloning an object. + (optional, defaults to parent prototype). + * `includeNonEnumerable` -- set to `true` if the non-enumerable properties + should be cloned as well. Non-enumerable properties on the prototype chain + will be ignored. (optional, defaults to `false`) + +`clone.clonePrototype(obj)` + + * `obj` -- the object that you want to clone + +Does a prototype clone as +[described by Oran Looney](http://oranlooney.com/functional-javascript/). + + +## Circular References + +~~~ javascript +var a, b; + +a = { hello: 'world' }; + +a.myself = a; +b = clone(a); + +console.log(b); +~~~ + +This will print: + +~~~ javascript +{ hello: "world", myself: [Circular] } +~~~ + +So, `b.myself` points to `b`, not `a`. Neat! + + +## Test + + npm test + + +## Changelog + +### v2.1.2 + +#### 2018-03-21 + + - Use `Buffer.allocUnsafe()` on Node >= 4.5.0 (contributed by @ChALkeR) + +### v2.1.1 + +#### 2017-03-09 + + - Fix build badge in README + - Add support for cloning Maps and Sets on Internet Explorer + +### v2.1.0 + +#### 2016-11-22 + + - Add support for cloning Errors + - Exclude non-enumerable symbol-named object properties from cloning + - Add option to include non-enumerable own properties of objects + +### v2.0.0 + +#### 2016-09-28 + + - Add support for cloning ES6 Maps, Sets, Promises, and Symbols + +### v1.0.3 + +#### 2017-11-08 + + - Close XSS vulnerability in the NPM package, which included the file + `test-apart-ctx.html`. This vulnerability was disclosed by Juho Nurminen of + 2NS - Second Nature Security. + +### v1.0.2 (deprecated) + +#### 2015-03-25 + + - Fix call on getRegExpFlags + - Refactor utilities + - Refactor test suite + +### v1.0.1 (deprecated) + +#### 2015-03-04 + + - Fix nodeunit version + - Directly call getRegExpFlags + +### v1.0.0 (deprecated) + +#### 2015-02-10 + + - Improve browser support + - Improve browser testability + - Move helper methods to private namespace + +## Caveat + +Some special objects like a socket or `process.stdout`/`stderr` are known to not +be cloneable. If you find other objects that cannot be cloned, please [open an +issue](https://github.com/pvorb/clone/issues/new). + + +## Bugs and Issues + +If you encounter any bugs or issues, feel free to [open an issue at +github](https://github.com/pvorb/clone/issues) or send me an email to +. I also always like to hear from you, if you’re using my code. + +## License + +Copyright © 2011-2016 [Paul Vorbach](https://paul.vorba.ch/) and +[contributors](https://github.com/pvorb/clone/graphs/contributors). + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/clone.iml b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/clone.iml new file mode 100644 index 0000000..30de8ae --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/clone.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/clone.js b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/clone.js new file mode 100644 index 0000000..3fa5fad --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/clone.js @@ -0,0 +1,257 @@ +var clone = (function() { +'use strict'; + +function _instanceof(obj, type) { + return type != null && obj instanceof type; +} + +var nativeMap; +try { + nativeMap = Map; +} catch(_) { + // maybe a reference error because no `Map`. Give it a dummy value that no + // value will ever be an instanceof. + nativeMap = function() {}; +} + +var nativeSet; +try { + nativeSet = Set; +} catch(_) { + nativeSet = function() {}; +} + +var nativePromise; +try { + nativePromise = Promise; +} catch(_) { + nativePromise = function() {}; +} + +/** + * Clones (copies) an Object using deep copying. + * + * This function supports circular references by default, but if you are certain + * there are no circular references in your object, you can save some CPU time + * by calling clone(obj, false). + * + * Caution: if `circular` is false and `parent` contains circular references, + * your program may enter an infinite loop and crash. + * + * @param `parent` - the object to be cloned + * @param `circular` - set to true if the object to be cloned may contain + * circular references. (optional - true by default) + * @param `depth` - set to a number if the object is only to be cloned to + * a particular depth. (optional - defaults to Infinity) + * @param `prototype` - sets the prototype to be used when cloning an object. + * (optional - defaults to parent prototype). + * @param `includeNonEnumerable` - set to true if the non-enumerable properties + * should be cloned as well. Non-enumerable properties on the prototype + * chain will be ignored. (optional - false by default) +*/ +function clone(parent, circular, depth, prototype, includeNonEnumerable) { + if (typeof circular === 'object') { + depth = circular.depth; + prototype = circular.prototype; + includeNonEnumerable = circular.includeNonEnumerable; + circular = circular.circular; + } + // maintain two arrays for circular references, where corresponding parents + // and children have the same index + var allParents = []; + var allChildren = []; + + var useBuffer = typeof Buffer != 'undefined'; + + if (typeof circular == 'undefined') + circular = true; + + if (typeof depth == 'undefined') + depth = Infinity; + + // recurse this function so we don't reset allParents and allChildren + function _clone(parent, depth) { + // cloning null always returns null + if (parent === null) + return null; + + if (depth === 0) + return parent; + + var child; + var proto; + if (typeof parent != 'object') { + return parent; + } + + if (_instanceof(parent, nativeMap)) { + child = new nativeMap(); + } else if (_instanceof(parent, nativeSet)) { + child = new nativeSet(); + } else if (_instanceof(parent, nativePromise)) { + child = new nativePromise(function (resolve, reject) { + parent.then(function(value) { + resolve(_clone(value, depth - 1)); + }, function(err) { + reject(_clone(err, depth - 1)); + }); + }); + } else if (clone.__isArray(parent)) { + child = []; + } else if (clone.__isRegExp(parent)) { + child = new RegExp(parent.source, __getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else if (clone.__isDate(parent)) { + child = new Date(parent.getTime()); + } else if (useBuffer && Buffer.isBuffer(parent)) { + if (Buffer.allocUnsafe) { + // Node.js >= 4.5.0 + child = Buffer.allocUnsafe(parent.length); + } else { + // Older Node.js versions + child = new Buffer(parent.length); + } + parent.copy(child); + return child; + } else if (_instanceof(parent, Error)) { + child = Object.create(parent); + } else { + if (typeof prototype == 'undefined') { + proto = Object.getPrototypeOf(parent); + child = Object.create(proto); + } + else { + child = Object.create(prototype); + proto = prototype; + } + } + + if (circular) { + var index = allParents.indexOf(parent); + + if (index != -1) { + return allChildren[index]; + } + allParents.push(parent); + allChildren.push(child); + } + + if (_instanceof(parent, nativeMap)) { + parent.forEach(function(value, key) { + var keyChild = _clone(key, depth - 1); + var valueChild = _clone(value, depth - 1); + child.set(keyChild, valueChild); + }); + } + if (_instanceof(parent, nativeSet)) { + parent.forEach(function(value) { + var entryChild = _clone(value, depth - 1); + child.add(entryChild); + }); + } + + for (var i in parent) { + var attrs; + if (proto) { + attrs = Object.getOwnPropertyDescriptor(proto, i); + } + + if (attrs && attrs.set == null) { + continue; + } + child[i] = _clone(parent[i], depth - 1); + } + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(parent); + for (var i = 0; i < symbols.length; i++) { + // Don't need to worry about cloning a symbol because it is a primitive, + // like a number or string. + var symbol = symbols[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, symbol); + if (descriptor && !descriptor.enumerable && !includeNonEnumerable) { + continue; + } + child[symbol] = _clone(parent[symbol], depth - 1); + if (!descriptor.enumerable) { + Object.defineProperty(child, symbol, { + enumerable: false + }); + } + } + } + + if (includeNonEnumerable) { + var allPropertyNames = Object.getOwnPropertyNames(parent); + for (var i = 0; i < allPropertyNames.length; i++) { + var propertyName = allPropertyNames[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName); + if (descriptor && descriptor.enumerable) { + continue; + } + child[propertyName] = _clone(parent[propertyName], depth - 1); + Object.defineProperty(child, propertyName, { + enumerable: false + }); + } + } + + return child; + } + + return _clone(parent, depth); +} + +/** + * Simple flat clone using prototype, accepts only objects, usefull for property + * override on FLAT configuration object (no nested props). + * + * USE WITH CAUTION! This may not behave as you wish if you do not know how this + * works. + */ +clone.clonePrototype = function clonePrototype(parent) { + if (parent === null) + return null; + + var c = function () {}; + c.prototype = parent; + return new c(); +}; + +// private utility functions + +function __objToStr(o) { + return Object.prototype.toString.call(o); +} +clone.__objToStr = __objToStr; + +function __isDate(o) { + return typeof o === 'object' && __objToStr(o) === '[object Date]'; +} +clone.__isDate = __isDate; + +function __isArray(o) { + return typeof o === 'object' && __objToStr(o) === '[object Array]'; +} +clone.__isArray = __isArray; + +function __isRegExp(o) { + return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; +} +clone.__isRegExp = __isRegExp; + +function __getRegExpFlags(re) { + var flags = ''; + if (re.global) flags += 'g'; + if (re.ignoreCase) flags += 'i'; + if (re.multiline) flags += 'm'; + return flags; +} +clone.__getRegExpFlags = __getRegExpFlags; + +return clone; +})(); + +if (typeof module === 'object' && module.exports) { + module.exports = clone; +} diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/package.json b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/package.json new file mode 100644 index 0000000..bfc25bf --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/clone/package.json @@ -0,0 +1,158 @@ +{ + "_from": "clone@^2.1.1", + "_id": "clone@2.1.2", + "_inBundle": false, + "_integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "_location": "/vinyl-fs/clone", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "clone@^2.1.1", + "name": "clone", + "escapedName": "clone", + "rawSpec": "^2.1.1", + "saveSpec": null, + "fetchSpec": "^2.1.1" + }, + "_requiredBy": [ + "/vinyl-fs/vinyl" + ], + "_resolved": "https://registry.nlark.com/clone/download/clone-2.1.2.tgz", + "_shasum": "1b7f4b9f591f1e8f83670401600345a02887435f", + "_spec": "clone@^2.1.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs\\node_modules\\vinyl", + "author": { + "name": "Paul Vorbach", + "email": "paul@vorba.ch", + "url": "http://paul.vorba.ch/" + }, + "bugs": { + "url": "https://github.com/pvorb/node-clone/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Blake Miner", + "email": "miner.blake@gmail.com", + "url": "http://www.blakeminer.com/" + }, + { + "name": "Tian You", + "email": "axqd001@gmail.com", + "url": "http://blog.axqd.net/" + }, + { + "name": "George Stagas", + "email": "gstagas@gmail.com", + "url": "http://stagas.com/" + }, + { + "name": "Tobiasz Cudnik", + "email": "tobiasz.cudnik@gmail.com", + "url": "https://github.com/TobiaszCudnik" + }, + { + "name": "Pavel Lang", + "email": "langpavel@phpskelet.org", + "url": "https://github.com/langpavel" + }, + { + "name": "Dan MacTough", + "url": "http://yabfog.com/" + }, + { + "name": "w1nk", + "url": "https://github.com/w1nk" + }, + { + "name": "Hugh Kennedy", + "url": "http://twitter.com/hughskennedy" + }, + { + "name": "Dustin Diaz", + "url": "http://dustindiaz.com" + }, + { + "name": "Ilya Shaisultanov", + "url": "https://github.com/diversario" + }, + { + "name": "Nathan MacInnes", + "email": "nathan@macinn.es", + "url": "http://macinn.es/" + }, + { + "name": "Benjamin E. Coe", + "email": "ben@npmjs.com", + "url": "https://twitter.com/benjamincoe" + }, + { + "name": "Nathan Zadoks", + "url": "https://github.com/nathan7" + }, + { + "name": "Róbert Oroszi", + "email": "robert+gh@oroszi.net", + "url": "https://github.com/oroce" + }, + { + "name": "Aurélio A. Heckert", + "url": "http://softwarelivre.org/aurium" + }, + { + "name": "Guy Ellis", + "url": "http://www.guyellisrocks.com/" + }, + { + "name": "fscherwi", + "url": "https://fscherwi.github.io" + }, + { + "name": "rictic", + "url": "https://github.com/rictic" + }, + { + "name": "Martin Jurča", + "url": "https://github.com/jurca" + }, + { + "name": "Misery Lee", + "email": "miserylee@foxmail.com", + "url": "https://github.com/miserylee" + }, + { + "name": "Clemens Wolff", + "url": "https://github.com/c-w" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "deep cloning of objects and arrays", + "devDependencies": { + "nodeunit": "~0.9.0" + }, + "engines": { + "node": ">=0.8" + }, + "homepage": "https://github.com/pvorb/node-clone#readme", + "license": "MIT", + "main": "clone.js", + "name": "clone", + "optionalDependencies": {}, + "repository": { + "type": "git", + "url": "git://github.com/pvorb/node-clone.git" + }, + "scripts": { + "test": "nodeunit test.js" + }, + "tags": [ + "clone", + "object", + "array", + "function", + "date" + ], + "version": "2.1.2" +} diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/LICENSE b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/LICENSE new file mode 100644 index 0000000..fd38d69 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/README.md b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/README.md new file mode 100644 index 0000000..acfcfd0 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/README.md @@ -0,0 +1,62 @@ +

+ + + +

+ +# replace-ext + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Replaces a file extension with another one. + +## Usage + +```js +var replaceExt = require('replace-ext'); + +var path = '/some/dir/file.js'; +var newPath = replaceExt(path, '.coffee'); + +console.log(newPath); // /some/dir/file.coffee +``` + +## API + +### `replaceExt(path, extension)` + +Replaces the extension from `path` with `extension` and returns the updated path string. + +Does not replace the extension if `path` is not a string or is empty. + + +## replace-ext for enterprise + +Available as part of the Tidelift Subscription + +The maintainers of replace-ext and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-replace-ext?utm_source=npm-replace-ext&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/replace-ext.svg +[npm-url]: https://www.npmjs.com/package/replace-ext +[npm-image]: http://img.shields.io/npm/v/replace-ext.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/replace-ext/_build/latest?branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/replace-ext/_apis/build/status/replace-ext?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/replace-ext +[travis-image]: http://img.shields.io/travis/gulpjs/replace-ext.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/replace-ext +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/replace-ext.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/replace-ext +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/replace-ext/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg + diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/index.js b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/index.js new file mode 100644 index 0000000..7a78278 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/index.js @@ -0,0 +1,33 @@ +'use strict'; + +var path = require('path'); + +function replaceExt(npath, ext) { + if (typeof npath !== 'string') { + return npath; + } + + if (npath.length === 0) { + return npath; + } + + var nFileName = path.basename(npath, path.extname(npath)) + ext; + var nFilepath = path.join(path.dirname(npath), nFileName); + + // Because `path.join` removes the head './' from the given path. + // This removal can cause a problem when passing the result to `require` or + // `import`. + if (startsWithSingleDot(npath)) { + return '.' + path.sep + nFilepath; + } + + return nFilepath; +} + +function startsWithSingleDot(fpath) { + var first2chars = fpath.slice(0, 2); + return (first2chars === '.' + path.sep) || + (first2chars === './'); +} + +module.exports = replaceExt; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/package.json b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/package.json new file mode 100644 index 0000000..9002c8a --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/replace-ext/package.json @@ -0,0 +1,85 @@ +{ + "_from": "replace-ext@^1.0.0", + "_id": "replace-ext@1.0.1", + "_inBundle": false, + "_integrity": "sha1-LW2ZbQShWFXZZ0Q2Md1fd4JbAWo=", + "_location": "/vinyl-fs/replace-ext", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "replace-ext@^1.0.0", + "name": "replace-ext", + "escapedName": "replace-ext", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/vinyl-fs/vinyl" + ], + "_resolved": "https://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.1.tgz", + "_shasum": "2d6d996d04a15855d967443631dd5f77825b016a", + "_spec": "replace-ext@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs\\node_modules\\vinyl", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/replace-ext/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Eric Schoffstall", + "email": "yo@contra.io" + }, + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "Replaces a file extension with another one", + "devDependencies": { + "coveralls": "github:phated/node-coveralls#2.x", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "mocha": "^3.0.0", + "nyc": "^10.3.2" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/gulpjs/replace-ext#readme", + "keywords": [ + "gulp", + "extensions", + "filepath", + "basename" + ], + "license": "MIT", + "main": "index.js", + "name": "replace-ext", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/replace-ext.git" + }, + "scripts": { + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "cover": "nyc --reporter=lcov --reporter=text-summary npm test", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only" + }, + "version": "1.0.1" +} diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/LICENSE b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/LICENSE new file mode 100644 index 0000000..84b3420 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/README.md b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/README.md new file mode 100644 index 0000000..40492a3 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/README.md @@ -0,0 +1,452 @@ +

+ + + +

+ +# vinyl + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Virtual file format. + +## What is Vinyl? + +Vinyl is a very simple metadata object that describes a file. When you think of a file, two attributes come to mind: `path` and `contents`. These are the main attributes on a Vinyl object. A file does not necessarily represent something on your computer’s file system. You have files on S3, FTP, Dropbox, Box, CloudThingly.io and other services. Vinyl can be used to describe files from all of these sources. + +## What is a Vinyl Adapter? + +While Vinyl provides a clean way to describe a file, we also need a way to access these files. Each file source needs what I call a "Vinyl adapter". A Vinyl adapter simply exposes a `src(globs)` and a `dest(folder)` method. Each return a stream. The `src` stream produces Vinyl objects, and the `dest` stream consumes Vinyl objects. Vinyl adapters can expose extra methods that might be specific to their input/output medium, such as the `symlink` method [`vinyl-fs`][vinyl-fs] provides. + +## Usage + +```js +var Vinyl = require('vinyl'); + +var jsFile = new Vinyl({ + cwd: '/', + base: '/test/', + path: '/test/file.js', + contents: Buffer.from('var x = 123') +}); +``` + +## API + +### `new Vinyl([options])` + +The constructor is used to create a new instance of `Vinyl`. Each instance represents a separate file, directory or symlink. + +All internally managed paths (`cwd`, `base`, `path`, `history`) are normalized and have trailing separators removed. See [Normalization and concatenation][normalization] for more information. + +Options may be passed upon instantiation to create a file with specific properties. + +#### `options` + +Options are not mutated by the constructor. + +##### `options.cwd` + +The current working directory of the file. + +Type: `String` + +Default: `process.cwd()` + +##### `options.base` + +Used for calculating the `relative` property. This is typically where a glob starts. + +Type: `String` + +Default: `options.cwd` + +##### `options.path` + +The full path to the file. + +Type: `String` + +Default: `undefined` + +##### `options.history` + +Stores the path history. If `options.path` and `options.history` are both passed, `options.path` is appended to `options.history`. All `options.history` paths are normalized by the `file.path` setter. + +Type: `Array` + +Default: `[]` (or `[options.path]` if `options.path` is passed) + +##### `options.stat` + +The result of an `fs.stat` call. This is how you mark the file as a directory or symbolic link. See [isDirectory()][is-directory], [isSymbolic()][is-symbolic] and [fs.Stats][fs-stats] for more information. + +Type: [`fs.Stats`][fs-stats] + +Default: `undefined` + +##### `options.contents` + +The contents of the file. If `options.contents` is a [`ReadableStream`][readable-stream], it is wrapped in a [`cloneable-readable`][cloneable-readable] stream. + +Type: [`ReadableStream`][readable-stream], [`Buffer`][buffer], or `null` + +Default: `null` + +##### `options.{custom}` + +Any other option properties will be directly assigned to the new Vinyl object. + +```js +var Vinyl = require('vinyl'); + +var file = new Vinyl({ foo: 'bar' }); +file.foo === 'bar'; // true +``` + +### Instance methods + +Each Vinyl object will have instance methods. Every method will be available but may return differently based on what properties were set upon instantiation or modified since. + +#### `file.isBuffer()` + +Returns `true` if the file contents are a [`Buffer`][buffer], otherwise `false`. + +#### `file.isStream()` + +Returns `true` if the file contents are a [`Stream`][stream], otherwise `false`. + +#### `file.isNull()` + +Returns `true` if the file contents are `null`, otherwise `false`. + +#### `file.isDirectory()` + +Returns `true` if the file represents a directory, otherwise `false`. + +A file is considered a directory when: + +- `file.isNull()` is `true` +- `file.stat` is an object +- `file.stat.isDirectory()` returns `true` + +When constructing a Vinyl object, pass in a valid [`fs.Stats`][fs-stats] object via `options.stat`. If you are mocking the [`fs.Stats`][fs-stats] object, you may need to stub the `isDirectory()` method. + +#### `file.isSymbolic()` + +Returns `true` if the file represents a symbolic link, otherwise `false`. + +A file is considered symbolic when: + +- `file.isNull()` is `true` +- `file.stat` is an object +- `file.stat.isSymbolicLink()` returns `true` + +When constructing a Vinyl object, pass in a valid [`fs.Stats`][fs-stats] object via `options.stat`. If you are mocking the [`fs.Stats`][fs-stats] object, you may need to stub the `isSymbolicLink()` method. + +#### `file.clone([options])` + +Returns a new Vinyl object with all attributes cloned. + +__By default custom attributes are cloned deeply.__ + +If `options` or `options.deep` is `false`, custom attributes will not be cloned deeply. + +If `file.contents` is a [`Buffer`][buffer] and `options.contents` is `false`, the [`Buffer`][buffer] reference will be reused instead of copied. + +#### `file.inspect()` + +Returns a formatted-string interpretation of the Vinyl object. Automatically called by node's `console.log`. + +### Instance properties + +Each Vinyl object will have instance properties. Some may be unavailable based on what properties were set upon instantiation or modified since. + +#### `file.contents` + +Gets and sets the contents of the file. If set to a [`ReadableStream`][readable-stream], it is wrapped in a [`cloneable-readable`][cloneable-readable] stream. + +Throws when set to any value other than a [`ReadableStream`][readable-stream], a [`Buffer`][buffer] or `null`. + +Type: [`ReadableStream`][readable-stream], [`Buffer`][buffer], or `null` + +#### `file.cwd` + +Gets and sets current working directory. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than non-empty strings. + +Type: `String` + +#### `file.base` + +Gets and sets base directory. Used for relative pathing (typically where a glob starts). +When `null` or `undefined`, it simply proxies the `file.cwd` property. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than non-empty strings or `null`/`undefined`. + +Type: `String` + +#### `file.path` + +Gets and sets the absolute pathname string or `undefined`. Setting to a different value appends the new path to `file.history`. If set to the same value as the current path, it is ignored. All new values are normalized and have trailing separators removed. + +Throws when set to any value other than a string. + +Type: `String` + +#### `file.history` + +Array of `file.path` values the Vinyl object has had, from `file.history[0]` (original) through `file.history[file.history.length - 1]` (current). `file.history` and its elements should normally be treated as read-only and only altered indirectly by setting `file.path`. + +Type: `Array` + +#### `file.relative` + +Gets the result of `path.relative(file.base, file.path)`. + +Throws when set or when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.relative); // file.js +``` + +#### `file.dirname` + +Gets and sets the dirname of `file.path`. Will always be normalized and have trailing separators removed. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.dirname); // /test + +file.dirname = '/specs'; + +console.log(file.dirname); // /specs +console.log(file.path); // /specs/file.js +``` + +#### `file.basename` + +Gets and sets the basename of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.basename); // file.js + +file.basename = 'file.txt'; + +console.log(file.basename); // file.txt +console.log(file.path); // /test/file.txt +``` + +#### `file.stem` + +Gets and sets stem (filename without suffix) of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.stem); // file + +file.stem = 'foo'; + +console.log(file.stem); // foo +console.log(file.path); // /test/foo.js +``` + +#### `file.extname` + +Gets and sets extname of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.extname); // .js + +file.extname = '.txt'; + +console.log(file.extname); // .txt +console.log(file.path); // /test/file.txt +``` + +#### `file.symlink` + +Gets and sets the path where the file points to if it's a symbolic link. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than a string. + +Type: `String` + +### `Vinyl.isVinyl(file)` + +Static method used for checking if an object is a Vinyl file. Use this method instead of `instanceof`. + +Takes an object and returns `true` if it is a Vinyl file, otherwise returns `false`. + +__Note: This method uses an internal flag that some older versions of Vinyl didn't expose.__ + +Example: + +```js +var Vinyl = require('vinyl'); + +var file = new Vinyl(); +var notAFile = {}; + +Vinyl.isVinyl(file); // true +Vinyl.isVinyl(notAFile); // false +``` + +### `Vinyl.isCustomProp(property)` + +Static method used by Vinyl when setting values inside the constructor or when copying properties in `file.clone()`. + +Takes a string `property` and returns `true` if the property is not used internally, otherwise returns `false`. + +This method is useful for inheritting from the Vinyl constructor. Read more in [Extending Vinyl][extending-vinyl]. + +Example: + +```js +var Vinyl = require('vinyl'); + +Vinyl.isCustomProp('sourceMap'); // true +Vinyl.isCustomProp('path'); // false -> internal getter/setter +``` + +## Normalization and concatenation + +Since all properties are normalized in their setters, you can just concatenate with `/`, and normalization takes care of it properly on all platforms. + +Example: + +```js +var file = new File(); +file.path = '/' + 'test' + '/' + 'foo.bar'; + +console.log(file.path); +// posix => /test/foo.bar +// win32 => \\test\\foo.bar +``` + +But never concatenate with `\`, since that is a valid filename character on posix system. + +## Extending Vinyl + +When extending Vinyl into your own class with extra features, you need to think about a few things. + +When you have your own properties that are managed internally, you need to extend the static `isCustomProp` method to return `false` when one of these properties is queried. + +```js +var Vinyl = require('vinyl'); + +var builtInProps = ['foo', '_foo']; + +class SuperFile extends Vinyl { + constructor(options) { + super(options); + this._foo = 'example internal read-only value'; + } + + get foo() { + return this._foo; + } + + static isCustomProp(name) { + return super.isCustomProp(name) && builtInProps.indexOf(name) === -1; + } +} + +// `foo` won't be assigned to the object below +new SuperFile({ foo: "something" }); +``` + +This makes properties `foo` and `_foo` skipped when passed in options to `constructor(options)` so they don't get assigned to the new object and override your custom implementation. They also won't be copied when cloning. __Note:__ The `_foo` and `foo` properties will still exist on the created/cloned object because you are assigning `_foo` in the constructor and `foo` is defined on the prototype. + +Same goes for `clone()`. If you have your own internal stuff that needs special handling during cloning, you should extend it to do so. + +## License + +MIT + +[is-symbolic]: #issymbolic +[is-directory]: #isdirectory +[normalization]: #normalization-and-concatenation +[extending-vinyl]: #extending-vinyl +[stream]: https://nodejs.org/api/stream.html#stream_stream +[readable-stream]: https://nodejs.org/api/stream.html#stream_readable_streams +[buffer]: https://nodejs.org/api/buffer.html#buffer_class_buffer +[fs-stats]: http://nodejs.org/api/fs.html#fs_class_fs_stats +[vinyl-fs]: https://github.com/gulpjs/vinyl-fs +[cloneable-readable]: https://github.com/mcollina/cloneable-readable + +[downloads-image]: https://img.shields.io/npm/dm/vinyl.svg +[npm-url]: https://www.npmjs.com/package/vinyl +[npm-image]: https://img.shields.io/npm/v/vinyl.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=$PROJECT_ID&branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/vinyl?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/vinyl +[travis-image]: https://img.shields.io/travis/gulpjs/vinyl.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/vinyl +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/vinyl.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl +[coveralls-image]: https://img.shields.io/coveralls/gulpjs/vinyl/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/index.js b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/index.js new file mode 100644 index 0000000..3a16e91 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/index.js @@ -0,0 +1,338 @@ +'use strict'; + +var path = require('path'); +var util = require('util'); +var isBuffer = require('buffer').Buffer.isBuffer; + +var clone = require('clone'); +var cloneable = require('cloneable-readable'); +var replaceExt = require('replace-ext'); +var cloneStats = require('clone-stats'); +var cloneBuffer = require('clone-buffer'); +var removeTrailingSep = require('remove-trailing-separator'); + +var isStream = require('./lib/is-stream'); +var normalize = require('./lib/normalize'); +var inspectStream = require('./lib/inspect-stream'); + +var builtInFields = [ + '_contents', '_symlink', 'contents', 'stat', 'history', 'path', + '_base', 'base', '_cwd', 'cwd', +]; + +function File(file) { + var self = this; + + if (!file) { + file = {}; + } + + // Stat = files stats object + this.stat = file.stat || null; + + // Contents = stream, buffer, or null if not read + this.contents = file.contents || null; + + // Replay path history to ensure proper normalization and trailing sep + var history = Array.prototype.slice.call(file.history || []); + if (file.path) { + history.push(file.path); + } + this.history = []; + history.forEach(function(path) { + self.path = path; + }); + + this.cwd = file.cwd || process.cwd(); + this.base = file.base; + + this._isVinyl = true; + + this._symlink = null; + + // Set custom properties + Object.keys(file).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + self[key] = file[key]; + } + }); +} + +File.prototype.isBuffer = function() { + return isBuffer(this.contents); +}; + +File.prototype.isStream = function() { + return isStream(this.contents); +}; + +File.prototype.isNull = function() { + return (this.contents === null); +}; + +File.prototype.isDirectory = function() { + if (!this.isNull()) { + return false; + } + + if (this.stat && typeof this.stat.isDirectory === 'function') { + return this.stat.isDirectory(); + } + + return false; +}; + +File.prototype.isSymbolic = function() { + if (!this.isNull()) { + return false; + } + + if (this.stat && typeof this.stat.isSymbolicLink === 'function') { + return this.stat.isSymbolicLink(); + } + + return false; +}; + +File.prototype.clone = function(opt) { + var self = this; + + if (typeof opt === 'boolean') { + opt = { + deep: opt, + contents: true, + }; + } else if (!opt) { + opt = { + deep: true, + contents: true, + }; + } else { + opt.deep = opt.deep === true; + opt.contents = opt.contents !== false; + } + + // Clone our file contents + var contents; + if (this.isStream()) { + contents = this.contents.clone(); + } else if (this.isBuffer()) { + contents = opt.contents ? cloneBuffer(this.contents) : this.contents; + } + + var file = new this.constructor({ + cwd: this.cwd, + base: this.base, + stat: (this.stat ? cloneStats(this.stat) : null), + history: this.history.slice(), + contents: contents, + }); + + if (this.isSymbolic()) { + file.symlink = this.symlink; + } + + // Clone our custom properties + Object.keys(this).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + file[key] = opt.deep ? clone(self[key], true) : self[key]; + } + }); + return file; +}; + +File.prototype.inspect = function() { + var inspect = []; + + // Use relative path if possible + var filePath = this.path ? this.relative : null; + + if (filePath) { + inspect.push('"' + filePath + '"'); + } + + if (this.isBuffer()) { + inspect.push(this.contents.inspect()); + } + + if (this.isStream()) { + inspect.push(inspectStream(this.contents)); + } + + return ''; +}; + +// Newer Node.js versions use this symbol for custom inspection. +if (util.inspect.custom) { + File.prototype[util.inspect.custom] = File.prototype.inspect; +} + +File.isCustomProp = function(key) { + return builtInFields.indexOf(key) === -1; +}; + +File.isVinyl = function(file) { + return (file && file._isVinyl === true) || false; +}; + +// Virtual attributes +// Or stuff with extra logic +Object.defineProperty(File.prototype, 'contents', { + get: function() { + return this._contents; + }, + set: function(val) { + if (!isBuffer(val) && !isStream(val) && (val !== null)) { + throw new Error('File.contents can only be a Buffer, a Stream, or null.'); + } + + // Ask cloneable if the stream is a already a cloneable + // this avoid piping into many streams + // reducing the overhead of cloning + if (isStream(val) && !cloneable.isCloneable(val)) { + val = cloneable(val); + } + + this._contents = val; + }, +}); + +Object.defineProperty(File.prototype, 'cwd', { + get: function() { + return this._cwd; + }, + set: function(cwd) { + if (!cwd || typeof cwd !== 'string') { + throw new Error('cwd must be a non-empty string.'); + } + this._cwd = removeTrailingSep(normalize(cwd)); + }, +}); + +Object.defineProperty(File.prototype, 'base', { + get: function() { + return this._base || this._cwd; + }, + set: function(base) { + if (base == null) { + delete this._base; + return; + } + if (typeof base !== 'string' || !base) { + throw new Error('base must be a non-empty string, or null/undefined.'); + } + base = removeTrailingSep(normalize(base)); + if (base !== this._cwd) { + this._base = base; + } else { + delete this._base; + } + }, +}); + +// TODO: Should this be moved to vinyl-fs? +Object.defineProperty(File.prototype, 'relative', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get relative.'); + } + return path.relative(this.base, this.path); + }, + set: function() { + throw new Error('File.relative is generated from the base and path attributes. Do not modify it.'); + }, +}); + +Object.defineProperty(File.prototype, 'dirname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get dirname.'); + } + return path.dirname(this.path); + }, + set: function(dirname) { + if (!this.path) { + throw new Error('No path specified! Can not set dirname.'); + } + this.path = path.join(dirname, this.basename); + }, +}); + +Object.defineProperty(File.prototype, 'basename', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get basename.'); + } + return path.basename(this.path); + }, + set: function(basename) { + if (!this.path) { + throw new Error('No path specified! Can not set basename.'); + } + this.path = path.join(this.dirname, basename); + }, +}); + +// Property for getting/setting stem of the filename. +Object.defineProperty(File.prototype, 'stem', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get stem.'); + } + return path.basename(this.path, this.extname); + }, + set: function(stem) { + if (!this.path) { + throw new Error('No path specified! Can not set stem.'); + } + this.path = path.join(this.dirname, stem + this.extname); + }, +}); + +Object.defineProperty(File.prototype, 'extname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get extname.'); + } + return path.extname(this.path); + }, + set: function(extname) { + if (!this.path) { + throw new Error('No path specified! Can not set extname.'); + } + this.path = replaceExt(this.path, extname); + }, +}); + +Object.defineProperty(File.prototype, 'path', { + get: function() { + return this.history[this.history.length - 1]; + }, + set: function(path) { + if (typeof path !== 'string') { + throw new Error('path should be a string.'); + } + path = removeTrailingSep(normalize(path)); + + // Record history only when path changed + if (path && path !== this.path) { + this.history.push(path); + } + }, +}); + +Object.defineProperty(File.prototype, 'symlink', { + get: function() { + return this._symlink; + }, + set: function(symlink) { + // TODO: should this set the mode to symbolic if set? + if (typeof symlink !== 'string') { + throw new Error('symlink should be a string'); + } + + this._symlink = removeTrailingSep(normalize(symlink)); + }, +}); + +module.exports = File; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/inspect-stream.js b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/inspect-stream.js new file mode 100644 index 0000000..9faaa0a --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/inspect-stream.js @@ -0,0 +1,13 @@ +'use strict'; + +function inspectStream(stream) { + var streamType = stream.constructor.name; + // Avoid StreamStream + if (streamType === 'Stream') { + streamType = ''; + } + + return '<' + streamType + 'Stream>'; +} + +module.exports = inspectStream; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/is-stream.js b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/is-stream.js new file mode 100644 index 0000000..04882b4 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/is-stream.js @@ -0,0 +1,15 @@ +'use strict'; + +function isStream(stream) { + if (!stream) { + return false; + } + + if (typeof stream.pipe !== 'function') { + return false; + } + + return true; +} + +module.exports = isStream; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/normalize.js b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/normalize.js new file mode 100644 index 0000000..f90dcb2 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/lib/normalize.js @@ -0,0 +1,9 @@ +'use strict'; + +var path = require('path'); + +function normalize(str) { + return str === '' ? str : path.normalize(str); +} + +module.exports = normalize; diff --git a/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/package.json b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/package.json new file mode 100644 index 0000000..56be183 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/node_modules/vinyl/package.json @@ -0,0 +1,96 @@ +{ + "_from": "vinyl@^2.0.0", + "_id": "vinyl@2.2.1", + "_inBundle": false, + "_integrity": "sha1-I8+4u6tezjgDqiwKHrKK98u6GXQ=", + "_location": "/vinyl-fs/vinyl", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "vinyl@^2.0.0", + "name": "vinyl", + "escapedName": "vinyl", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/vinyl-fs" + ], + "_resolved": "https://registry.npm.taobao.org/vinyl/download/vinyl-2.2.1.tgz", + "_shasum": "23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974", + "_spec": "vinyl@^2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "https://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/vinyl/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Eric Schoffstall", + "email": "yo@contra.io" + }, + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "deprecated": false, + "description": "Virtual file format.", + "devDependencies": { + "coveralls": "github:phated/node-coveralls#2.x", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "mississippi": "^1.2.0", + "mocha": "^3.0.0", + "nyc": "^10.3.2", + "safer-buffer": "^2.1.2" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js", + "lib" + ], + "homepage": "https://github.com/gulpjs/vinyl#readme", + "keywords": [ + "virtual", + "filesystem", + "file", + "directory", + "stat", + "path" + ], + "license": "MIT", + "main": "index.js", + "name": "vinyl", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/vinyl.git" + }, + "scripts": { + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only" + }, + "version": "2.2.1" +} diff --git a/packages/字体精简工具/node_modules/vinyl-fs/package.json b/packages/字体精简工具/node_modules/vinyl-fs/package.json new file mode 100644 index 0000000..3bf2c49 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-fs/package.json @@ -0,0 +1,115 @@ +{ + "_from": "vinyl-fs@3.0.3", + "_id": "vinyl-fs@3.0.3", + "_inBundle": false, + "_integrity": "sha1-yFhJQF9nQo/qu71cXb3WT0fTG8c=", + "_location": "/vinyl-fs", + "_phantomChildren": { + "clone-buffer": "1.0.0", + "cloneable-readable": "1.1.3", + "remove-trailing-separator": "1.1.0" + }, + "_requested": { + "type": "version", + "registry": true, + "raw": "vinyl-fs@3.0.3", + "name": "vinyl-fs", + "escapedName": "vinyl-fs", + "rawSpec": "3.0.3", + "saveSpec": null, + "fetchSpec": "3.0.3" + }, + "_requiredBy": [ + "/fontmin", + "/gulp" + ], + "_resolved": "https://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-3.0.3.tgz", + "_shasum": "c85849405f67428feabbbd5c5dbdd64f47d31bc7", + "_spec": "vinyl-fs@3.0.3", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\fontmin", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/vinyl-fs/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Eric Schoffstall", + "email": "yo@contra.io" + }, + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "deprecated": false, + "description": "Vinyl adapter for the file system.", + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.19.0", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.2.0", + "mocha": "^3.5.0", + "rimraf": "^2.6.1" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js", + "lib" + ], + "homepage": "https://github.com/gulpjs/vinyl-fs#readme", + "keywords": [ + "gulp", + "vinyl-adapter", + "vinyl", + "file", + "file system", + "fs", + "streams" + ], + "license": "MIT", + "main": "index.js", + "name": "vinyl-fs", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/vinyl-fs.git" + }, + "scripts": { + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls", + "lint": "eslint . && jscs index.js lib/ test/", + "pretest": "npm run lint", + "test": "mocha --async-only" + }, + "version": "3.0.3" +} diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/LICENSE b/packages/字体精简工具/node_modules/vinyl-sourcemap/LICENSE new file mode 100644 index 0000000..82c8d55 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Blaine Bublitz , Eric Schoffstall and other contributors (Based on code from gulp-sourcemaps - ISC License - Copyright (c) 2014, Florian Reiterer) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/README.md b/packages/字体精简工具/node_modules/vinyl-sourcemap/README.md new file mode 100644 index 0000000..6ffc0ef --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/README.md @@ -0,0 +1,79 @@ +

+ + + +

+ +# vinyl-sourcemap + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Add/write sourcemaps to/from Vinyl files. + +## Usage + +```js +sourcemap.add(file, function(err, updatedFile) { + // updatedFile will have a .sourceMap property +}); + +// The 2nd argument can be given as a path string +sourcemap.write(file, './maps', function(err, updatedFile, sourcemapFile) { + // sourcemapFile will be a Vinyl file to be written to some location + // updatedFile will have the .contents property updated with a sourceMappingURL that resolves to sourcemapFile +}); + +// If not defined, the sourcemap is inlined +sourcemap.write(file, function(err, updatedFile, sourcemapFile) { + // sourcemapFile is undefined + // updatedFile will have the .contents property updated with a sourceMappingURL that is an inlined sourcemap +}); +``` + +## API + +### `sourcemap.add(file, callback)` + +Takes a [Vinyl][vinyl] `file` object and a `callback` function. It attempts to parse an inline sourcemap or load an external sourcemap for the file. If a valid sourcemap is found, the `sources` & `sourcesContent` properties are resolved to actual files (if possible) and a fully resolved sourcemap is attached as `file.sourceMap`. If a sourcemap is not found, a stub sourcemap is generated for the file and attached as `file.sourceMap`. + +Once all resolution is complete, the `callback(err, updatedFile)` is called with the `updatedFile`. If an error occurs, it will be passed as `err` and `updatedFile` will be undefined. __Note:__ The original file is mutated but `updatedFile` is passed to the callback as a convenience. + +If the `file` is not a Vinyl object or the contents are streaming, an Error will be passed to the `callback`. + +If the `file` has a `.sourceMap` property or the contents are null, the `callback` will be called immediately without mutation to the file. + +All filesystem operations are optional & non-fatal so any errors will not be bubbled to the `callback`. + +### `sourcemap.write(file, [outputPath,] callback)` + +Takes a [Vinyl][vinyl] `file` object, (optionally) an `outputPath` string and a `callback` function. + +If `outputPath` is not passed, an inline sourcemap will be generated from the `file.sourceMap` property and appended to the `file.contents`. Once the inline sourcemap is appended, the `callback(err, updatedFile)` is called with the `updatedFile`. If an error occurs, it will be passed as `err` and `updatedFile` will be undefined. __Note:__ The original file is mutated but `updatedFile` is passed to the callback as a convenience. + +If `outputPath` is passed, a new Vinyl file will be generated using `file.cwd` and `file.base` from the original file, the path to the external sourcemap, and the `file.sourceMap` (as contents). The external location will be appended to the `file.contents` of the original file. Once the new file is created and location appended, the `callback(err, updatedFile, sourcemapFile)` is called with the `updatedFile` and the `sourcemapFile`. If an error occurs, it will be passed as `err` and `updatedFile`/`sourcemapFile` will be undefined. __Note:__ The original file is mutated but `updatedFile` is passed to the callback as a convenience. + +If the `file` is not a Vinyl object or the contents are streaming, an Error will be passed to the `callback`. + +If the `file` doesn't have a `.sourceMap` property or the contents are null, the `callback` will be called immediately without mutation to the file. + +## License + +MIT + +[vinyl]: https://github.com/gulpjs/vinyl + +[downloads-image]: http://img.shields.io/npm/dm/vinyl-sourcemap.svg +[npm-url]: https://npmjs.com/package/vinyl-sourcemap +[npm-image]: http://img.shields.io/npm/v/vinyl-sourcemap.svg + +[travis-url]: https://travis-ci.org/gulpjs/vinyl-sourcemap +[travis-image]: http://img.shields.io/travis/gulpjs/vinyl-sourcemap.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/vinyl-sourcemap +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/vinyl-sourcemap.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl-sourcemap +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/vinyl-sourcemap/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/index.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/index.js new file mode 100644 index 0000000..93d5062 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/index.js @@ -0,0 +1,66 @@ +'use strict'; + +var File = require('vinyl'); + +var helpers = require('./lib/helpers'); + +var PLUGIN_NAME = 'vinyl-sourcemap'; + +function add(file, callback) { + + // Bail early an error if the file argument is not a Vinyl file + if (!File.isVinyl(file)) { + return callback(new Error(PLUGIN_NAME + '-add: Not a vinyl file')); + } + + // Bail early with an error if file has streaming contents + if (file.isStream()) { + return callback(new Error(PLUGIN_NAME + '-add: Streaming not supported')); + } + + // Bail early successfully if file is null or already has a sourcemap + if (file.isNull() || file.sourceMap) { + return callback(null, file); + } + + var state = { + path: '', // Root path for the sources in the map + map: null, + content: file.contents.toString(), + // TODO: handle this? + preExistingComment: null, + }; + + helpers.addSourceMaps(file, state, callback); +} + +function write(file, destPath, callback) { + + // Check if options or a callback are passed as second argument + if (typeof destPath === 'function') { + callback = destPath; + destPath = undefined; + } + + // Bail early with an error if the file argument is not a Vinyl file + if (!File.isVinyl(file)) { + return callback(new Error(PLUGIN_NAME + '-write: Not a vinyl file')); + } + + // Bail early with an error if file has streaming contents + if (file.isStream()) { + return callback(new Error(PLUGIN_NAME + '-write: Streaming not supported')); + } + + // Bail early successfully if file is null or doesn't have sourcemap + if (file.isNull() || !file.sourceMap) { + return callback(null, file); + } + + helpers.writeSourceMaps(file, destPath, callback); +} + +module.exports = { + add: add, + write: write, +}; diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/lib/helpers.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/lib/helpers.js new file mode 100644 index 0000000..626d82f --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/lib/helpers.js @@ -0,0 +1,243 @@ +'use strict'; + +var path = require('path'); + +var fs = require('graceful-fs'); +var nal = require('now-and-later'); +var File = require('vinyl'); +var convert = require('convert-source-map'); +var removeBOM = require('remove-bom-buffer'); +var appendBuffer = require('append-buffer'); +var normalizePath = require('normalize-path'); + +var urlRegex = /^(https?|webpack(-[^:]+)?):\/\//; + +function isRemoteSource(source) { + return source.match(urlRegex); +} + +function parse(data) { + try { + return JSON.parse(removeBOM(data)); + } catch (err) { + // TODO: should this log a debug? + } +} + +function loadSourceMap(file, state, callback) { + // Try to read inline source map + state.map = convert.fromSource(state.content); + + if (state.map) { + state.map = state.map.toObject(); + // Sources in map are relative to the source file + state.path = file.dirname; + state.content = convert.removeComments(state.content); + // Remove source map comment from source + file.contents = new Buffer(state.content, 'utf8'); + return callback(); + } + + // Look for source map comment referencing a source map file + var mapComment = convert.mapFileCommentRegex.exec(state.content); + + var mapFile; + if (mapComment) { + mapFile = path.resolve(file.dirname, mapComment[1] || mapComment[2]); + state.content = convert.removeMapFileComments(state.content); + // Remove source map comment from source + file.contents = new Buffer(state.content, 'utf8'); + } else { + // If no comment try map file with same name as source file + mapFile = file.path + '.map'; + } + + // Sources in external map are relative to map file + state.path = path.dirname(mapFile); + + fs.readFile(mapFile, onRead); + + function onRead(err, data) { + if (err) { + return callback(); + } + state.map = parse(data); + callback(); + } +} + +// Fix source paths and sourceContent for imported source map +function fixImportedSourceMap(file, state, callback) { + if (!state.map) { + return callback(); + } + + state.map.sourcesContent = state.map.sourcesContent || []; + + nal.map(state.map.sources, normalizeSourcesAndContent, callback); + + function assignSourcesContent(sourceContent, idx) { + state.map.sourcesContent[idx] = sourceContent; + } + + function normalizeSourcesAndContent(sourcePath, idx, cb) { + var sourceRoot = state.map.sourceRoot || ''; + var sourceContent = state.map.sourcesContent[idx] || null; + + if (isRemoteSource(sourcePath)) { + assignSourcesContent(sourceContent, idx); + return cb(); + } + + if (state.map.sourcesContent[idx]) { + return cb(); + } + + if (sourceRoot && isRemoteSource(sourceRoot)) { + assignSourcesContent(sourceContent, idx); + return cb(); + } + + var basePath = path.resolve(file.base, sourceRoot); + var absPath = path.resolve(state.path, sourceRoot, sourcePath); + var relPath = path.relative(basePath, absPath); + var unixRelPath = normalizePath(relPath); + + state.map.sources[idx] = unixRelPath; + + if (absPath !== file.path) { + // Load content from file async + return fs.readFile(absPath, onRead); + } + + // If current file: use content + assignSourcesContent(state.content, idx); + cb(); + + function onRead(err, data) { + if (err) { + assignSourcesContent(null, idx); + return cb(); + } + assignSourcesContent(removeBOM(data).toString('utf8'), idx); + cb(); + } + } +} + +function mapsLoaded(file, state, callback) { + + if (!state.map) { + state.map = { + version: 3, + names: [], + mappings: '', + sources: [normalizePath(file.relative)], + sourcesContent: [state.content], + }; + } + + state.map.file = normalizePath(file.relative); + file.sourceMap = state.map; + + callback(); +} + +function addSourceMaps(file, state, callback) { + var tasks = [ + loadSourceMap, + fixImportedSourceMap, + mapsLoaded, + ]; + + function apply(fn, key, cb) { + fn(file, state, cb); + } + + nal.mapSeries(tasks, apply, done); + + function done() { + callback(null, file); + } +} + +/* Write Helpers */ +function createSourceMapFile(opts) { + return new File({ + cwd: opts.cwd, + base: opts.base, + path: opts.path, + contents: new Buffer(JSON.stringify(opts.content)), + stat: { + isFile: function() { + return true; + }, + isDirectory: function() { + return false; + }, + isBlockDevice: function() { + return false; + }, + isCharacterDevice: function() { + return false; + }, + isSymbolicLink: function() { + return false; + }, + isFIFO: function() { + return false; + }, + isSocket: function() { + return false; + }, + }, + }); +} + +var needsMultiline = ['.css']; + +function getCommentOptions(extname) { + var opts = { + multiline: (needsMultiline.indexOf(extname) !== -1), + }; + + return opts; +} + +function writeSourceMaps(file, destPath, callback) { + var sourceMapFile; + var commentOpts = getCommentOptions(file.extname); + + var comment; + if (destPath == null) { + // Encode source map into comment + comment = convert.fromObject(file.sourceMap).toComment(commentOpts); + } else { + var mapFile = path.join(destPath, file.relative) + '.map'; + var sourceMapPath = path.join(file.base, mapFile); + + // Create new sourcemap File + sourceMapFile = createSourceMapFile({ + cwd: file.cwd, + base: file.base, + path: sourceMapPath, + content: file.sourceMap, + }); + + var sourcemapLocation = path.relative(file.dirname, sourceMapPath); + + sourcemapLocation = normalizePath(sourcemapLocation); + + comment = convert.generateMapFileComment(sourcemapLocation, commentOpts); + } + + // Append source map comment + file.contents = appendBuffer(file.contents, comment); + + callback(null, file, sourceMapFile); +} + +module.exports = { + addSourceMaps: addSourceMaps, + writeSourceMaps: writeSourceMaps, +}; diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/LICENSE.md b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/LICENSE.md new file mode 100644 index 0000000..146cb32 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/LICENSE.md @@ -0,0 +1,21 @@ +## The MIT License (MIT) ## + +Copyright (c) 2014 Hugh Kennedy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/README.md b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/README.md new file mode 100644 index 0000000..8b12b6f --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/README.md @@ -0,0 +1,17 @@ +# clone-stats [![Flattr this!](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=hughskennedy&url=http://github.com/hughsk/clone-stats&title=clone-stats&description=hughsk/clone-stats%20on%20GitHub&language=en_GB&tags=flattr,github,javascript&category=software)[![experimental](http://hughsk.github.io/stability-badges/dist/experimental.svg)](http://github.com/hughsk/stability-badges) # + +Safely clone node's +[`fs.Stats`](http://nodejs.org/api/fs.html#fs_class_fs_stats) instances without +losing their class methods, i.e. `stat.isDirectory()` and co. + +## Usage ## + +[![clone-stats](https://nodei.co/npm/clone-stats.png?mini=true)](https://nodei.co/npm/clone-stats) + +### `copy = require('clone-stats')(stat)` ### + +Returns a clone of the original `fs.Stats` instance (`stat`). + +## License ## + +MIT. See [LICENSE.md](http://github.com/hughsk/clone-stats/blob/master/LICENSE.md) for details. diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/index.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/index.js new file mode 100644 index 0000000..e797cfe --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/index.js @@ -0,0 +1,13 @@ +var Stat = require('fs').Stats + +module.exports = cloneStats + +function cloneStats(stats) { + var replacement = new Stat + + Object.keys(stats).forEach(function(key) { + replacement[key] = stats[key] + }) + + return replacement +} diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/package.json b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/package.json new file mode 100644 index 0000000..9aed7bc --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/package.json @@ -0,0 +1,60 @@ +{ + "_from": "clone-stats@^1.0.0", + "_id": "clone-stats@1.0.0", + "_inBundle": false, + "_integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "_location": "/vinyl-sourcemap/clone-stats", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "clone-stats@^1.0.0", + "name": "clone-stats", + "escapedName": "clone-stats", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/vinyl-sourcemap/vinyl" + ], + "_resolved": "https://registry.nlark.com/clone-stats/download/clone-stats-1.0.0.tgz", + "_shasum": "b3782dff8bb5474e18b9b6bf0fdfe782f8777680", + "_spec": "clone-stats@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-sourcemap\\node_modules\\vinyl", + "author": { + "name": "Hugh Kennedy", + "email": "hughskennedy@gmail.com", + "url": "http://hughsk.io/" + }, + "browser": "index.js", + "bugs": { + "url": "https://github.com/hughsk/clone-stats/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Safely clone node's fs.Stats instances without losing their class methods", + "devDependencies": { + "tape": "~2.3.2" + }, + "homepage": "https://github.com/hughsk/clone-stats", + "keywords": [ + "stats", + "fs", + "clone", + "copy", + "prototype" + ], + "license": "MIT", + "main": "index.js", + "name": "clone-stats", + "repository": { + "type": "git", + "url": "git://github.com/hughsk/clone-stats.git" + }, + "scripts": { + "test": "node test" + }, + "version": "1.0.0" +} diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/test.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/test.js new file mode 100644 index 0000000..e4bb281 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone-stats/test.js @@ -0,0 +1,36 @@ +var test = require('tape') +var clone = require('./') +var fs = require('fs') + +test('file', function(t) { + compare(t, fs.statSync(__filename)) + t.end() +}) + +test('directory', function(t) { + compare(t, fs.statSync(__dirname)) + t.end() +}) + +function compare(t, stat) { + var copy = clone(stat) + + t.deepEqual(stat, copy, 'clone has equal properties') + t.ok(stat instanceof fs.Stats, 'original is an fs.Stat') + t.ok(copy instanceof fs.Stats, 'copy is an fs.Stat') + + ;['isDirectory' + , 'isFile' + , 'isBlockDevice' + , 'isCharacterDevice' + , 'isSymbolicLink' + , 'isFIFO' + , 'isSocket' + ].forEach(function(method) { + t.equal( + stat[method].call(stat) + , copy[method].call(copy) + , 'equal value for stat.' + method + '()' + ) + }) +} diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/.npmignore b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/.npmignore new file mode 100644 index 0000000..2ff84f0 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/.npmignore @@ -0,0 +1,4 @@ +/node_modules/ +/test.js +/.travis.yml +*.html diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/LICENSE b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/LICENSE new file mode 100644 index 0000000..cc3c87b --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/LICENSE @@ -0,0 +1,18 @@ +Copyright © 2011-2015 Paul Vorbach + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/README.md b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/README.md new file mode 100644 index 0000000..207e60a --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/README.md @@ -0,0 +1,194 @@ +# clone + +[![build status](https://secure.travis-ci.org/pvorb/clone.svg)](http://travis-ci.org/pvorb/clone) [![downloads](https://img.shields.io/npm/dt/clone.svg)](http://npm-stat.com/charts.html?package=clone) + +offers foolproof _deep cloning_ of objects, arrays, numbers, strings, maps, +sets, promises, etc. in JavaScript. + +**XSS vulnerability detected** + + +## Installation + + npm install clone + +(It also works with browserify, ender or standalone. You may want to use the +option `noParse` in browserify to reduce the resulting file size, since usually +`Buffer`s are not needed in browsers.) + + +## Example + +~~~ javascript +var clone = require('clone'); + +var a, b; + +a = { foo: { bar: 'baz' } }; // initial value of a + +b = clone(a); // clone a -> b +a.foo.bar = 'foo'; // change a + +console.log(a); // show a +console.log(b); // show b +~~~ + +This will print: + +~~~ javascript +{ foo: { bar: 'foo' } } +{ foo: { bar: 'baz' } } +~~~ + +**clone** masters cloning simple objects (even with custom prototype), arrays, +Date objects, and RegExp objects. Everything is cloned recursively, so that you +can clone dates in arrays in objects, for example. + + +## API + +`clone(val, circular, depth)` + + * `val` -- the value that you want to clone, any type allowed + * `circular` -- boolean + + Call `clone` with `circular` set to `false` if you are certain that `obj` + contains no circular references. This will give better performance if + needed. There is no error if `undefined` or `null` is passed as `obj`. + * `depth` -- depth to which the object is to be cloned (optional, + defaults to infinity) + * `prototype` -- sets the prototype to be used when cloning an object. + (optional, defaults to parent prototype). + * `includeNonEnumerable` -- set to `true` if the non-enumerable properties + should be cloned as well. Non-enumerable properties on the prototype chain + will be ignored. (optional, defaults to `false`) + +`clone.clonePrototype(obj)` + + * `obj` -- the object that you want to clone + +Does a prototype clone as +[described by Oran Looney](http://oranlooney.com/functional-javascript/). + + +## Circular References + +~~~ javascript +var a, b; + +a = { hello: 'world' }; + +a.myself = a; +b = clone(a); + +console.log(b); +~~~ + +This will print: + +~~~ javascript +{ hello: "world", myself: [Circular] } +~~~ + +So, `b.myself` points to `b`, not `a`. Neat! + + +## Test + + npm test + + +## Changelog + +### v2.1.2 + +#### 2018-03-21 + + - Use `Buffer.allocUnsafe()` on Node >= 4.5.0 (contributed by @ChALkeR) + +### v2.1.1 + +#### 2017-03-09 + + - Fix build badge in README + - Add support for cloning Maps and Sets on Internet Explorer + +### v2.1.0 + +#### 2016-11-22 + + - Add support for cloning Errors + - Exclude non-enumerable symbol-named object properties from cloning + - Add option to include non-enumerable own properties of objects + +### v2.0.0 + +#### 2016-09-28 + + - Add support for cloning ES6 Maps, Sets, Promises, and Symbols + +### v1.0.3 + +#### 2017-11-08 + + - Close XSS vulnerability in the NPM package, which included the file + `test-apart-ctx.html`. This vulnerability was disclosed by Juho Nurminen of + 2NS - Second Nature Security. + +### v1.0.2 (deprecated) + +#### 2015-03-25 + + - Fix call on getRegExpFlags + - Refactor utilities + - Refactor test suite + +### v1.0.1 (deprecated) + +#### 2015-03-04 + + - Fix nodeunit version + - Directly call getRegExpFlags + +### v1.0.0 (deprecated) + +#### 2015-02-10 + + - Improve browser support + - Improve browser testability + - Move helper methods to private namespace + +## Caveat + +Some special objects like a socket or `process.stdout`/`stderr` are known to not +be cloneable. If you find other objects that cannot be cloned, please [open an +issue](https://github.com/pvorb/clone/issues/new). + + +## Bugs and Issues + +If you encounter any bugs or issues, feel free to [open an issue at +github](https://github.com/pvorb/clone/issues) or send me an email to +. I also always like to hear from you, if you’re using my code. + +## License + +Copyright © 2011-2016 [Paul Vorbach](https://paul.vorba.ch/) and +[contributors](https://github.com/pvorb/clone/graphs/contributors). + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/clone.iml b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/clone.iml new file mode 100644 index 0000000..30de8ae --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/clone.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/clone.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/clone.js new file mode 100644 index 0000000..3fa5fad --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/clone.js @@ -0,0 +1,257 @@ +var clone = (function() { +'use strict'; + +function _instanceof(obj, type) { + return type != null && obj instanceof type; +} + +var nativeMap; +try { + nativeMap = Map; +} catch(_) { + // maybe a reference error because no `Map`. Give it a dummy value that no + // value will ever be an instanceof. + nativeMap = function() {}; +} + +var nativeSet; +try { + nativeSet = Set; +} catch(_) { + nativeSet = function() {}; +} + +var nativePromise; +try { + nativePromise = Promise; +} catch(_) { + nativePromise = function() {}; +} + +/** + * Clones (copies) an Object using deep copying. + * + * This function supports circular references by default, but if you are certain + * there are no circular references in your object, you can save some CPU time + * by calling clone(obj, false). + * + * Caution: if `circular` is false and `parent` contains circular references, + * your program may enter an infinite loop and crash. + * + * @param `parent` - the object to be cloned + * @param `circular` - set to true if the object to be cloned may contain + * circular references. (optional - true by default) + * @param `depth` - set to a number if the object is only to be cloned to + * a particular depth. (optional - defaults to Infinity) + * @param `prototype` - sets the prototype to be used when cloning an object. + * (optional - defaults to parent prototype). + * @param `includeNonEnumerable` - set to true if the non-enumerable properties + * should be cloned as well. Non-enumerable properties on the prototype + * chain will be ignored. (optional - false by default) +*/ +function clone(parent, circular, depth, prototype, includeNonEnumerable) { + if (typeof circular === 'object') { + depth = circular.depth; + prototype = circular.prototype; + includeNonEnumerable = circular.includeNonEnumerable; + circular = circular.circular; + } + // maintain two arrays for circular references, where corresponding parents + // and children have the same index + var allParents = []; + var allChildren = []; + + var useBuffer = typeof Buffer != 'undefined'; + + if (typeof circular == 'undefined') + circular = true; + + if (typeof depth == 'undefined') + depth = Infinity; + + // recurse this function so we don't reset allParents and allChildren + function _clone(parent, depth) { + // cloning null always returns null + if (parent === null) + return null; + + if (depth === 0) + return parent; + + var child; + var proto; + if (typeof parent != 'object') { + return parent; + } + + if (_instanceof(parent, nativeMap)) { + child = new nativeMap(); + } else if (_instanceof(parent, nativeSet)) { + child = new nativeSet(); + } else if (_instanceof(parent, nativePromise)) { + child = new nativePromise(function (resolve, reject) { + parent.then(function(value) { + resolve(_clone(value, depth - 1)); + }, function(err) { + reject(_clone(err, depth - 1)); + }); + }); + } else if (clone.__isArray(parent)) { + child = []; + } else if (clone.__isRegExp(parent)) { + child = new RegExp(parent.source, __getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else if (clone.__isDate(parent)) { + child = new Date(parent.getTime()); + } else if (useBuffer && Buffer.isBuffer(parent)) { + if (Buffer.allocUnsafe) { + // Node.js >= 4.5.0 + child = Buffer.allocUnsafe(parent.length); + } else { + // Older Node.js versions + child = new Buffer(parent.length); + } + parent.copy(child); + return child; + } else if (_instanceof(parent, Error)) { + child = Object.create(parent); + } else { + if (typeof prototype == 'undefined') { + proto = Object.getPrototypeOf(parent); + child = Object.create(proto); + } + else { + child = Object.create(prototype); + proto = prototype; + } + } + + if (circular) { + var index = allParents.indexOf(parent); + + if (index != -1) { + return allChildren[index]; + } + allParents.push(parent); + allChildren.push(child); + } + + if (_instanceof(parent, nativeMap)) { + parent.forEach(function(value, key) { + var keyChild = _clone(key, depth - 1); + var valueChild = _clone(value, depth - 1); + child.set(keyChild, valueChild); + }); + } + if (_instanceof(parent, nativeSet)) { + parent.forEach(function(value) { + var entryChild = _clone(value, depth - 1); + child.add(entryChild); + }); + } + + for (var i in parent) { + var attrs; + if (proto) { + attrs = Object.getOwnPropertyDescriptor(proto, i); + } + + if (attrs && attrs.set == null) { + continue; + } + child[i] = _clone(parent[i], depth - 1); + } + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(parent); + for (var i = 0; i < symbols.length; i++) { + // Don't need to worry about cloning a symbol because it is a primitive, + // like a number or string. + var symbol = symbols[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, symbol); + if (descriptor && !descriptor.enumerable && !includeNonEnumerable) { + continue; + } + child[symbol] = _clone(parent[symbol], depth - 1); + if (!descriptor.enumerable) { + Object.defineProperty(child, symbol, { + enumerable: false + }); + } + } + } + + if (includeNonEnumerable) { + var allPropertyNames = Object.getOwnPropertyNames(parent); + for (var i = 0; i < allPropertyNames.length; i++) { + var propertyName = allPropertyNames[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName); + if (descriptor && descriptor.enumerable) { + continue; + } + child[propertyName] = _clone(parent[propertyName], depth - 1); + Object.defineProperty(child, propertyName, { + enumerable: false + }); + } + } + + return child; + } + + return _clone(parent, depth); +} + +/** + * Simple flat clone using prototype, accepts only objects, usefull for property + * override on FLAT configuration object (no nested props). + * + * USE WITH CAUTION! This may not behave as you wish if you do not know how this + * works. + */ +clone.clonePrototype = function clonePrototype(parent) { + if (parent === null) + return null; + + var c = function () {}; + c.prototype = parent; + return new c(); +}; + +// private utility functions + +function __objToStr(o) { + return Object.prototype.toString.call(o); +} +clone.__objToStr = __objToStr; + +function __isDate(o) { + return typeof o === 'object' && __objToStr(o) === '[object Date]'; +} +clone.__isDate = __isDate; + +function __isArray(o) { + return typeof o === 'object' && __objToStr(o) === '[object Array]'; +} +clone.__isArray = __isArray; + +function __isRegExp(o) { + return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; +} +clone.__isRegExp = __isRegExp; + +function __getRegExpFlags(re) { + var flags = ''; + if (re.global) flags += 'g'; + if (re.ignoreCase) flags += 'i'; + if (re.multiline) flags += 'm'; + return flags; +} +clone.__getRegExpFlags = __getRegExpFlags; + +return clone; +})(); + +if (typeof module === 'object' && module.exports) { + module.exports = clone; +} diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/package.json b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/package.json new file mode 100644 index 0000000..360c7d2 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/clone/package.json @@ -0,0 +1,158 @@ +{ + "_from": "clone@^2.1.1", + "_id": "clone@2.1.2", + "_inBundle": false, + "_integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "_location": "/vinyl-sourcemap/clone", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "clone@^2.1.1", + "name": "clone", + "escapedName": "clone", + "rawSpec": "^2.1.1", + "saveSpec": null, + "fetchSpec": "^2.1.1" + }, + "_requiredBy": [ + "/vinyl-sourcemap/vinyl" + ], + "_resolved": "https://registry.nlark.com/clone/download/clone-2.1.2.tgz", + "_shasum": "1b7f4b9f591f1e8f83670401600345a02887435f", + "_spec": "clone@^2.1.1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-sourcemap\\node_modules\\vinyl", + "author": { + "name": "Paul Vorbach", + "email": "paul@vorba.ch", + "url": "http://paul.vorba.ch/" + }, + "bugs": { + "url": "https://github.com/pvorb/node-clone/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Blake Miner", + "email": "miner.blake@gmail.com", + "url": "http://www.blakeminer.com/" + }, + { + "name": "Tian You", + "email": "axqd001@gmail.com", + "url": "http://blog.axqd.net/" + }, + { + "name": "George Stagas", + "email": "gstagas@gmail.com", + "url": "http://stagas.com/" + }, + { + "name": "Tobiasz Cudnik", + "email": "tobiasz.cudnik@gmail.com", + "url": "https://github.com/TobiaszCudnik" + }, + { + "name": "Pavel Lang", + "email": "langpavel@phpskelet.org", + "url": "https://github.com/langpavel" + }, + { + "name": "Dan MacTough", + "url": "http://yabfog.com/" + }, + { + "name": "w1nk", + "url": "https://github.com/w1nk" + }, + { + "name": "Hugh Kennedy", + "url": "http://twitter.com/hughskennedy" + }, + { + "name": "Dustin Diaz", + "url": "http://dustindiaz.com" + }, + { + "name": "Ilya Shaisultanov", + "url": "https://github.com/diversario" + }, + { + "name": "Nathan MacInnes", + "email": "nathan@macinn.es", + "url": "http://macinn.es/" + }, + { + "name": "Benjamin E. Coe", + "email": "ben@npmjs.com", + "url": "https://twitter.com/benjamincoe" + }, + { + "name": "Nathan Zadoks", + "url": "https://github.com/nathan7" + }, + { + "name": "Róbert Oroszi", + "email": "robert+gh@oroszi.net", + "url": "https://github.com/oroce" + }, + { + "name": "Aurélio A. Heckert", + "url": "http://softwarelivre.org/aurium" + }, + { + "name": "Guy Ellis", + "url": "http://www.guyellisrocks.com/" + }, + { + "name": "fscherwi", + "url": "https://fscherwi.github.io" + }, + { + "name": "rictic", + "url": "https://github.com/rictic" + }, + { + "name": "Martin Jurča", + "url": "https://github.com/jurca" + }, + { + "name": "Misery Lee", + "email": "miserylee@foxmail.com", + "url": "https://github.com/miserylee" + }, + { + "name": "Clemens Wolff", + "url": "https://github.com/c-w" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "deep cloning of objects and arrays", + "devDependencies": { + "nodeunit": "~0.9.0" + }, + "engines": { + "node": ">=0.8" + }, + "homepage": "https://github.com/pvorb/node-clone#readme", + "license": "MIT", + "main": "clone.js", + "name": "clone", + "optionalDependencies": {}, + "repository": { + "type": "git", + "url": "git://github.com/pvorb/node-clone.git" + }, + "scripts": { + "test": "nodeunit test.js" + }, + "tags": [ + "clone", + "object", + "array", + "function", + "date" + ], + "version": "2.1.2" +} diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/LICENSE b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/LICENSE new file mode 100644 index 0000000..fd38d69 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/README.md b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/README.md new file mode 100644 index 0000000..acfcfd0 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/README.md @@ -0,0 +1,62 @@ +

+ + + +

+ +# replace-ext + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Replaces a file extension with another one. + +## Usage + +```js +var replaceExt = require('replace-ext'); + +var path = '/some/dir/file.js'; +var newPath = replaceExt(path, '.coffee'); + +console.log(newPath); // /some/dir/file.coffee +``` + +## API + +### `replaceExt(path, extension)` + +Replaces the extension from `path` with `extension` and returns the updated path string. + +Does not replace the extension if `path` is not a string or is empty. + + +## replace-ext for enterprise + +Available as part of the Tidelift Subscription + +The maintainers of replace-ext and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-replace-ext?utm_source=npm-replace-ext&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + + +## License + +MIT + +[downloads-image]: http://img.shields.io/npm/dm/replace-ext.svg +[npm-url]: https://www.npmjs.com/package/replace-ext +[npm-image]: http://img.shields.io/npm/v/replace-ext.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/replace-ext/_build/latest?branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/replace-ext/_apis/build/status/replace-ext?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/replace-ext +[travis-image]: http://img.shields.io/travis/gulpjs/replace-ext.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/replace-ext +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/replace-ext.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/replace-ext +[coveralls-image]: http://img.shields.io/coveralls/gulpjs/replace-ext/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg + diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/index.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/index.js new file mode 100644 index 0000000..7a78278 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/index.js @@ -0,0 +1,33 @@ +'use strict'; + +var path = require('path'); + +function replaceExt(npath, ext) { + if (typeof npath !== 'string') { + return npath; + } + + if (npath.length === 0) { + return npath; + } + + var nFileName = path.basename(npath, path.extname(npath)) + ext; + var nFilepath = path.join(path.dirname(npath), nFileName); + + // Because `path.join` removes the head './' from the given path. + // This removal can cause a problem when passing the result to `require` or + // `import`. + if (startsWithSingleDot(npath)) { + return '.' + path.sep + nFilepath; + } + + return nFilepath; +} + +function startsWithSingleDot(fpath) { + var first2chars = fpath.slice(0, 2); + return (first2chars === '.' + path.sep) || + (first2chars === './'); +} + +module.exports = replaceExt; diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/package.json b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/package.json new file mode 100644 index 0000000..da60283 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/replace-ext/package.json @@ -0,0 +1,85 @@ +{ + "_from": "replace-ext@^1.0.0", + "_id": "replace-ext@1.0.1", + "_inBundle": false, + "_integrity": "sha1-LW2ZbQShWFXZZ0Q2Md1fd4JbAWo=", + "_location": "/vinyl-sourcemap/replace-ext", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "replace-ext@^1.0.0", + "name": "replace-ext", + "escapedName": "replace-ext", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/vinyl-sourcemap/vinyl" + ], + "_resolved": "https://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.1.tgz", + "_shasum": "2d6d996d04a15855d967443631dd5f77825b016a", + "_spec": "replace-ext@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-sourcemap\\node_modules\\vinyl", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/replace-ext/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Eric Schoffstall", + "email": "yo@contra.io" + }, + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "Replaces a file extension with another one", + "devDependencies": { + "coveralls": "github:phated/node-coveralls#2.x", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "mocha": "^3.0.0", + "nyc": "^10.3.2" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js" + ], + "homepage": "https://github.com/gulpjs/replace-ext#readme", + "keywords": [ + "gulp", + "extensions", + "filepath", + "basename" + ], + "license": "MIT", + "main": "index.js", + "name": "replace-ext", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/replace-ext.git" + }, + "scripts": { + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "cover": "nyc --reporter=lcov --reporter=text-summary npm test", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only" + }, + "version": "1.0.1" +} diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/LICENSE b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/LICENSE new file mode 100644 index 0000000..84b3420 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Blaine Bublitz , Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/README.md b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/README.md new file mode 100644 index 0000000..40492a3 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/README.md @@ -0,0 +1,452 @@ +

+ + + +

+ +# vinyl + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Virtual file format. + +## What is Vinyl? + +Vinyl is a very simple metadata object that describes a file. When you think of a file, two attributes come to mind: `path` and `contents`. These are the main attributes on a Vinyl object. A file does not necessarily represent something on your computer’s file system. You have files on S3, FTP, Dropbox, Box, CloudThingly.io and other services. Vinyl can be used to describe files from all of these sources. + +## What is a Vinyl Adapter? + +While Vinyl provides a clean way to describe a file, we also need a way to access these files. Each file source needs what I call a "Vinyl adapter". A Vinyl adapter simply exposes a `src(globs)` and a `dest(folder)` method. Each return a stream. The `src` stream produces Vinyl objects, and the `dest` stream consumes Vinyl objects. Vinyl adapters can expose extra methods that might be specific to their input/output medium, such as the `symlink` method [`vinyl-fs`][vinyl-fs] provides. + +## Usage + +```js +var Vinyl = require('vinyl'); + +var jsFile = new Vinyl({ + cwd: '/', + base: '/test/', + path: '/test/file.js', + contents: Buffer.from('var x = 123') +}); +``` + +## API + +### `new Vinyl([options])` + +The constructor is used to create a new instance of `Vinyl`. Each instance represents a separate file, directory or symlink. + +All internally managed paths (`cwd`, `base`, `path`, `history`) are normalized and have trailing separators removed. See [Normalization and concatenation][normalization] for more information. + +Options may be passed upon instantiation to create a file with specific properties. + +#### `options` + +Options are not mutated by the constructor. + +##### `options.cwd` + +The current working directory of the file. + +Type: `String` + +Default: `process.cwd()` + +##### `options.base` + +Used for calculating the `relative` property. This is typically where a glob starts. + +Type: `String` + +Default: `options.cwd` + +##### `options.path` + +The full path to the file. + +Type: `String` + +Default: `undefined` + +##### `options.history` + +Stores the path history. If `options.path` and `options.history` are both passed, `options.path` is appended to `options.history`. All `options.history` paths are normalized by the `file.path` setter. + +Type: `Array` + +Default: `[]` (or `[options.path]` if `options.path` is passed) + +##### `options.stat` + +The result of an `fs.stat` call. This is how you mark the file as a directory or symbolic link. See [isDirectory()][is-directory], [isSymbolic()][is-symbolic] and [fs.Stats][fs-stats] for more information. + +Type: [`fs.Stats`][fs-stats] + +Default: `undefined` + +##### `options.contents` + +The contents of the file. If `options.contents` is a [`ReadableStream`][readable-stream], it is wrapped in a [`cloneable-readable`][cloneable-readable] stream. + +Type: [`ReadableStream`][readable-stream], [`Buffer`][buffer], or `null` + +Default: `null` + +##### `options.{custom}` + +Any other option properties will be directly assigned to the new Vinyl object. + +```js +var Vinyl = require('vinyl'); + +var file = new Vinyl({ foo: 'bar' }); +file.foo === 'bar'; // true +``` + +### Instance methods + +Each Vinyl object will have instance methods. Every method will be available but may return differently based on what properties were set upon instantiation or modified since. + +#### `file.isBuffer()` + +Returns `true` if the file contents are a [`Buffer`][buffer], otherwise `false`. + +#### `file.isStream()` + +Returns `true` if the file contents are a [`Stream`][stream], otherwise `false`. + +#### `file.isNull()` + +Returns `true` if the file contents are `null`, otherwise `false`. + +#### `file.isDirectory()` + +Returns `true` if the file represents a directory, otherwise `false`. + +A file is considered a directory when: + +- `file.isNull()` is `true` +- `file.stat` is an object +- `file.stat.isDirectory()` returns `true` + +When constructing a Vinyl object, pass in a valid [`fs.Stats`][fs-stats] object via `options.stat`. If you are mocking the [`fs.Stats`][fs-stats] object, you may need to stub the `isDirectory()` method. + +#### `file.isSymbolic()` + +Returns `true` if the file represents a symbolic link, otherwise `false`. + +A file is considered symbolic when: + +- `file.isNull()` is `true` +- `file.stat` is an object +- `file.stat.isSymbolicLink()` returns `true` + +When constructing a Vinyl object, pass in a valid [`fs.Stats`][fs-stats] object via `options.stat`. If you are mocking the [`fs.Stats`][fs-stats] object, you may need to stub the `isSymbolicLink()` method. + +#### `file.clone([options])` + +Returns a new Vinyl object with all attributes cloned. + +__By default custom attributes are cloned deeply.__ + +If `options` or `options.deep` is `false`, custom attributes will not be cloned deeply. + +If `file.contents` is a [`Buffer`][buffer] and `options.contents` is `false`, the [`Buffer`][buffer] reference will be reused instead of copied. + +#### `file.inspect()` + +Returns a formatted-string interpretation of the Vinyl object. Automatically called by node's `console.log`. + +### Instance properties + +Each Vinyl object will have instance properties. Some may be unavailable based on what properties were set upon instantiation or modified since. + +#### `file.contents` + +Gets and sets the contents of the file. If set to a [`ReadableStream`][readable-stream], it is wrapped in a [`cloneable-readable`][cloneable-readable] stream. + +Throws when set to any value other than a [`ReadableStream`][readable-stream], a [`Buffer`][buffer] or `null`. + +Type: [`ReadableStream`][readable-stream], [`Buffer`][buffer], or `null` + +#### `file.cwd` + +Gets and sets current working directory. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than non-empty strings. + +Type: `String` + +#### `file.base` + +Gets and sets base directory. Used for relative pathing (typically where a glob starts). +When `null` or `undefined`, it simply proxies the `file.cwd` property. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than non-empty strings or `null`/`undefined`. + +Type: `String` + +#### `file.path` + +Gets and sets the absolute pathname string or `undefined`. Setting to a different value appends the new path to `file.history`. If set to the same value as the current path, it is ignored. All new values are normalized and have trailing separators removed. + +Throws when set to any value other than a string. + +Type: `String` + +#### `file.history` + +Array of `file.path` values the Vinyl object has had, from `file.history[0]` (original) through `file.history[file.history.length - 1]` (current). `file.history` and its elements should normally be treated as read-only and only altered indirectly by setting `file.path`. + +Type: `Array` + +#### `file.relative` + +Gets the result of `path.relative(file.base, file.path)`. + +Throws when set or when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.relative); // file.js +``` + +#### `file.dirname` + +Gets and sets the dirname of `file.path`. Will always be normalized and have trailing separators removed. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.dirname); // /test + +file.dirname = '/specs'; + +console.log(file.dirname); // /specs +console.log(file.path); // /specs/file.js +``` + +#### `file.basename` + +Gets and sets the basename of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.basename); // file.js + +file.basename = 'file.txt'; + +console.log(file.basename); // file.txt +console.log(file.path); // /test/file.txt +``` + +#### `file.stem` + +Gets and sets stem (filename without suffix) of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.stem); // file + +file.stem = 'foo'; + +console.log(file.stem); // foo +console.log(file.path); // /test/foo.js +``` + +#### `file.extname` + +Gets and sets extname of `file.path`. + +Throws when `file.path` is not set. + +Type: `String` + +Example: + +```js +var file = new File({ + cwd: '/', + base: '/test/', + path: '/test/file.js' +}); + +console.log(file.extname); // .js + +file.extname = '.txt'; + +console.log(file.extname); // .txt +console.log(file.path); // /test/file.txt +``` + +#### `file.symlink` + +Gets and sets the path where the file points to if it's a symbolic link. Will always be normalized and have trailing separators removed. + +Throws when set to any value other than a string. + +Type: `String` + +### `Vinyl.isVinyl(file)` + +Static method used for checking if an object is a Vinyl file. Use this method instead of `instanceof`. + +Takes an object and returns `true` if it is a Vinyl file, otherwise returns `false`. + +__Note: This method uses an internal flag that some older versions of Vinyl didn't expose.__ + +Example: + +```js +var Vinyl = require('vinyl'); + +var file = new Vinyl(); +var notAFile = {}; + +Vinyl.isVinyl(file); // true +Vinyl.isVinyl(notAFile); // false +``` + +### `Vinyl.isCustomProp(property)` + +Static method used by Vinyl when setting values inside the constructor or when copying properties in `file.clone()`. + +Takes a string `property` and returns `true` if the property is not used internally, otherwise returns `false`. + +This method is useful for inheritting from the Vinyl constructor. Read more in [Extending Vinyl][extending-vinyl]. + +Example: + +```js +var Vinyl = require('vinyl'); + +Vinyl.isCustomProp('sourceMap'); // true +Vinyl.isCustomProp('path'); // false -> internal getter/setter +``` + +## Normalization and concatenation + +Since all properties are normalized in their setters, you can just concatenate with `/`, and normalization takes care of it properly on all platforms. + +Example: + +```js +var file = new File(); +file.path = '/' + 'test' + '/' + 'foo.bar'; + +console.log(file.path); +// posix => /test/foo.bar +// win32 => \\test\\foo.bar +``` + +But never concatenate with `\`, since that is a valid filename character on posix system. + +## Extending Vinyl + +When extending Vinyl into your own class with extra features, you need to think about a few things. + +When you have your own properties that are managed internally, you need to extend the static `isCustomProp` method to return `false` when one of these properties is queried. + +```js +var Vinyl = require('vinyl'); + +var builtInProps = ['foo', '_foo']; + +class SuperFile extends Vinyl { + constructor(options) { + super(options); + this._foo = 'example internal read-only value'; + } + + get foo() { + return this._foo; + } + + static isCustomProp(name) { + return super.isCustomProp(name) && builtInProps.indexOf(name) === -1; + } +} + +// `foo` won't be assigned to the object below +new SuperFile({ foo: "something" }); +``` + +This makes properties `foo` and `_foo` skipped when passed in options to `constructor(options)` so they don't get assigned to the new object and override your custom implementation. They also won't be copied when cloning. __Note:__ The `_foo` and `foo` properties will still exist on the created/cloned object because you are assigning `_foo` in the constructor and `foo` is defined on the prototype. + +Same goes for `clone()`. If you have your own internal stuff that needs special handling during cloning, you should extend it to do so. + +## License + +MIT + +[is-symbolic]: #issymbolic +[is-directory]: #isdirectory +[normalization]: #normalization-and-concatenation +[extending-vinyl]: #extending-vinyl +[stream]: https://nodejs.org/api/stream.html#stream_stream +[readable-stream]: https://nodejs.org/api/stream.html#stream_readable_streams +[buffer]: https://nodejs.org/api/buffer.html#buffer_class_buffer +[fs-stats]: http://nodejs.org/api/fs.html#fs_class_fs_stats +[vinyl-fs]: https://github.com/gulpjs/vinyl-fs +[cloneable-readable]: https://github.com/mcollina/cloneable-readable + +[downloads-image]: https://img.shields.io/npm/dm/vinyl.svg +[npm-url]: https://www.npmjs.com/package/vinyl +[npm-image]: https://img.shields.io/npm/v/vinyl.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=$PROJECT_ID&branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/vinyl?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/vinyl +[travis-image]: https://img.shields.io/travis/gulpjs/vinyl.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/vinyl +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/vinyl.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl +[coveralls-image]: https://img.shields.io/coveralls/gulpjs/vinyl/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/index.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/index.js new file mode 100644 index 0000000..3a16e91 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/index.js @@ -0,0 +1,338 @@ +'use strict'; + +var path = require('path'); +var util = require('util'); +var isBuffer = require('buffer').Buffer.isBuffer; + +var clone = require('clone'); +var cloneable = require('cloneable-readable'); +var replaceExt = require('replace-ext'); +var cloneStats = require('clone-stats'); +var cloneBuffer = require('clone-buffer'); +var removeTrailingSep = require('remove-trailing-separator'); + +var isStream = require('./lib/is-stream'); +var normalize = require('./lib/normalize'); +var inspectStream = require('./lib/inspect-stream'); + +var builtInFields = [ + '_contents', '_symlink', 'contents', 'stat', 'history', 'path', + '_base', 'base', '_cwd', 'cwd', +]; + +function File(file) { + var self = this; + + if (!file) { + file = {}; + } + + // Stat = files stats object + this.stat = file.stat || null; + + // Contents = stream, buffer, or null if not read + this.contents = file.contents || null; + + // Replay path history to ensure proper normalization and trailing sep + var history = Array.prototype.slice.call(file.history || []); + if (file.path) { + history.push(file.path); + } + this.history = []; + history.forEach(function(path) { + self.path = path; + }); + + this.cwd = file.cwd || process.cwd(); + this.base = file.base; + + this._isVinyl = true; + + this._symlink = null; + + // Set custom properties + Object.keys(file).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + self[key] = file[key]; + } + }); +} + +File.prototype.isBuffer = function() { + return isBuffer(this.contents); +}; + +File.prototype.isStream = function() { + return isStream(this.contents); +}; + +File.prototype.isNull = function() { + return (this.contents === null); +}; + +File.prototype.isDirectory = function() { + if (!this.isNull()) { + return false; + } + + if (this.stat && typeof this.stat.isDirectory === 'function') { + return this.stat.isDirectory(); + } + + return false; +}; + +File.prototype.isSymbolic = function() { + if (!this.isNull()) { + return false; + } + + if (this.stat && typeof this.stat.isSymbolicLink === 'function') { + return this.stat.isSymbolicLink(); + } + + return false; +}; + +File.prototype.clone = function(opt) { + var self = this; + + if (typeof opt === 'boolean') { + opt = { + deep: opt, + contents: true, + }; + } else if (!opt) { + opt = { + deep: true, + contents: true, + }; + } else { + opt.deep = opt.deep === true; + opt.contents = opt.contents !== false; + } + + // Clone our file contents + var contents; + if (this.isStream()) { + contents = this.contents.clone(); + } else if (this.isBuffer()) { + contents = opt.contents ? cloneBuffer(this.contents) : this.contents; + } + + var file = new this.constructor({ + cwd: this.cwd, + base: this.base, + stat: (this.stat ? cloneStats(this.stat) : null), + history: this.history.slice(), + contents: contents, + }); + + if (this.isSymbolic()) { + file.symlink = this.symlink; + } + + // Clone our custom properties + Object.keys(this).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + file[key] = opt.deep ? clone(self[key], true) : self[key]; + } + }); + return file; +}; + +File.prototype.inspect = function() { + var inspect = []; + + // Use relative path if possible + var filePath = this.path ? this.relative : null; + + if (filePath) { + inspect.push('"' + filePath + '"'); + } + + if (this.isBuffer()) { + inspect.push(this.contents.inspect()); + } + + if (this.isStream()) { + inspect.push(inspectStream(this.contents)); + } + + return ''; +}; + +// Newer Node.js versions use this symbol for custom inspection. +if (util.inspect.custom) { + File.prototype[util.inspect.custom] = File.prototype.inspect; +} + +File.isCustomProp = function(key) { + return builtInFields.indexOf(key) === -1; +}; + +File.isVinyl = function(file) { + return (file && file._isVinyl === true) || false; +}; + +// Virtual attributes +// Or stuff with extra logic +Object.defineProperty(File.prototype, 'contents', { + get: function() { + return this._contents; + }, + set: function(val) { + if (!isBuffer(val) && !isStream(val) && (val !== null)) { + throw new Error('File.contents can only be a Buffer, a Stream, or null.'); + } + + // Ask cloneable if the stream is a already a cloneable + // this avoid piping into many streams + // reducing the overhead of cloning + if (isStream(val) && !cloneable.isCloneable(val)) { + val = cloneable(val); + } + + this._contents = val; + }, +}); + +Object.defineProperty(File.prototype, 'cwd', { + get: function() { + return this._cwd; + }, + set: function(cwd) { + if (!cwd || typeof cwd !== 'string') { + throw new Error('cwd must be a non-empty string.'); + } + this._cwd = removeTrailingSep(normalize(cwd)); + }, +}); + +Object.defineProperty(File.prototype, 'base', { + get: function() { + return this._base || this._cwd; + }, + set: function(base) { + if (base == null) { + delete this._base; + return; + } + if (typeof base !== 'string' || !base) { + throw new Error('base must be a non-empty string, or null/undefined.'); + } + base = removeTrailingSep(normalize(base)); + if (base !== this._cwd) { + this._base = base; + } else { + delete this._base; + } + }, +}); + +// TODO: Should this be moved to vinyl-fs? +Object.defineProperty(File.prototype, 'relative', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get relative.'); + } + return path.relative(this.base, this.path); + }, + set: function() { + throw new Error('File.relative is generated from the base and path attributes. Do not modify it.'); + }, +}); + +Object.defineProperty(File.prototype, 'dirname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get dirname.'); + } + return path.dirname(this.path); + }, + set: function(dirname) { + if (!this.path) { + throw new Error('No path specified! Can not set dirname.'); + } + this.path = path.join(dirname, this.basename); + }, +}); + +Object.defineProperty(File.prototype, 'basename', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get basename.'); + } + return path.basename(this.path); + }, + set: function(basename) { + if (!this.path) { + throw new Error('No path specified! Can not set basename.'); + } + this.path = path.join(this.dirname, basename); + }, +}); + +// Property for getting/setting stem of the filename. +Object.defineProperty(File.prototype, 'stem', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get stem.'); + } + return path.basename(this.path, this.extname); + }, + set: function(stem) { + if (!this.path) { + throw new Error('No path specified! Can not set stem.'); + } + this.path = path.join(this.dirname, stem + this.extname); + }, +}); + +Object.defineProperty(File.prototype, 'extname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get extname.'); + } + return path.extname(this.path); + }, + set: function(extname) { + if (!this.path) { + throw new Error('No path specified! Can not set extname.'); + } + this.path = replaceExt(this.path, extname); + }, +}); + +Object.defineProperty(File.prototype, 'path', { + get: function() { + return this.history[this.history.length - 1]; + }, + set: function(path) { + if (typeof path !== 'string') { + throw new Error('path should be a string.'); + } + path = removeTrailingSep(normalize(path)); + + // Record history only when path changed + if (path && path !== this.path) { + this.history.push(path); + } + }, +}); + +Object.defineProperty(File.prototype, 'symlink', { + get: function() { + return this._symlink; + }, + set: function(symlink) { + // TODO: should this set the mode to symbolic if set? + if (typeof symlink !== 'string') { + throw new Error('symlink should be a string'); + } + + this._symlink = removeTrailingSep(normalize(symlink)); + }, +}); + +module.exports = File; diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/inspect-stream.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/inspect-stream.js new file mode 100644 index 0000000..9faaa0a --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/inspect-stream.js @@ -0,0 +1,13 @@ +'use strict'; + +function inspectStream(stream) { + var streamType = stream.constructor.name; + // Avoid StreamStream + if (streamType === 'Stream') { + streamType = ''; + } + + return '<' + streamType + 'Stream>'; +} + +module.exports = inspectStream; diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/is-stream.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/is-stream.js new file mode 100644 index 0000000..04882b4 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/is-stream.js @@ -0,0 +1,15 @@ +'use strict'; + +function isStream(stream) { + if (!stream) { + return false; + } + + if (typeof stream.pipe !== 'function') { + return false; + } + + return true; +} + +module.exports = isStream; diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/normalize.js b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/normalize.js new file mode 100644 index 0000000..f90dcb2 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/lib/normalize.js @@ -0,0 +1,9 @@ +'use strict'; + +var path = require('path'); + +function normalize(str) { + return str === '' ? str : path.normalize(str); +} + +module.exports = normalize; diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/package.json b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/package.json new file mode 100644 index 0000000..80bddd0 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/node_modules/vinyl/package.json @@ -0,0 +1,96 @@ +{ + "_from": "vinyl@^2.0.0", + "_id": "vinyl@2.2.1", + "_inBundle": false, + "_integrity": "sha1-I8+4u6tezjgDqiwKHrKK98u6GXQ=", + "_location": "/vinyl-sourcemap/vinyl", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "vinyl@^2.0.0", + "name": "vinyl", + "escapedName": "vinyl", + "rawSpec": "^2.0.0", + "saveSpec": null, + "fetchSpec": "^2.0.0" + }, + "_requiredBy": [ + "/vinyl-sourcemap" + ], + "_resolved": "https://registry.npm.taobao.org/vinyl/download/vinyl-2.2.1.tgz", + "_shasum": "23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974", + "_spec": "vinyl@^2.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-sourcemap", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "https://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/vinyl/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Eric Schoffstall", + "email": "yo@contra.io" + }, + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "deprecated": false, + "description": "Virtual file format.", + "devDependencies": { + "coveralls": "github:phated/node-coveralls#2.x", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "mississippi": "^1.2.0", + "mocha": "^3.0.0", + "nyc": "^10.3.2", + "safer-buffer": "^2.1.2" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js", + "lib" + ], + "homepage": "https://github.com/gulpjs/vinyl#readme", + "keywords": [ + "virtual", + "filesystem", + "file", + "directory", + "stat", + "path" + ], + "license": "MIT", + "main": "index.js", + "name": "vinyl", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/vinyl.git" + }, + "scripts": { + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only" + }, + "version": "2.2.1" +} diff --git a/packages/字体精简工具/node_modules/vinyl-sourcemap/package.json b/packages/字体精简工具/node_modules/vinyl-sourcemap/package.json new file mode 100644 index 0000000..80441c8 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl-sourcemap/package.json @@ -0,0 +1,98 @@ +{ + "_from": "vinyl-sourcemap@^1.1.0", + "_id": "vinyl-sourcemap@1.1.0", + "_inBundle": false, + "_integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "_location": "/vinyl-sourcemap", + "_phantomChildren": { + "clone-buffer": "1.0.0", + "cloneable-readable": "1.1.3", + "remove-trailing-separator": "1.1.0" + }, + "_requested": { + "type": "range", + "registry": true, + "raw": "vinyl-sourcemap@^1.1.0", + "name": "vinyl-sourcemap", + "escapedName": "vinyl-sourcemap", + "rawSpec": "^1.1.0", + "saveSpec": null, + "fetchSpec": "^1.1.0" + }, + "_requiredBy": [ + "/vinyl-fs" + ], + "_resolved": "https://registry.npm.taobao.org/vinyl-sourcemap/download/vinyl-sourcemap-1.1.0.tgz", + "_shasum": "92a800593a38703a8cdb11d8b300ad4be63b3e16", + "_spec": "vinyl-sourcemap@^1.1.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\vinyl-fs", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/vinyl-sourcemap/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Robin Venneman" + }, + { + "name": "Blaine Bublitz", + "email": "blaine.bublitz@gmail.com" + } + ], + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "deprecated": false, + "description": "Add/write sourcemaps to/from Vinyl files.", + "devDependencies": { + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.20.2", + "istanbul": "^0.4.3", + "istanbul-coveralls": "^1.0.3", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mississippi": "^1.3.0", + "mocha": "^3.2.0" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "LICENSE", + "index.js", + "lib/" + ], + "homepage": "https://github.com/gulpjs/vinyl-sourcemap#readme", + "keywords": [ + "vinyl", + "sourcemap", + "gulp" + ], + "license": "MIT", + "main": "index.js", + "name": "vinyl-sourcemap", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/vinyl-sourcemap.git" + }, + "scripts": { + "cover": "istanbul cover _mocha --report lcovonly", + "coveralls": "npm run cover && istanbul-coveralls", + "lint": "eslint index.js lib/ test/add.js test/write.js && jscs index.js lib/ test/add.js test/write.js", + "pretest": "npm run lint", + "test": "mocha --async-only" + }, + "version": "1.1.0" +} diff --git a/packages/字体精简工具/node_modules/vinyl/CHANGELOG.md b/packages/字体精简工具/node_modules/vinyl/CHANGELOG.md new file mode 100644 index 0000000..9bf67df --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/CHANGELOG.md @@ -0,0 +1,163 @@ +## Change Log + +### v1.1.1 (2016/01/18 23:23 +00:00) +- [3990e00](https://github.com/gulpjs/vinyl/commit/3990e007b004c809a53670c00566afb157fa56b6) 1.1.1 +- [2d3e984](https://github.com/gulpjs/vinyl/commit/2d3e98447a42285b593e1b261984b87b171e7313) chore: add NPM script for changelog (@T1st3) +- [f70c395](https://github.com/gulpjs/vinyl/commit/f70c395085fc3952cf72c061c851f5b0d4676030) docs: add CHANGELOG.md (@T1st3) +- [#74](https://github.com/gulpjs/vinyl/pull/74) Fix isVinyl for falsy values (@erikkemperman) +- [3e8b132](https://github.com/gulpjs/vinyl/commit/3e8b132cd87bf5ab536ff7a4c6d660e33f5990b4) Fix isVinyl for falsy values (@erikkemperman) +- [#73](https://github.com/gulpjs/vinyl/pull/73) Readme: use SVG images. (@d10) +- [193e3d2](https://github.com/gulpjs/vinyl/commit/193e3d25f68c97593e011981e49db2c3e7a47d91) Readme: use SVG images. (@d10) +- [#67](https://github.com/gulpjs/vinyl/pull/67) Set Travis to sudo:false and add node 0.12/4.x (@pdehaan) +- [c33d85a](https://github.com/gulpjs/vinyl/commit/c33d85ab1d63fbcd272f7fb91d666006dab76d99) Set Travis to sudo:false and add node 0.12/4.x (@pdehaan) + +### v1.1.0 (2015/10/23 06:33 +00:00) +- [51052ad](https://github.com/gulpjs/vinyl/commit/51052add24bb1c771bf5912809b47d4d53288c48) 1.1.0 +- [#64](https://github.com/gulpjs/vinyl/pull/64) File.stem for basename without suffix (@soslan) +- [e505375](https://github.com/gulpjs/vinyl/commit/e5053756a49ea8800cd5da12fc0eefce859ccf61) Following JSCS rules in File.stem (@soslan) +- [d45f478](https://github.com/gulpjs/vinyl/commit/d45f478c7af3f2e956e57ce6d7550d64e3b7dbfb) Following JSCS rules (@soslan) +- [#66](https://github.com/gulpjs/vinyl/pull/66) Replace JSHint with ESLint (@pdehaan) +- [c5549f7](https://github.com/gulpjs/vinyl/commit/c5549f7002ae580fa9a7f7df490d6e3911af2285) Bump to eslint-config-gulp@2 (@pdehaan) +- [f6a5512](https://github.com/gulpjs/vinyl/commit/f6a55125e7230621ecae1f395da202140baaee1d) Replace JSHint with ESLint (@pdehaan) +- [#65](https://github.com/gulpjs/vinyl/pull/65) Add JSCS to repo (@pdehaan) +- [f9a0101](https://github.com/gulpjs/vinyl/commit/f9a0101d013356056293d21356d4cb443613b0be) Comments should start with uppercase letters (per JSCS) (@pdehaan) +- [6506478](https://github.com/gulpjs/vinyl/commit/650647833e3cea8d005a3ab1810ecd285418fa1e) Add JSCS to repo (@pdehaan) +- [ae3778c](https://github.com/gulpjs/vinyl/commit/ae3778c536a898fe47bbb37e5932b300123b28b8) Documentation for File.stem (@soslan) +- [e2246af](https://github.com/gulpjs/vinyl/commit/e2246af8aad6df348557f9d1df5001c30ff83774) add stem property to File (@soslan) +- [#63](https://github.com/gulpjs/vinyl/pull/63) Fix broken badge URLs in README.md (@tatsuyafw) +- [032ae7c](https://github.com/gulpjs/vinyl/commit/032ae7c5c59b72dc58041a14449d8d66af053023) Use reference links (@tatsuyafw) +- [652bc3b](https://github.com/gulpjs/vinyl/commit/652bc3bd3cc7a6af5d21d8d759a01cee3ce46acf) Fix some broken links in README.md (@tatsuyafw) + +### v1.0.0 (2015/09/25 22:40 +00:00) +- [dbe943d](https://github.com/gulpjs/vinyl/commit/dbe943dad575b04995f38a35bd27962f54dc8217) 1.0.0 (@contra) +- [0b64336](https://github.com/gulpjs/vinyl/commit/0b643367289db0cfefc6c628eff2be4ee019405c) correct url (@contra) +- [#60](https://github.com/gulpjs/vinyl/pull/60) remove
from README.md (@bobintornado) +- [d9ae5ea](https://github.com/gulpjs/vinyl/commit/d9ae5eab010fd15094c8a0260a25d1244f17df79) remove
from README.md (@bobintornado) + +### v0.5.3 (2015/09/03 00:20 +00:00) +- [6f19648](https://github.com/gulpjs/vinyl/commit/6f19648bd67040bfd0dc755ad031e1e5e0b58429) 0.5.3 (@contra) +- [0fe8da7](https://github.com/gulpjs/vinyl/commit/0fe8da757a862bb956d88dec03ab6f99ca895f7f) add isVinyl function (@contra) + +### v0.5.1 (2015/08/04 21:26 +00:00) +- [81692ec](https://github.com/gulpjs/vinyl/commit/81692ece22eb3b927dba74fedb54a2acb65a36eb) 0.5.1 (@contra) +- [#58](https://github.com/gulpjs/vinyl/pull/58) use Buffer.isBuffer instead of instanceof (@whyrusleeping) +- [7293a71](https://github.com/gulpjs/vinyl/commit/7293a71b9daf177d9b9f600f3acf00a73b95107c) condense isBuffer module to a one liner (@whyrusleeping) +- [e7208e2](https://github.com/gulpjs/vinyl/commit/e7208e2c27029405c7c9cf9c9a3263cdf1e0dfb8) also remove old comment (@whyrusleeping) +- [b4ac64b](https://github.com/gulpjs/vinyl/commit/b4ac64b85ce28093f576db4f006264438f546cb8) use Buffer.isBuffer instead of instanceof (@whyrusleeping) +- [#54](https://github.com/gulpjs/vinyl/pull/54) Fix file clone options (@danielhusar) +- [4b42095](https://github.com/gulpjs/vinyl/commit/4b42095d8e0cb4351a503da67752da15e6b59570) Fix file clone options (@danielhusar) +- [04f681e](https://github.com/gulpjs/vinyl/commit/04f681e4af8ffb99ea3a0a3eab1cc79793887560) closes #50 and #51 (@contra) + +### v0.5.0 (2015/06/03 23:44 +00:00) +- [8fea984](https://github.com/gulpjs/vinyl/commit/8fea9843e6b2aca820ccfee394927ca073f88a05) 0.5.0 (@contra) +- [#52](https://github.com/gulpjs/vinyl/pull/52) Add explicit newlines to readme (@jeremyruppel) +- [027142c](https://github.com/gulpjs/vinyl/commit/027142cf62a3f0a68f4659a612ee782b24c00198) Add explicit newlines to readme (@jeremyruppel) +- [#46](https://github.com/gulpjs/vinyl/pull/46) Add dirname, basename and extname getters (@jeremyruppel) +- [e09817f](https://github.com/gulpjs/vinyl/commit/e09817f15e4ddfc28e1b3452bbca5e2ba1fc2f19) Add dirname, basename and extname accessors (@jeremyruppel) +- [#49](https://github.com/gulpjs/vinyl/pull/49) update license attribute (@pgilad) +- [e5b2670](https://github.com/gulpjs/vinyl/commit/e5b2670af205ca0fb6f589a396b89ab2845a91ac) update license attribut (@pgilad) +- [55f90e3](https://github.com/gulpjs/vinyl/commit/55f90e3763af84c7eb599bd6403dbe14f63d5513) dep updates (@contra) +- [#48](https://github.com/gulpjs/vinyl/pull/48) Update docs for `path` and `history` (@jmm) +- [231f32a](https://github.com/gulpjs/vinyl/commit/231f32a375aa9147d0a41ffd1ace773c45e66ee5) Document `path`. (@jmm) +- [93df183](https://github.com/gulpjs/vinyl/commit/93df18374b62de32c76862baf73e92f33b04882a) Document `options.history`. (@jmm) +- [2ed6a01](https://github.com/gulpjs/vinyl/commit/2ed6a012c03a78b46f9d41034969898a15fdfe15) Correct `options.path` default value docs. (@jmm) +- [edf1ecb](https://github.com/gulpjs/vinyl/commit/edf1ecb0698f355e137f9361a9a9a2581ca485e5) Document `history`. (@jmm) +- [#45](https://github.com/gulpjs/vinyl/pull/45) Update dependencies and devDependencies (@shinnn) +- [f1f9dfb](https://github.com/gulpjs/vinyl/commit/f1f9dfbb1346b608226e5847161bf48e0caa2c1e) update test script (@shinnn) +- [0737ef4](https://github.com/gulpjs/vinyl/commit/0737ef489f9cfffa2494b06edaab9a032f00eb7e) update dependencies and devDependencies (@shinnn) +- [#43](https://github.com/gulpjs/vinyl/pull/43) Document `file.clone()` arguments (@pascalduez) +- [3c5e95d](https://github.com/gulpjs/vinyl/commit/3c5e95d5f482ea9f28dd2d78b83166723cd121bb) Document `file.clone()` arguments (@pascalduez) + +### v0.4.6 (2014/12/03 06:15 +00:00) +- [8255a5f](https://github.com/gulpjs/vinyl/commit/8255a5f1de7fecb1cd5e7ba7ac1ec997395f6be1) 0.4.6 (@contra) +- [37dafeb](https://github.com/gulpjs/vinyl/commit/37dafeb8cb0b33424e77fe67a094517925be2bef) dep update (@contra) + +### v0.4.5 (2014/11/13 23:23 +00:00) +- [a7a8c68](https://github.com/gulpjs/vinyl/commit/a7a8c68a1df914b1f486a54a97b68e9186699d33) 0.4.5 (@contra) +- [ec094b4](https://github.com/gulpjs/vinyl/commit/ec094b43e36512894142baacef26dfffc5827114) reduce size by switching off lodash (@contra) + +### v0.4.4 (2014/11/13 22:59 +00:00) +- [61834c9](https://github.com/gulpjs/vinyl/commit/61834c9429f2e6883a18f377bc5893031ea1c94f) 0.4.4 (@contra) +- [fd887b3](https://github.com/gulpjs/vinyl/commit/fd887b3d21ed47c2b4cf40b0c0ed7b2df9048b09) ignore some files for size reasons (@contra) +- [#37](https://github.com/gulpjs/vinyl/pull/37) Don't package coverage into NPM (@Dapperbot) +- [9b811b8](https://github.com/gulpjs/vinyl/commit/9b811b86529e2b4b0cc20936a6697b3d9df503a2) Don't package coverage into NPM (@lotyrin) + +### v0.4.3 (2014/09/01 18:17 +00:00) +- [6eae432](https://github.com/gulpjs/vinyl/commit/6eae432519b007c313a8df83b093adfb97a2944c) 0.4.3 (@contra) +- [d220c85](https://github.com/gulpjs/vinyl/commit/d220c857259f0070ab38c7b50d90f184a919e472) fix funky history passing, closes #35 (@contra) + +### v0.4.2 (2014/08/29 15:58 +00:00) +- [f33d6d5](https://github.com/gulpjs/vinyl/commit/f33d6d5c1b9d1f83e238521651114beb90a01019) 0.4.2 (@contra) +- [cd0d042](https://github.com/gulpjs/vinyl/commit/cd0d04272297363f27f8456818dbf675618939c3) remove native clone (@contra) +- [e4d8b99](https://github.com/gulpjs/vinyl/commit/e4d8b99c21a50700afd17173e1f3a2076e6fe860) minor speed enhancements (@contra) +- [2353e39](https://github.com/gulpjs/vinyl/commit/2353e3996ac67629da92c2af906bdfdbc6978065) minor speed ups (@contra) + +### v0.4.1 (2014/08/29 14:34 +00:00) +- [0014b9b](https://github.com/gulpjs/vinyl/commit/0014b9bf4166fb5cbe94c439201752cda7991a70) 0.4.1 (@contra) +- [0142513](https://github.com/gulpjs/vinyl/commit/0142513b0727ad6a018b0944fea2bb4966d8bbfa) fix history cloning bug (@contra) + +### v0.4.0 (2014/08/29 07:07 +00:00) +- [80d3f61](https://github.com/gulpjs/vinyl/commit/80d3f61445b347fc1c34f462f0ab800644e90e04) 0.4.0 (@contra) +- [#33](https://github.com/gulpjs/vinyl/pull/33) Clone stream (@popomore) +- [d37b57b](https://github.com/gulpjs/vinyl/commit/d37b57bba0aa1fba18d9fecec3513ac4e61b27cd) coverage 100% :sparkles: (@popomore) +- [b5a62f0](https://github.com/gulpjs/vinyl/commit/b5a62f0ede71bdeae957e8653e6ccbdca998879c) fix testcase and delete duplicate testcase (@popomore) +- [fb1b15d](https://github.com/gulpjs/vinyl/commit/fb1b15da472647743eb4e829b99f64d6d9f751fa) Adding more test (@nfroidure) +- [acea889](https://github.com/gulpjs/vinyl/commit/acea8894e9d983d8037641b4ff6f08b666056979) Fixing the clone method (@nfroidure) +- [#32](https://github.com/gulpjs/vinyl/pull/32) improve clone (@popomore) +- [037e830](https://github.com/gulpjs/vinyl/commit/037e8300b75fdddf9c3e003fd205da7ec13b9157) object should multiline (@popomore) +- [7724121](https://github.com/gulpjs/vinyl/commit/7724121194a4ac94fb23a0048ff926d00a784ecc) pass jshint (@popomore) +- [f76a921](https://github.com/gulpjs/vinyl/commit/f76a9211b8b495d81074884d8ea6454a20bba349) use node-v8-clone for performance, fallback to lodash #29 (@popomore) +- [7638f07](https://github.com/gulpjs/vinyl/commit/7638f072bf33a427ec8324a0fb463f73cb9fc8f2) option to not clone buffer #16 (@popomore) +- [6bfd73c](https://github.com/gulpjs/vinyl/commit/6bfd73cc459907a06ce9affc373599ffb8130c08) copy all attributes deeply #29 (@popomore) +- [b34f813](https://github.com/gulpjs/vinyl/commit/b34f8135d47e0a2ba3be6f769729ba66931b3234) add testcase for clone history (@popomore) +- [a913edf](https://github.com/gulpjs/vinyl/commit/a913edf1dd91c5bdcfc9ff3149a94eae131006aa) fix mixed quote and unused variable (@popomore) + +### v0.3.3 (2014/08/28 13:50 +00:00) +- [c801d3d](https://github.com/gulpjs/vinyl/commit/c801d3dc354383cf2656338d63908ec2983e3612) 0.3.3 (@contra) +- [f13970e](https://github.com/gulpjs/vinyl/commit/f13970e3cc5d1d730f94316daeee5b5c0e6c00f3) fix jshint on tests (@contra) +- [6186101](https://github.com/gulpjs/vinyl/commit/61861017bc22a786a026730cf5c55d23c657abea) closes #31 (@contra) +- [#24](https://github.com/gulpjs/vinyl/pull/24) path get/set for recording path change (@popomore) +- [6eab1c4](https://github.com/gulpjs/vinyl/commit/6eab1c4f1376aec901d8869d3d410953f1c93e9f) done (@contra) + +### v0.3.2 (2014/07/30 23:22 +00:00) +- [44ef836](https://github.com/gulpjs/vinyl/commit/44ef8369e1a0a7ba01da4608d01166c5a5d8cbe1) 0.3.2 (@contra) +- [ae28ff2](https://github.com/gulpjs/vinyl/commit/ae28ff200c034e9a40babb38886cdc7ef97a0f25) oops, thats what i get for coding from a car (@contra) + +### v0.3.1 (2014/07/30 22:35 +00:00) +- [03b7578](https://github.com/gulpjs/vinyl/commit/03b75789e58b43bdaef9ca166e4062b8ccfdefb9) 0.3.1 (@contra) +- [64850ff](https://github.com/gulpjs/vinyl/commit/64850ffdf4d31b35ac1160d0d495644cadd52914) fix deep deps, closes #28 (@contra) + +### v0.3.0 (2014/07/19 04:57 +00:00) +- [dcb77f3](https://github.com/gulpjs/vinyl/commit/dcb77f3246d1011a430c20f883eb89c520206ca6) 0.3.0 (@contra) +- [#27](https://github.com/gulpjs/vinyl/pull/27) Clone custom properties (@vweevers) +- [95710de](https://github.com/gulpjs/vinyl/commit/95710de62f4c1234a244a6818b5e39d92ea7b9a8) fix relative path test for windows (@vweevers) +- [e493187](https://github.com/gulpjs/vinyl/commit/e493187b3f2fd1485077f09e73e669407ac077d3) clone custom properties (@laurelnaiad) +- [e50ceac](https://github.com/gulpjs/vinyl/commit/e50ceacfc3daa825e111976ba4192cb93c80bfe2) throw when set path is null (@popomore) +- [7c71bf3](https://github.com/gulpjs/vinyl/commit/7c71bf3d806a98730a0ce5edd56c0b8f1f42e8f0) remove initialize of this.path (@popomore) +- [d95023f](https://github.com/gulpjs/vinyl/commit/d95023f6604a990d38e4f5b332c7916ceb012366) delete this._path :tongue: (@popomore) +- [f3f9be0](https://github.com/gulpjs/vinyl/commit/f3f9be0f3d76b4125353cd936731f70015d44284) path get/set for recording path change #19 (@popomore) +- [#21](https://github.com/gulpjs/vinyl/pull/21) LICENSE: Remove executable mode (@felixrabe) +- [#22](https://github.com/gulpjs/vinyl/pull/22) Travis: Dump node 0.9 - travis-ci/travis-ci#2251 (@felixrabe) +- [70a2193](https://github.com/gulpjs/vinyl/commit/70a219346c00e0db6be1a0aa55c183e7d5b80ad1) Travis: Dump node 0.9 - travis-ci/travis-ci#2251 (@felixrabe) +- [460eed5](https://github.com/gulpjs/vinyl/commit/460eed58de9cb04d44e35b6bebbfbaea9146015f) LICENSE: Remove executable mode (@felixrabe) +- [#18](https://github.com/gulpjs/vinyl/pull/18) fix typo (@vvakame) +- [1783e7f](https://github.com/gulpjs/vinyl/commit/1783e7f031ecfb118ee9b43971a72be264caa144) fix typo (@vvakame) +- [#11](https://github.com/gulpjs/vinyl/pull/11) Correct README about pipe's end option. (@shuhei) +- [1824ec9](https://github.com/gulpjs/vinyl/commit/1824ec9cefd276557b7338dfdbd54922599f020a) Correct README about pipe's end option. (@shuhei) +- [f49b9c3](https://github.com/gulpjs/vinyl/commit/f49b9c325229754229726ed530c579e4ac23252b) remove dead line (@contra) +- [1ca8e46](https://github.com/gulpjs/vinyl/commit/1ca8e463259c2a395d5d41b528b04a89a953f6b7) dep update, new coveralls stuff (@contra) +- [f00767b](https://github.com/gulpjs/vinyl/commit/f00767bf8b61ca8a7b25f3ebd3dde297fa2dafd7) bump (@contra) +- [#8](https://github.com/gulpjs/vinyl/pull/8) Correct File.clone() treatment of File.stats (@hughsk) +- [bc3acf7](https://github.com/gulpjs/vinyl/commit/bc3acf7b1ed712d70e7d8cb4f6e5248124743ec7) Add test for new File.clone() functionality (@hughsk) +- [dd668fb](https://github.com/gulpjs/vinyl/commit/dd668fb5aaed02cfb0f63a58f027c937dd7e0467) Use clone-stats module to clone fs.Stats instances. (@hughsk) +- [b6244c5](https://github.com/gulpjs/vinyl/commit/b6244c52d3bf9bd87bd6b926f0486f407627f7e0) Correct File.clone() treatment of File.stats (@hughsk) +- [796ba8b](https://github.com/gulpjs/vinyl/commit/796ba8b5ddd658fed3393c7d0a0d7bea7befa1b1) 0.2.1 - fixes #2 (@contra) +- [bffa6a4](https://github.com/gulpjs/vinyl/commit/bffa6a4e323e18e084b5b1444b4537aa3fb3e109) vinyl-fs movement? (@contra) +- [cfaa0a0](https://github.com/gulpjs/vinyl/commit/cfaa0a02b7794e493f600d1d36b288294a278e6c) fix isDirectory tests (@contra) +- [05d1f1b](https://github.com/gulpjs/vinyl/commit/05d1f1b741960cce8e8d2702d326ebb0187935ad) add isDirectory (@contra) +- [76580e5](https://github.com/gulpjs/vinyl/commit/76580e573870885580ac00dd9175e562d008cb81) bump to 0.1.0 (@contra) +- [f7a15c4](https://github.com/gulpjs/vinyl/commit/f7a15c41ac5e82de930e161f6b109ae3336d337b) readme 0.9+ (@contra) +- [fc7f192](https://github.com/gulpjs/vinyl/commit/fc7f1925b2a18466f19db062ad28df02f1db823b) drop 0.8 support (@contra) +- [c004b6c](https://github.com/gulpjs/vinyl/commit/c004b6c857d03a292e8ecd5020ad0420d82dbf1e) target 0.8+ (@contra) +- [edf20bd](https://github.com/gulpjs/vinyl/commit/edf20bd8563fca6e8a568b9d08fb728f6705573c) add small example (@contra) +- [d8c63fe](https://github.com/gulpjs/vinyl/commit/d8c63fe0fd16cf13db2d9a6452c979ec12779428) 0.0.1 (@contra) \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/vinyl/LICENSE b/packages/字体精简工具/node_modules/vinyl/LICENSE new file mode 100644 index 0000000..4f482f9 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2013 Fractal + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/字体精简工具/node_modules/vinyl/README.md b/packages/字体精简工具/node_modules/vinyl/README.md new file mode 100644 index 0000000..d4d2c61 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/README.md @@ -0,0 +1,265 @@ +# vinyl [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status][depstat-image]][depstat-url] + +## Information +
Packagevinyl
DescriptionA virtual file format
Node Version>= 0.9
+ +## What is this? +Read this for more info about how this plays into the grand scheme of things [https://medium.com/@eschoff/3828e8126466](https://medium.com/@eschoff/3828e8126466) + +## File + +```javascript +var File = require('vinyl'); + +var coffeeFile = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee", + contents: new Buffer("test = 123") +}); +``` + +### isVinyl +When checking if an object is a vinyl file, you should not use instanceof. Use the isVinyl function instead. + +```js +var File = require('vinyl'); + +var dummy = new File({stuff}); +var notAFile = {}; + +File.isVinyl(dummy); // true +File.isVinyl(notAFile); // false +``` + +### isCustomProp +Vinyl checks if a property is not managed internally, such as `sourceMap`. This is than used in `constructor(options)` when setting, and `clone()` when copying properties. + +```js +var File = require('vinyl'); + +File.isCustomProp('sourceMap'); // true +File.isCustomProp('path'); // false -> internal getter/setter +``` + +Read more in [Extending Vinyl](#extending-vinyl). + +### constructor(options) +#### options.cwd +Type: `String`

Default: `process.cwd()` + +#### options.base +Used for relative pathing. Typically where a glob starts. + +Type: `String`

Default: `options.cwd` + +#### options.path +Full path to the file. + +Type: `String`

Default: `undefined` + +#### options.history +Path history. Has no effect if `options.path` is passed. + +Type: `Array`

Default: `options.path ? [options.path] : []` + +#### options.stat +The result of an fs.stat call. See [fs.Stats](http://nodejs.org/api/fs.html#fs_class_fs_stats) for more information. + +Type: `fs.Stats`

Default: `null` + +#### options.contents +File contents. + +Type: `Buffer, Stream, or null`

Default: `null` + +#### options.{custom} +Any other option properties will just be assigned to the new File object. + +```js +var File = require('vinyl'); + +var file = new File({foo: 'bar'}); +file.foo === 'bar'; // true +``` + +### isBuffer() +Returns true if file.contents is a Buffer. + +### isStream() +Returns true if file.contents is a Stream. + +### isNull() +Returns true if file.contents is null. + +### clone([opt]) +Returns a new File object with all attributes cloned.
By default custom attributes are deep-cloned. + +If opt or opt.deep is false, custom attributes will not be deep-cloned. + +If opt.contents is false, it will copy file.contents Buffer's reference. + +### pipe(stream[, opt]) +If file.contents is a Buffer, it will write it to the stream. + +If file.contents is a Stream, it will pipe it to the stream. + +If file.contents is null, it will do nothing. + +If opt.end is false, the destination stream will not be ended (same as node core). + +Returns the stream. + +### inspect() +Returns a pretty String interpretation of the File. Useful for console.log. + +### contents +The [Stream](https://nodejs.org/api/stream.html#stream_stream) or [Buffer](https://nodejs.org/api/buffer.html#buffer_class_buffer) of the file as it was passed in via options, or as the result of modification. + +For example: + +```js +if (file.isBuffer()) { + console.log(file.contents.toString()); // logs out the string of contents +} +``` + +### path +Absolute pathname string or `undefined`. Setting to a different value pushes the old value to `history`. + +### history +Array of `path` values the file object has had, from `history[0]` (original) through `history[history.length - 1]` (current). `history` and its elements should normally be treated as read-only and only altered indirectly by setting `path`. + +### relative +Returns path.relative for the file base and file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.relative); // file.coffee +``` + +### dirname +Gets and sets path.dirname for the file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.dirname); // /test + +file.dirname = '/specs'; + +console.log(file.dirname); // /specs +console.log(file.path); // /specs/file.coffee +``` + +### basename +Gets and sets path.basename for the file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.basename); // file.coffee + +file.basename = 'file.js'; + +console.log(file.basename); // file.js +console.log(file.path); // /test/file.js +``` + +### stem +Gets and sets stem (filename without suffix) for the file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.stem); // file + +file.stem = 'foo'; + +console.log(file.stem); // foo +console.log(file.path); // /test/foo.coffee +``` + +### extname +Gets and sets path.extname for the file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.extname); // .coffee + +file.extname = '.js'; + +console.log(file.extname); // .js +console.log(file.path); // /test/file.js +``` + +## Extending Vinyl +When extending Vinyl into your own class with extra features, you need to think about a few things. + +When you have your own properties that are managed internally, you need to extend the static `isCustomProp` method to return `false` when one of these properties is queried. + +```js +const File = require('vinyl'); + +const builtInProps = ['foo', '_foo']; + +class SuperFile extends File { + constructor(options) { + super(options); + this._foo = 'example internal read-only value'; + } + + get foo() { + return this._foo; + } + + static isCustomProp(name) { + return super.isCustomProp(name) && builtInProps.indexOf(name) === -1; + } +} +``` + +This makes properties `foo` and `_foo` ignored when cloning, and when passed in options to `constructor(options)` so they don't get assigned to the new object. + +Same goes for `clone()`. If you have your own internal stuff that needs special handling during cloning, you should extend it to do so. + +[npm-url]: https://npmjs.org/package/vinyl +[npm-image]: https://badge.fury.io/js/vinyl.svg +[travis-url]: https://travis-ci.org/gulpjs/vinyl +[travis-image]: https://travis-ci.org/gulpjs/vinyl.svg?branch=master +[coveralls-url]: https://coveralls.io/github/gulpjs/vinyl +[coveralls-image]: https://coveralls.io/repos/github/gulpjs/vinyl/badge.svg +[depstat-url]: https://david-dm.org/gulpjs/vinyl +[depstat-image]: https://david-dm.org/gulpjs/vinyl.svg diff --git a/packages/字体精简工具/node_modules/vinyl/index.js b/packages/字体精简工具/node_modules/vinyl/index.js new file mode 100644 index 0000000..5a1fe55 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/index.js @@ -0,0 +1,270 @@ +var path = require('path'); +var clone = require('clone'); +var cloneStats = require('clone-stats'); +var cloneBuffer = require('./lib/cloneBuffer'); +var isBuffer = require('./lib/isBuffer'); +var isStream = require('./lib/isStream'); +var isNull = require('./lib/isNull'); +var inspectStream = require('./lib/inspectStream'); +var Stream = require('stream'); +var replaceExt = require('replace-ext'); + +var builtInFields = [ + '_contents', 'contents', 'stat', 'history', 'path', 'base', 'cwd', +]; + +function File(file) { + var self = this; + + if (!file) { + file = {}; + } + + // Record path change + var history = file.path ? [file.path] : file.history; + this.history = history || []; + + this.cwd = file.cwd || process.cwd(); + this.base = file.base || this.cwd; + + // Stat = files stats object + this.stat = file.stat || null; + + // Contents = stream, buffer, or null if not read + this.contents = file.contents || null; + + this._isVinyl = true; + + // Set custom properties + Object.keys(file).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + self[key] = file[key]; + } + }); +} + +File.prototype.isBuffer = function() { + return isBuffer(this.contents); +}; + +File.prototype.isStream = function() { + return isStream(this.contents); +}; + +File.prototype.isNull = function() { + return isNull(this.contents); +}; + +// TODO: Should this be moved to vinyl-fs? +File.prototype.isDirectory = function() { + return this.isNull() && this.stat && this.stat.isDirectory(); +}; + +File.prototype.clone = function(opt) { + var self = this; + + if (typeof opt === 'boolean') { + opt = { + deep: opt, + contents: true, + }; + } else if (!opt) { + opt = { + deep: true, + contents: true, + }; + } else { + opt.deep = opt.deep === true; + opt.contents = opt.contents !== false; + } + + // Clone our file contents + var contents; + if (this.isStream()) { + contents = this.contents.pipe(new Stream.PassThrough()); + this.contents = this.contents.pipe(new Stream.PassThrough()); + } else if (this.isBuffer()) { + contents = opt.contents ? cloneBuffer(this.contents) : this.contents; + } + + var file = new this.constructor({ + cwd: this.cwd, + base: this.base, + stat: (this.stat ? cloneStats(this.stat) : null), + history: this.history.slice(), + contents: contents, + }); + + // Clone our custom properties + Object.keys(this).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + file[key] = opt.deep ? clone(self[key], true) : self[key]; + } + }); + return file; +}; + +File.prototype.pipe = function(stream, opt) { + if (!opt) { + opt = {}; + } + if (typeof opt.end === 'undefined') { + opt.end = true; + } + + if (this.isStream()) { + return this.contents.pipe(stream, opt); + } + if (this.isBuffer()) { + if (opt.end) { + stream.end(this.contents); + } else { + stream.write(this.contents); + } + return stream; + } + + // Check if isNull + if (opt.end) { + stream.end(); + } + return stream; +}; + +File.prototype.inspect = function() { + var inspect = []; + + // Use relative path if possible + var filePath = (this.base && this.path) ? this.relative : this.path; + + if (filePath) { + inspect.push('"' + filePath + '"'); + } + + if (this.isBuffer()) { + inspect.push(this.contents.inspect()); + } + + if (this.isStream()) { + inspect.push(inspectStream(this.contents)); + } + + return ''; +}; + +File.isCustomProp = function(key) { + return builtInFields.indexOf(key) === -1; +}; + +File.isVinyl = function(file) { + return (file && file._isVinyl === true) || false; +}; + +// Virtual attributes +// Or stuff with extra logic +Object.defineProperty(File.prototype, 'contents', { + get: function() { + return this._contents; + }, + set: function(val) { + if (!isBuffer(val) && !isStream(val) && !isNull(val)) { + throw new Error('File.contents can only be a Buffer, a Stream, or null.'); + } + this._contents = val; + }, +}); + +// TODO: Should this be moved to vinyl-fs? +Object.defineProperty(File.prototype, 'relative', { + get: function() { + if (!this.base) { + throw new Error('No base specified! Can not get relative.'); + } + if (!this.path) { + throw new Error('No path specified! Can not get relative.'); + } + return path.relative(this.base, this.path); + }, + set: function() { + throw new Error('File.relative is generated from the base and path attributes. Do not modify it.'); + }, +}); + +Object.defineProperty(File.prototype, 'dirname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get dirname.'); + } + return path.dirname(this.path); + }, + set: function(dirname) { + if (!this.path) { + throw new Error('No path specified! Can not set dirname.'); + } + this.path = path.join(dirname, path.basename(this.path)); + }, +}); + +Object.defineProperty(File.prototype, 'basename', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get basename.'); + } + return path.basename(this.path); + }, + set: function(basename) { + if (!this.path) { + throw new Error('No path specified! Can not set basename.'); + } + this.path = path.join(path.dirname(this.path), basename); + }, +}); + +// Property for getting/setting stem of the filename. +Object.defineProperty(File.prototype, 'stem', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get stem.'); + } + return path.basename(this.path, this.extname); + }, + set: function(stem) { + if (!this.path) { + throw new Error('No path specified! Can not set stem.'); + } + this.path = path.join(path.dirname(this.path), stem + this.extname); + }, +}); + +Object.defineProperty(File.prototype, 'extname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get extname.'); + } + return path.extname(this.path); + }, + set: function(extname) { + if (!this.path) { + throw new Error('No path specified! Can not set extname.'); + } + this.path = replaceExt(this.path, extname); + }, +}); + +Object.defineProperty(File.prototype, 'path', { + get: function() { + return this.history[this.history.length - 1]; + }, + set: function(path) { + if (typeof path !== 'string') { + throw new Error('path should be string'); + } + + // Record history only when path changed + if (path && path !== this.path) { + this.history.push(path); + } + }, +}); + +module.exports = File; diff --git a/packages/字体精简工具/node_modules/vinyl/lib/cloneBuffer.js b/packages/字体精简工具/node_modules/vinyl/lib/cloneBuffer.js new file mode 100644 index 0000000..89f09ed --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/lib/cloneBuffer.js @@ -0,0 +1,7 @@ +var Buffer = require('buffer').Buffer; + +module.exports = function(buf) { + var out = new Buffer(buf.length); + buf.copy(out); + return out; +}; diff --git a/packages/字体精简工具/node_modules/vinyl/lib/inspectStream.js b/packages/字体精简工具/node_modules/vinyl/lib/inspectStream.js new file mode 100644 index 0000000..942f23d --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/lib/inspectStream.js @@ -0,0 +1,15 @@ +var isStream = require('./isStream'); + +module.exports = function(stream) { + if (!isStream(stream)) { + return; + } + + var streamType = stream.constructor.name; + // Avoid StreamStream + if (streamType === 'Stream') { + streamType = ''; + } + + return '<' + streamType + 'Stream>'; +}; diff --git a/packages/字体精简工具/node_modules/vinyl/lib/isBuffer.js b/packages/字体精简工具/node_modules/vinyl/lib/isBuffer.js new file mode 100644 index 0000000..8a767d1 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/lib/isBuffer.js @@ -0,0 +1 @@ +module.exports = require('buffer').Buffer.isBuffer; diff --git a/packages/字体精简工具/node_modules/vinyl/lib/isNull.js b/packages/字体精简工具/node_modules/vinyl/lib/isNull.js new file mode 100644 index 0000000..7f22c63 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/lib/isNull.js @@ -0,0 +1,3 @@ +module.exports = function(v) { + return v === null; +}; diff --git a/packages/字体精简工具/node_modules/vinyl/lib/isStream.js b/packages/字体精简工具/node_modules/vinyl/lib/isStream.js new file mode 100644 index 0000000..6b54e12 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/lib/isStream.js @@ -0,0 +1,5 @@ +var Stream = require('stream').Stream; + +module.exports = function(o) { + return !!o && o instanceof Stream; +}; diff --git a/packages/字体精简工具/node_modules/vinyl/package.json b/packages/字体精简工具/node_modules/vinyl/package.json new file mode 100644 index 0000000..19f0517 --- /dev/null +++ b/packages/字体精简工具/node_modules/vinyl/package.json @@ -0,0 +1,79 @@ +{ + "_from": "vinyl@^1.0.0", + "_id": "vinyl@1.2.0", + "_inBundle": false, + "_integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "_location": "/vinyl", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "vinyl@^1.0.0", + "name": "vinyl", + "escapedName": "vinyl", + "rawSpec": "^1.0.0", + "saveSpec": null, + "fetchSpec": "^1.0.0" + }, + "_requiredBy": [ + "/buffer-to-vinyl" + ], + "_resolved": "https://registry.npm.taobao.org/vinyl/download/vinyl-1.2.0.tgz", + "_shasum": "5c88036cf565e5df05558bfc911f8656df218884", + "_spec": "vinyl@^1.0.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\buffer-to-vinyl", + "author": { + "name": "Fractal", + "email": "contact@wearefractal.com", + "url": "http://wearefractal.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/vinyl/issues" + }, + "bundleDependencies": false, + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "deprecated": false, + "description": "A virtual file format", + "devDependencies": { + "buffer-equal": "0.0.1", + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "event-stream": "^3.1.0", + "github-changes": "^1.0.1", + "istanbul": "^0.3.0", + "istanbul-coveralls": "^1.0.1", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "lodash.templatesettings": "^3.1.0", + "mocha": "^2.0.0", + "rimraf": "^2.2.5", + "should": "^7.0.0" + }, + "engines": { + "node": ">= 0.9" + }, + "files": [ + "index.js", + "lib" + ], + "homepage": "http://github.com/gulpjs/vinyl", + "license": "MIT", + "main": "./index.js", + "name": "vinyl", + "repository": { + "type": "git", + "url": "git://github.com/gulpjs/vinyl.git" + }, + "scripts": { + "changelog": "github-changes -o gulpjs -r vinyl -b master -f ./CHANGELOG.md --order-semver --use-commit-body", + "coveralls": "istanbul cover _mocha && istanbul-coveralls", + "lint": "eslint . && jscs *.js lib/ test/", + "pretest": "npm run lint", + "test": "mocha" + }, + "version": "1.2.0" +} diff --git a/packages/字体精简工具/node_modules/which/CHANGELOG.md b/packages/字体精简工具/node_modules/which/CHANGELOG.md new file mode 100644 index 0000000..3d83d26 --- /dev/null +++ b/packages/字体精简工具/node_modules/which/CHANGELOG.md @@ -0,0 +1,152 @@ +# Changes + + +## 1.3.1 + +* update deps +* update travis + +## v1.3.0 + +* Add nothrow option to which.sync +* update tap + +## v1.2.14 + +* appveyor: drop node 5 and 0.x +* travis-ci: add node 6, drop 0.x + +## v1.2.13 + +* test: Pass missing option to pass on windows +* update tap +* update isexe to 2.0.0 +* neveragain.tech pledge request + +## v1.2.12 + +* Removed unused require + +## v1.2.11 + +* Prevent changelog script from being included in package + +## v1.2.10 + +* Use env.PATH only, not env.Path + +## v1.2.9 + +* fix for paths starting with ../ +* Remove unused `is-absolute` module + +## v1.2.8 + +* bullet items in changelog that contain (but don't start with) # + +## v1.2.7 + +* strip 'update changelog' changelog entries out of changelog + +## v1.2.6 + +* make the changelog bulleted + +## v1.2.5 + +* make a changelog, and keep it up to date +* don't include tests in package +* Properly handle relative-path executables +* appveyor +* Attach error code to Not Found error +* Make tests pass on Windows + +## v1.2.4 + +* Fix typo + +## v1.2.3 + +* update isexe, fix regression in pathExt handling + +## v1.2.2 + +* update deps, use isexe module, test windows + +## v1.2.1 + +* Sometimes windows PATH entries are quoted +* Fixed a bug in the check for group and user mode bits. This bug was introduced during refactoring for supporting strict mode. +* doc cli + +## v1.2.0 + +* Add support for opt.all and -as cli flags +* test the bin +* update travis +* Allow checking for multiple programs in bin/which +* tap 2 + +## v1.1.2 + +* travis +* Refactored and fixed undefined error on Windows +* Support strict mode + +## v1.1.1 + +* test +g exes against secondary groups, if available +* Use windows exe semantics on cygwin & msys +* cwd should be first in path on win32, not last +* Handle lower-case 'env.Path' on Windows +* Update docs +* use single-quotes + +## v1.1.0 + +* Add tests, depend on is-absolute + +## v1.0.9 + +* which.js: root is allowed to execute files owned by anyone + +## v1.0.8 + +* don't use graceful-fs + +## v1.0.7 + +* add license to package.json + +## v1.0.6 + +* isc license + +## 1.0.5 + +* Awful typo + +## 1.0.4 + +* Test for path absoluteness properly +* win: Allow '' as a pathext if cmd has a . in it + +## 1.0.3 + +* Remove references to execPath +* Make `which.sync()` work on Windows by honoring the PATHEXT variable. +* Make `isExe()` always return true on Windows. +* MIT + +## 1.0.2 + +* Only files can be exes + +## 1.0.1 + +* Respect the PATHEXT env for win32 support +* should 0755 the bin +* binary +* guts +* package +* 1st diff --git a/packages/字体精简工具/node_modules/which/LICENSE b/packages/字体精简工具/node_modules/which/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/packages/字体精简工具/node_modules/which/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/字体精简工具/node_modules/which/README.md b/packages/字体精简工具/node_modules/which/README.md new file mode 100644 index 0000000..8c0b0cb --- /dev/null +++ b/packages/字体精简工具/node_modules/which/README.md @@ -0,0 +1,51 @@ +# which + +Like the unix `which` utility. + +Finds the first instance of a specified executable in the PATH +environment variable. Does not cache the results, so `hash -r` is not +needed when the PATH changes. + +## USAGE + +```javascript +var which = require('which') + +// async usage +which('node', function (er, resolvedPath) { + // er is returned if no "node" is found on the PATH + // if it is found, then the absolute path to the exec is returned +}) + +// sync usage +// throws if not found +var resolved = which.sync('node') + +// if nothrow option is used, returns null if not found +resolved = which.sync('node', {nothrow: true}) + +// Pass options to override the PATH and PATHEXT environment vars. +which('node', { path: someOtherPath }, function (er, resolved) { + if (er) + throw er + console.log('found at %j', resolved) +}) +``` + +## CLI USAGE + +Same as the BSD `which(1)` binary. + +``` +usage: which [-as] program ... +``` + +## OPTIONS + +You may pass an options object as the second argument. + +- `path`: Use instead of the `PATH` environment variable. +- `pathExt`: Use instead of the `PATHEXT` environment variable. +- `all`: Return all matches, instead of just the first one. Note that + this means the function returns an array of strings instead of a + single string. diff --git a/packages/字体精简工具/node_modules/which/bin/which b/packages/字体精简工具/node_modules/which/bin/which new file mode 100644 index 0000000..7cee372 --- /dev/null +++ b/packages/字体精简工具/node_modules/which/bin/which @@ -0,0 +1,52 @@ +#!/usr/bin/env node +var which = require("../") +if (process.argv.length < 3) + usage() + +function usage () { + console.error('usage: which [-as] program ...') + process.exit(1) +} + +var all = false +var silent = false +var dashdash = false +var args = process.argv.slice(2).filter(function (arg) { + if (dashdash || !/^-/.test(arg)) + return true + + if (arg === '--') { + dashdash = true + return false + } + + var flags = arg.substr(1).split('') + for (var f = 0; f < flags.length; f++) { + var flag = flags[f] + switch (flag) { + case 's': + silent = true + break + case 'a': + all = true + break + default: + console.error('which: illegal option -- ' + flag) + usage() + } + } + return false +}) + +process.exit(args.reduce(function (pv, current) { + try { + var f = which.sync(current, { all: all }) + if (all) + f = f.join('\n') + if (!silent) + console.log(f) + return pv; + } catch (e) { + return 1; + } +}, 0)) diff --git a/packages/字体精简工具/node_modules/which/package.json b/packages/字体精简工具/node_modules/which/package.json new file mode 100644 index 0000000..f5f8521 --- /dev/null +++ b/packages/字体精简工具/node_modules/which/package.json @@ -0,0 +1,66 @@ +{ + "_from": "which@1", + "_id": "which@1.3.1", + "_inBundle": false, + "_integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "_location": "/which", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "which@1", + "name": "which", + "escapedName": "which", + "rawSpec": "1", + "saveSpec": null, + "fetchSpec": "1" + }, + "_requiredBy": [ + "/global-prefix", + "/node-gyp" + ], + "_resolved": "https://registry.nlark.com/which/download/which-1.3.1.tgz", + "_shasum": "a45043d54f5805316da8d62f9f50918d3da70b0a", + "_spec": "which@1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\node-gyp", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "bin": { + "which": "./bin/which" + }, + "bugs": { + "url": "https://github.com/isaacs/node-which/issues" + }, + "bundleDependencies": false, + "dependencies": { + "isexe": "^2.0.0" + }, + "deprecated": false, + "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.", + "devDependencies": { + "mkdirp": "^0.5.0", + "rimraf": "^2.6.2", + "tap": "^12.0.1" + }, + "files": [ + "which.js", + "bin/which" + ], + "homepage": "https://github.com/isaacs/node-which#readme", + "license": "ISC", + "main": "which.js", + "name": "which", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-which.git" + }, + "scripts": { + "changelog": "bash gen-changelog.sh", + "postversion": "npm run changelog && git add CHANGELOG.md && git commit -m 'update changelog - '${npm_package_version}", + "test": "tap test/*.js --cov" + }, + "version": "1.3.1" +} diff --git a/packages/字体精简工具/node_modules/which/which.js b/packages/字体精简工具/node_modules/which/which.js new file mode 100644 index 0000000..4347f91 --- /dev/null +++ b/packages/字体精简工具/node_modules/which/which.js @@ -0,0 +1,135 @@ +module.exports = which +which.sync = whichSync + +var isWindows = process.platform === 'win32' || + process.env.OSTYPE === 'cygwin' || + process.env.OSTYPE === 'msys' + +var path = require('path') +var COLON = isWindows ? ';' : ':' +var isexe = require('isexe') + +function getNotFoundError (cmd) { + var er = new Error('not found: ' + cmd) + er.code = 'ENOENT' + + return er +} + +function getPathInfo (cmd, opt) { + var colon = opt.colon || COLON + var pathEnv = opt.path || process.env.PATH || '' + var pathExt = [''] + + pathEnv = pathEnv.split(colon) + + var pathExtExe = '' + if (isWindows) { + pathEnv.unshift(process.cwd()) + pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM') + pathExt = pathExtExe.split(colon) + + + // Always test the cmd itself first. isexe will check to make sure + // it's found in the pathExt set. + if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') + pathExt.unshift('') + } + + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + if (cmd.match(/\//) || isWindows && cmd.match(/\\/)) + pathEnv = [''] + + return { + env: pathEnv, + ext: pathExt, + extExe: pathExtExe + } +} + +function which (cmd, opt, cb) { + if (typeof opt === 'function') { + cb = opt + opt = {} + } + + var info = getPathInfo(cmd, opt) + var pathEnv = info.env + var pathExt = info.ext + var pathExtExe = info.extExe + var found = [] + + ;(function F (i, l) { + if (i === l) { + if (opt.all && found.length) + return cb(null, found) + else + return cb(getNotFoundError(cmd)) + } + + var pathPart = pathEnv[i] + if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"') + pathPart = pathPart.slice(1, -1) + + var p = path.join(pathPart, cmd) + if (!pathPart && (/^\.[\\\/]/).test(cmd)) { + p = cmd.slice(0, 2) + p + } + ;(function E (ii, ll) { + if (ii === ll) return F(i + 1, l) + var ext = pathExt[ii] + isexe(p + ext, { pathExt: pathExtExe }, function (er, is) { + if (!er && is) { + if (opt.all) + found.push(p + ext) + else + return cb(null, p + ext) + } + return E(ii + 1, ll) + }) + })(0, pathExt.length) + })(0, pathEnv.length) +} + +function whichSync (cmd, opt) { + opt = opt || {} + + var info = getPathInfo(cmd, opt) + var pathEnv = info.env + var pathExt = info.ext + var pathExtExe = info.extExe + var found = [] + + for (var i = 0, l = pathEnv.length; i < l; i ++) { + var pathPart = pathEnv[i] + if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"') + pathPart = pathPart.slice(1, -1) + + var p = path.join(pathPart, cmd) + if (!pathPart && /^\.[\\\/]/.test(cmd)) { + p = cmd.slice(0, 2) + p + } + for (var j = 0, ll = pathExt.length; j < ll; j ++) { + var cur = p + pathExt[j] + var is + try { + is = isexe.sync(cur, { pathExt: pathExtExe }) + if (is) { + if (opt.all) + found.push(cur) + else + return cur + } + } catch (ex) {} + } + } + + if (opt.all && found.length) + return found + + if (opt.nothrow) + return null + + throw getNotFoundError(cmd) +} diff --git a/packages/字体精简工具/node_modules/wide-align/LICENSE b/packages/字体精简工具/node_modules/wide-align/LICENSE new file mode 100644 index 0000000..f4be44d --- /dev/null +++ b/packages/字体精简工具/node_modules/wide-align/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2015, Rebecca Turner + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/packages/字体精简工具/node_modules/wide-align/README.md b/packages/字体精简工具/node_modules/wide-align/README.md new file mode 100644 index 0000000..32f1be0 --- /dev/null +++ b/packages/字体精简工具/node_modules/wide-align/README.md @@ -0,0 +1,47 @@ +wide-align +---------- + +A wide-character aware text alignment function for use in terminals / on the +console. + +### Usage + +``` +var align = require('wide-align') + +// Note that if you view this on a unicode console, all of the slashes are +// aligned. This is because on a console, all narrow characters are +// an en wide and all wide characters are an em. In browsers, this isn't +// held to and wide characters like "古" can be less than two narrow +// characters even with a fixed width font. + +console.log(align.center('abc', 10)) // ' abc ' +console.log(align.center('古古古', 10)) // ' 古古古 ' +console.log(align.left('abc', 10)) // 'abc ' +console.log(align.left('古古古', 10)) // '古古古 ' +console.log(align.right('abc', 10)) // ' abc' +console.log(align.right('古古古', 10)) // ' 古古古' +``` + +### Functions + +#### `align.center(str, length)` → `str` + +Returns *str* with spaces added to both sides such that that it is *length* +chars long and centered in the spaces. + +#### `align.left(str, length)` → `str` + +Returns *str* with spaces to the right such that it is *length* chars long. + +### `align.right(str, length)` → `str` + +Returns *str* with spaces to the left such that it is *length* chars long. + +### Origins + +These functions were originally taken from +[cliui](https://npmjs.com/package/cliui). Changes include switching to the +MUCH faster pad generation function from +[lodash](https://npmjs.com/package/lodash), making center alignment pad +both sides and adding left alignment. diff --git a/packages/字体精简工具/node_modules/wide-align/align.js b/packages/字体精简工具/node_modules/wide-align/align.js new file mode 100644 index 0000000..4f94ca4 --- /dev/null +++ b/packages/字体精简工具/node_modules/wide-align/align.js @@ -0,0 +1,65 @@ +'use strict' +var stringWidth = require('string-width') + +exports.center = alignCenter +exports.left = alignLeft +exports.right = alignRight + +// lodash's way of generating pad characters. + +function createPadding (width) { + var result = '' + var string = ' ' + var n = width + do { + if (n % 2) { + result += string; + } + n = Math.floor(n / 2); + string += string; + } while (n); + + return result; +} + +function alignLeft (str, width) { + var trimmed = str.trimRight() + if (trimmed.length === 0 && str.length >= width) return str + var padding = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + padding = createPadding(width - strWidth) + } + + return trimmed + padding +} + +function alignRight (str, width) { + var trimmed = str.trimLeft() + if (trimmed.length === 0 && str.length >= width) return str + var padding = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + padding = createPadding(width - strWidth) + } + + return padding + trimmed +} + +function alignCenter (str, width) { + var trimmed = str.trim() + if (trimmed.length === 0 && str.length >= width) return str + var padLeft = '' + var padRight = '' + var strWidth = stringWidth(trimmed) + + if (strWidth < width) { + var padLeftBy = parseInt((width - strWidth) / 2, 10) + padLeft = createPadding(padLeftBy) + padRight = createPadding(width - (strWidth + padLeftBy)) + } + + return padLeft + trimmed + padRight +} diff --git a/packages/字体精简工具/node_modules/wide-align/package.json b/packages/字体精简工具/node_modules/wide-align/package.json new file mode 100644 index 0000000..4032f5f --- /dev/null +++ b/packages/字体精简工具/node_modules/wide-align/package.json @@ -0,0 +1,66 @@ +{ + "_from": "wide-align@^1.1.0", + "_id": "wide-align@1.1.3", + "_inBundle": false, + "_integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", + "_location": "/wide-align", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "wide-align@^1.1.0", + "name": "wide-align", + "escapedName": "wide-align", + "rawSpec": "^1.1.0", + "saveSpec": null, + "fetchSpec": "^1.1.0" + }, + "_requiredBy": [ + "/gauge" + ], + "_resolved": "https://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz", + "_shasum": "ae074e6bdc0c14a431e804e624549c633b000457", + "_spec": "wide-align@^1.1.0", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\gauge", + "author": { + "name": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org/" + }, + "bugs": { + "url": "https://github.com/iarna/wide-align/issues" + }, + "bundleDependencies": false, + "dependencies": { + "string-width": "^1.0.2 || 2" + }, + "deprecated": false, + "description": "A wide-character aware text alignment function for use on the console or with fixed width fonts.", + "devDependencies": { + "tap": "10 || 11 || 12" + }, + "files": [ + "align.js" + ], + "homepage": "https://github.com/iarna/wide-align#readme", + "keywords": [ + "wide", + "double", + "unicode", + "cjkv", + "pad", + "align" + ], + "license": "ISC", + "main": "align.js", + "name": "wide-align", + "repository": { + "type": "git", + "url": "git+https://github.com/iarna/wide-align.git" + }, + "scripts": { + "test": "tap --coverage test/*.js", + "version": "perl -pi -e 's/^( \"version\": $ENV{npm_config_node_version}\").*?\",/$1abc\",/' package-lock.json ; git add package-lock.json" + }, + "version": "1.1.3" +} diff --git a/packages/字体精简工具/node_modules/wrappy/LICENSE b/packages/字体精简工具/node_modules/wrappy/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/packages/字体精简工具/node_modules/wrappy/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/packages/字体精简工具/node_modules/wrappy/README.md b/packages/字体精简工具/node_modules/wrappy/README.md new file mode 100644 index 0000000..98eab25 --- /dev/null +++ b/packages/字体精简工具/node_modules/wrappy/README.md @@ -0,0 +1,36 @@ +# wrappy + +Callback wrapping utility + +## USAGE + +```javascript +var wrappy = require("wrappy") + +// var wrapper = wrappy(wrapperFunction) + +// make sure a cb is called only once +// See also: http://npm.im/once for this specific use case +var once = wrappy(function (cb) { + var called = false + return function () { + if (called) return + called = true + return cb.apply(this, arguments) + } +}) + +function printBoo () { + console.log('boo') +} +// has some rando property +printBoo.iAmBooPrinter = true + +var onlyPrintOnce = once(printBoo) + +onlyPrintOnce() // prints 'boo' +onlyPrintOnce() // does nothing + +// random property is retained! +assert.equal(onlyPrintOnce.iAmBooPrinter, true) +``` diff --git a/packages/字体精简工具/node_modules/wrappy/package.json b/packages/字体精简工具/node_modules/wrappy/package.json new file mode 100644 index 0000000..839f2f5 --- /dev/null +++ b/packages/字体精简工具/node_modules/wrappy/package.json @@ -0,0 +1,59 @@ +{ + "_from": "wrappy@1", + "_id": "wrappy@1.0.2", + "_inBundle": false, + "_integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "_location": "/wrappy", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "wrappy@1", + "name": "wrappy", + "escapedName": "wrappy", + "rawSpec": "1", + "saveSpec": null, + "fetchSpec": "1" + }, + "_requiredBy": [ + "/inflight", + "/once" + ], + "_resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz", + "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", + "_spec": "wrappy@1", + "_where": "D:\\workspace\\plugin\\mini_font\\packages\\mini_font\\publish\\mini_font\\node_modules\\inflight", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/npm/wrappy/issues" + }, + "bundleDependencies": false, + "dependencies": {}, + "deprecated": false, + "description": "Callback wrapping utility", + "devDependencies": { + "tap": "^2.3.1" + }, + "directories": { + "test": "test" + }, + "files": [ + "wrappy.js" + ], + "homepage": "https://github.com/npm/wrappy", + "license": "ISC", + "main": "wrappy.js", + "name": "wrappy", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/wrappy.git" + }, + "scripts": { + "test": "tap --coverage test/*.js" + }, + "version": "1.0.2" +} diff --git a/packages/字体精简工具/node_modules/wrappy/wrappy.js b/packages/字体精简工具/node_modules/wrappy/wrappy.js new file mode 100644 index 0000000..bb7e7d6 --- /dev/null +++ b/packages/字体精简工具/node_modules/wrappy/wrappy.js @@ -0,0 +1,33 @@ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} diff --git a/packages/字体精简工具/node_modules/xmldom/.travis.yml b/packages/字体精简工具/node_modules/xmldom/.travis.yml new file mode 100644 index 0000000..b95408e --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/.travis.yml @@ -0,0 +1,22 @@ +language: node_js + +node_js: + - '0.10' + +branches: + only: + - master + - proof + - travis-ci + +# Not using `npm install --dev` because it is recursive. It will pull in the all +# development dependencies for CoffeeScript. Way too much spew in the Travis CI +# build output. + +before_install: + - npm install + - npm install istanbul coveralls + +env: + global: + - secure: "BxUHTsa1WVANLQoimilbZwa1MCWSdM9hOmPWBE/rsYb7uT/iiqkRXXwnWhKtN5CLvTvIQbiAzq4iyPID0S8UHrnxClYQrOuA6QkrtwgIEuDAmijao/bgxobPOremvkwXcpMGIwzYKyYQQtSEaEIQbqf6gSSKW9dBh/GZ/vfTsqo=" diff --git a/packages/字体精简工具/node_modules/xmldom/LICENSE b/packages/字体精简工具/node_modules/xmldom/LICENSE new file mode 100644 index 0000000..68a9b5e --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/LICENSE @@ -0,0 +1,8 @@ +You can choose any one of those: + +The MIT License (MIT): + +link:http://opensource.org/licenses/MIT + +LGPL: +http://www.gnu.org/licenses/lgpl.html diff --git a/packages/字体精简工具/node_modules/xmldom/__package__.js b/packages/字体精简工具/node_modules/xmldom/__package__.js new file mode 100644 index 0000000..b4cad28 --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/__package__.js @@ -0,0 +1,4 @@ +this.addScript('dom.js',['DOMImplementation','XMLSerializer']); +this.addScript('dom-parser.js',['DOMHandler','DOMParser'], + ['DOMImplementation','XMLReader']); +this.addScript('sax.js','XMLReader'); \ No newline at end of file diff --git a/packages/字体精简工具/node_modules/xmldom/changelog b/packages/字体精简工具/node_modules/xmldom/changelog new file mode 100644 index 0000000..ab815bb --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/changelog @@ -0,0 +1,14 @@ +### Version 0.1.16 + +Sat May 4 14:58:03 UTC 2013 + + * Correctly handle multibyte Unicode greater than two byts. #57. #56. + * Initial unit testing and test coverage. #53. #46. #19. + * Create Bower `component.json` #52. + +### Version 0.1.8 + + * Add: some test case from node-o3-xml(excludes xpath support) + * Fix: remove existed attribute before setting (bug introduced in v0.1.5) + * Fix: index direct access for childNodes and any NodeList collection(not w3c standard) + * Fix: remove last child bug diff --git a/packages/字体精简工具/node_modules/xmldom/component.json b/packages/字体精简工具/node_modules/xmldom/component.json new file mode 100644 index 0000000..93b4d57 --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/component.json @@ -0,0 +1,10 @@ +{ + "name": "xmldom", + "version": "0.1.15", + "main": "dom-parser.js", + "ignore": [ + "**/.*", + "node_modules", + "components" + ] +} diff --git a/packages/字体精简工具/node_modules/xmldom/dom-parser.js b/packages/字体精简工具/node_modules/xmldom/dom-parser.js new file mode 100644 index 0000000..41d5226 --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/dom-parser.js @@ -0,0 +1,251 @@ +function DOMParser(options){ + this.options = options ||{locator:{}}; + +} +DOMParser.prototype.parseFromString = function(source,mimeType){ + var options = this.options; + var sax = new XMLReader(); + var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler + var errorHandler = options.errorHandler; + var locator = options.locator; + var defaultNSMap = options.xmlns||{}; + var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"} + if(locator){ + domBuilder.setDocumentLocator(locator) + } + + sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator); + sax.domBuilder = options.domBuilder || domBuilder; + if(/\/x?html?$/.test(mimeType)){ + entityMap.nbsp = '\xa0'; + entityMap.copy = '\xa9'; + defaultNSMap['']= 'http://www.w3.org/1999/xhtml'; + } + defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace'; + if(source){ + sax.parse(source,defaultNSMap,entityMap); + }else{ + sax.errorHandler.error("invalid doc source"); + } + return domBuilder.doc; +} +function buildErrorHandler(errorImpl,domBuilder,locator){ + if(!errorImpl){ + if(domBuilder instanceof DOMHandler){ + return domBuilder; + } + errorImpl = domBuilder ; + } + var errorHandler = {} + var isCallback = errorImpl instanceof Function; + locator = locator||{} + function build(key){ + var fn = errorImpl[key]; + if(!fn && isCallback){ + fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl; + } + errorHandler[key] = fn && function(msg){ + fn('[xmldom '+key+']\t'+msg+_locator(locator)); + }||function(){}; + } + build('warning'); + build('error'); + build('fatalError'); + return errorHandler; +} + +//console.log('#\n\n\n\n\n\n\n####') +/** + * +ContentHandler+ErrorHandler + * +LexicalHandler+EntityResolver2 + * -DeclHandler-DTDHandler + * + * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler + * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2 + * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html + */ +function DOMHandler() { + this.cdata = false; +} +function position(locator,node){ + node.lineNumber = locator.lineNumber; + node.columnNumber = locator.columnNumber; +} +/** + * @see org.xml.sax.ContentHandler#startDocument + * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html + */ +DOMHandler.prototype = { + startDocument : function() { + this.doc = new DOMImplementation().createDocument(null, null, null); + if (this.locator) { + this.doc.documentURI = this.locator.systemId; + } + }, + startElement:function(namespaceURI, localName, qName, attrs) { + var doc = this.doc; + var el = doc.createElementNS(namespaceURI, qName||localName); + var len = attrs.length; + appendElement(this, el); + this.currentElement = el; + + this.locator && position(this.locator,el) + for (var i = 0 ; i < len; i++) { + var namespaceURI = attrs.getURI(i); + var value = attrs.getValue(i); + var qName = attrs.getQName(i); + var attr = doc.createAttributeNS(namespaceURI, qName); + this.locator &&position(attrs.getLocator(i),attr); + attr.value = attr.nodeValue = value; + el.setAttributeNode(attr) + } + }, + endElement:function(namespaceURI, localName, qName) { + var current = this.currentElement + var tagName = current.tagName; + this.currentElement = current.parentNode; + }, + startPrefixMapping:function(prefix, uri) { + }, + endPrefixMapping:function(prefix) { + }, + processingInstruction:function(target, data) { + var ins = this.doc.createProcessingInstruction(target, data); + this.locator && position(this.locator,ins) + appendElement(this, ins); + }, + ignorableWhitespace:function(ch, start, length) { + }, + characters:function(chars, start, length) { + chars = _toString.apply(this,arguments) + //console.log(chars) + if(chars){ + if (this.cdata) { + var charNode = this.doc.createCDATASection(chars); + } else { + var charNode = this.doc.createTextNode(chars); + } + if(this.currentElement){ + this.currentElement.appendChild(charNode); + }else if(/^\s*$/.test(chars)){ + this.doc.appendChild(charNode); + //process xml + } + this.locator && position(this.locator,charNode) + } + }, + skippedEntity:function(name) { + }, + endDocument:function() { + this.doc.normalize(); + }, + setDocumentLocator:function (locator) { + if(this.locator = locator){// && !('lineNumber' in locator)){ + locator.lineNumber = 0; + } + }, + //LexicalHandler + comment:function(chars, start, length) { + chars = _toString.apply(this,arguments) + var comm = this.doc.createComment(chars); + this.locator && position(this.locator,comm) + appendElement(this, comm); + }, + + startCDATA:function() { + //used in characters() methods + this.cdata = true; + }, + endCDATA:function() { + this.cdata = false; + }, + + startDTD:function(name, publicId, systemId) { + var impl = this.doc.implementation; + if (impl && impl.createDocumentType) { + var dt = impl.createDocumentType(name, publicId, systemId); + this.locator && position(this.locator,dt) + appendElement(this, dt); + } + }, + /** + * @see org.xml.sax.ErrorHandler + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + warning:function(error) { + console.warn('[xmldom warning]\t'+error,_locator(this.locator)); + }, + error:function(error) { + console.error('[xmldom error]\t'+error,_locator(this.locator)); + }, + fatalError:function(error) { + console.error('[xmldom fatalError]\t'+error,_locator(this.locator)); + throw error; + } +} +function _locator(l){ + if(l){ + return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']' + } +} +function _toString(chars,start,length){ + if(typeof chars == 'string'){ + return chars.substr(start,length) + }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)") + if(chars.length >= start+length || start){ + return new java.lang.String(chars,start,length)+''; + } + return chars; + } +} + +/* + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html + * used method of org.xml.sax.ext.LexicalHandler: + * #comment(chars, start, length) + * #startCDATA() + * #endCDATA() + * #startDTD(name, publicId, systemId) + * + * + * IGNORED method of org.xml.sax.ext.LexicalHandler: + * #endDTD() + * #startEntity(name) + * #endEntity(name) + * + * + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html + * IGNORED method of org.xml.sax.ext.DeclHandler + * #attributeDecl(eName, aName, type, mode, value) + * #elementDecl(name, model) + * #externalEntityDecl(name, publicId, systemId) + * #internalEntityDecl(name, value) + * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html + * IGNORED method of org.xml.sax.EntityResolver2 + * #resolveEntity(String name,String publicId,String baseURI,String systemId) + * #resolveEntity(publicId, systemId) + * #getExternalSubset(name, baseURI) + * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html + * IGNORED method of org.xml.sax.DTDHandler + * #notationDecl(name, publicId, systemId) {}; + * #unparsedEntityDecl(name, publicId, systemId, notationName) {}; + */ +"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){ + DOMHandler.prototype[key] = function(){return null} +}) + +/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */ +function appendElement (hander,node) { + if (!hander.currentElement) { + hander.doc.appendChild(node); + } else { + hander.currentElement.appendChild(node); + } +}//appendChild and setAttributeNS are preformance key + +//if(typeof require == 'function'){ + var XMLReader = require('./sax').XMLReader; + var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation; + exports.XMLSerializer = require('./dom').XMLSerializer ; + exports.DOMParser = DOMParser; +//} diff --git a/packages/字体精简工具/node_modules/xmldom/dom.js b/packages/字体精简工具/node_modules/xmldom/dom.js new file mode 100644 index 0000000..b290df0 --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/dom.js @@ -0,0 +1,1244 @@ +/* + * DOM Level 2 + * Object DOMException + * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html + */ + +function copy(src,dest){ + for(var p in src){ + dest[p] = src[p]; + } +} +/** +^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));? +^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));? + */ +function _extends(Class,Super){ + var pt = Class.prototype; + if(Object.create){ + var ppt = Object.create(Super.prototype) + pt.__proto__ = ppt; + } + if(!(pt instanceof Super)){ + function t(){}; + t.prototype = Super.prototype; + t = new t(); + copy(pt,t); + Class.prototype = pt = t; + } + if(pt.constructor != Class){ + if(typeof Class != 'function'){ + console.error("unknow Class:"+Class) + } + pt.constructor = Class + } +} +var htmlns = 'http://www.w3.org/1999/xhtml' ; +// Node Types +var NodeType = {} +var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1; +var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2; +var TEXT_NODE = NodeType.TEXT_NODE = 3; +var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4; +var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5; +var ENTITY_NODE = NodeType.ENTITY_NODE = 6; +var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7; +var COMMENT_NODE = NodeType.COMMENT_NODE = 8; +var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9; +var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10; +var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11; +var NOTATION_NODE = NodeType.NOTATION_NODE = 12; + +// ExceptionCode +var ExceptionCode = {} +var ExceptionMessage = {}; +var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1); +var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2); +var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3); +var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4); +var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5); +var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6); +var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7); +var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8); +var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9); +var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10); +//level2 +var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11); +var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12); +var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13); +var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14); +var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15); + + +function DOMException(code, message) { + if(message instanceof Error){ + var error = message; + }else{ + error = this; + Error.call(this, ExceptionMessage[code]); + this.message = ExceptionMessage[code]; + if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException); + } + error.code = code; + if(message) this.message = this.message + ": " + message; + return error; +}; +DOMException.prototype = Error.prototype; +copy(ExceptionCode,DOMException) +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177 + * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. + * The items in the NodeList are accessible via an integral index, starting from 0. + */ +function NodeList() { +}; +NodeList.prototype = { + /** + * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive. + * @standard level1 + */ + length:0, + /** + * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null. + * @standard level1 + * @param index unsigned long + * Index into the collection. + * @return Node + * The node at the indexth position in the NodeList, or null if that is not a valid index. + */ + item: function(index) { + return this[index] || null; + }, + toString:function(isHTML,nodeFilter){ + for(var buf = [], i = 0;i=0){ + var lastIndex = list.length-1 + while(i0 || key == 'xmlns'){ +// return null; +// } + //console.log() + var i = this.length; + while(i--){ + var attr = this[i]; + //console.log(attr.nodeName,key) + if(attr.nodeName == key){ + return attr; + } + } + }, + setNamedItem: function(attr) { + var el = attr.ownerElement; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + var oldAttr = this.getNamedItem(attr.nodeName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + /* returns Node */ + setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR + var el = attr.ownerElement, oldAttr; + if(el && el!=this._ownerElement){ + throw new DOMException(INUSE_ATTRIBUTE_ERR); + } + oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName); + _addNamedNode(this._ownerElement,this,attr,oldAttr); + return oldAttr; + }, + + /* returns Node */ + removeNamedItem: function(key) { + var attr = this.getNamedItem(key); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + + + },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR + + //for level2 + removeNamedItemNS:function(namespaceURI,localName){ + var attr = this.getNamedItemNS(namespaceURI,localName); + _removeNamedNode(this._ownerElement,this,attr); + return attr; + }, + getNamedItemNS: function(namespaceURI, localName) { + var i = this.length; + while(i--){ + var node = this[i]; + if(node.localName == localName && node.namespaceURI == namespaceURI){ + return node; + } + } + return null; + } +}; +/** + * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 + */ +function DOMImplementation(/* Object */ features) { + this._features = {}; + if (features) { + for (var feature in features) { + this._features = features[feature]; + } + } +}; + +DOMImplementation.prototype = { + hasFeature: function(/* string */ feature, /* string */ version) { + var versions = this._features[feature.toLowerCase()]; + if (versions && (!version || version in versions)) { + return true; + } else { + return false; + } + }, + // Introduced in DOM Level 2: + createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR + var doc = new Document(); + doc.implementation = this; + doc.childNodes = new NodeList(); + doc.doctype = doctype; + if(doctype){ + doc.appendChild(doctype); + } + if(qualifiedName){ + var root = doc.createElementNS(namespaceURI,qualifiedName); + doc.appendChild(root); + } + return doc; + }, + // Introduced in DOM Level 2: + createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR + var node = new DocumentType(); + node.name = qualifiedName; + node.nodeName = qualifiedName; + node.publicId = publicId; + node.systemId = systemId; + // Introduced in DOM Level 2: + //readonly attribute DOMString internalSubset; + + //TODO:.. + // readonly attribute NamedNodeMap entities; + // readonly attribute NamedNodeMap notations; + return node; + } +}; + + +/** + * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 + */ + +function Node() { +}; + +Node.prototype = { + firstChild : null, + lastChild : null, + previousSibling : null, + nextSibling : null, + attributes : null, + parentNode : null, + childNodes : null, + ownerDocument : null, + nodeValue : null, + namespaceURI : null, + prefix : null, + localName : null, + // Modified in DOM Level 2: + insertBefore:function(newChild, refChild){//raises + return _insertBefore(this,newChild,refChild); + }, + replaceChild:function(newChild, oldChild){//raises + this.insertBefore(newChild,oldChild); + if(oldChild){ + this.removeChild(oldChild); + } + }, + removeChild:function(oldChild){ + return _removeChild(this,oldChild); + }, + appendChild:function(newChild){ + return this.insertBefore(newChild,null); + }, + hasChildNodes:function(){ + return this.firstChild != null; + }, + cloneNode:function(deep){ + return cloneNode(this.ownerDocument||this,this,deep); + }, + // Modified in DOM Level 2: + normalize:function(){ + var child = this.firstChild; + while(child){ + var next = child.nextSibling; + if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){ + this.removeChild(next); + child.appendData(next.data); + }else{ + child.normalize(); + child = next; + } + } + }, + // Introduced in DOM Level 2: + isSupported:function(feature, version){ + return this.ownerDocument.implementation.hasFeature(feature,version); + }, + // Introduced in DOM Level 2: + hasAttributes:function(){ + return this.attributes.length>0; + }, + lookupPrefix:function(namespaceURI){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + for(var n in map){ + if(map[n] == namespaceURI){ + return n; + } + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + lookupNamespaceURI:function(prefix){ + var el = this; + while(el){ + var map = el._nsMap; + //console.dir(map) + if(map){ + if(prefix in map){ + return map[prefix] ; + } + } + el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode; + } + return null; + }, + // Introduced in DOM Level 3: + isDefaultNamespace:function(namespaceURI){ + var prefix = this.lookupPrefix(namespaceURI); + return prefix == null; + } +}; + + +function _xmlEncoder(c){ + return c == '<' && '<' || + c == '>' && '>' || + c == '&' && '&' || + c == '"' && '"' || + '&#'+c.charCodeAt()+';' +} + + +copy(NodeType,Node); +copy(NodeType,Node.prototype); + +/** + * @param callback return true for continue,false for break + * @return boolean true: break visit; + */ +function _visitNode(node,callback){ + if(callback(node)){ + return true; + } + if(node = node.firstChild){ + do{ + if(_visitNode(node,callback)){return true} + }while(node=node.nextSibling) + } +} + + + +function Document(){ +} +function _onAddAttribute(doc,el,newAttr){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value + } +} +function _onRemoveAttribute(doc,el,newAttr,remove){ + doc && doc._inc++; + var ns = newAttr.namespaceURI ; + if(ns == 'http://www.w3.org/2000/xmlns/'){ + //update namespace + delete el._nsMap[newAttr.prefix?newAttr.localName:''] + } +} +function _onUpdateChild(doc,el,newChild){ + if(doc && doc._inc){ + doc._inc++; + //update childNodes + var cs = el.childNodes; + if(newChild){ + cs[cs.length++] = newChild; + }else{ + //console.log(1) + var child = el.firstChild; + var i = 0; + while(child){ + cs[i++] = child; + child =child.nextSibling; + } + cs.length = i; + } + } +} + +/** + * attributes; + * children; + * + * writeable properties: + * nodeValue,Attr:value,CharacterData:data + * prefix + */ +function _removeChild(parentNode,child){ + var previous = child.previousSibling; + var next = child.nextSibling; + if(previous){ + previous.nextSibling = next; + }else{ + parentNode.firstChild = next + } + if(next){ + next.previousSibling = previous; + }else{ + parentNode.lastChild = previous; + } + _onUpdateChild(parentNode.ownerDocument,parentNode); + return child; +} +/** + * preformance key(refChild == null) + */ +function _insertBefore(parentNode,newChild,nextChild){ + var cp = newChild.parentNode; + if(cp){ + cp.removeChild(newChild);//remove and update + } + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + var newFirst = newChild.firstChild; + if (newFirst == null) { + return newChild; + } + var newLast = newChild.lastChild; + }else{ + newFirst = newLast = newChild; + } + var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild; + + newFirst.previousSibling = pre; + newLast.nextSibling = nextChild; + + + if(pre){ + pre.nextSibling = newFirst; + }else{ + parentNode.firstChild = newFirst; + } + if(nextChild == null){ + parentNode.lastChild = newLast; + }else{ + nextChild.previousSibling = newLast; + } + do{ + newFirst.parentNode = parentNode; + }while(newFirst !== newLast && (newFirst= newFirst.nextSibling)) + _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode); + //console.log(parentNode.lastChild.nextSibling == null) + if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) { + newChild.firstChild = newChild.lastChild = null; + } + return newChild; +} +function _appendSingleChild(parentNode,newChild){ + var cp = newChild.parentNode; + if(cp){ + var pre = parentNode.lastChild; + cp.removeChild(newChild);//remove and update + var pre = parentNode.lastChild; + } + var pre = parentNode.lastChild; + newChild.parentNode = parentNode; + newChild.previousSibling = pre; + newChild.nextSibling = null; + if(pre){ + pre.nextSibling = newChild; + }else{ + parentNode.firstChild = newChild; + } + parentNode.lastChild = newChild; + _onUpdateChild(parentNode.ownerDocument,parentNode,newChild); + return newChild; + //console.log("__aa",parentNode.lastChild.nextSibling == null) +} +Document.prototype = { + //implementation : null, + nodeName : '#document', + nodeType : DOCUMENT_NODE, + doctype : null, + documentElement : null, + _inc : 1, + + insertBefore : function(newChild, refChild){//raises + if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){ + var child = newChild.firstChild; + while(child){ + var next = child.nextSibling; + this.insertBefore(child,refChild); + child = next; + } + return newChild; + } + if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){ + this.documentElement = newChild; + } + + return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild; + }, + removeChild : function(oldChild){ + if(this.documentElement == oldChild){ + this.documentElement = null; + } + return _removeChild(this,oldChild); + }, + // Introduced in DOM Level 2: + importNode : function(importedNode,deep){ + return importNode(this,importedNode,deep); + }, + // Introduced in DOM Level 2: + getElementById : function(id){ + var rtv = null; + _visitNode(this.documentElement,function(node){ + if(node.nodeType == ELEMENT_NODE){ + if(node.getAttribute('id') == id){ + rtv = node; + return true; + } + } + }) + return rtv; + }, + + //document factory method: + createElement : function(tagName){ + var node = new Element(); + node.ownerDocument = this; + node.nodeName = tagName; + node.tagName = tagName; + node.childNodes = new NodeList(); + var attrs = node.attributes = new NamedNodeMap(); + attrs._ownerElement = node; + return node; + }, + createDocumentFragment : function(){ + var node = new DocumentFragment(); + node.ownerDocument = this; + node.childNodes = new NodeList(); + return node; + }, + createTextNode : function(data){ + var node = new Text(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createComment : function(data){ + var node = new Comment(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createCDATASection : function(data){ + var node = new CDATASection(); + node.ownerDocument = this; + node.appendData(data) + return node; + }, + createProcessingInstruction : function(target,data){ + var node = new ProcessingInstruction(); + node.ownerDocument = this; + node.tagName = node.target = target; + node.nodeValue= node.data = data; + return node; + }, + createAttribute : function(name){ + var node = new Attr(); + node.ownerDocument = this; + node.name = name; + node.nodeName = name; + node.localName = name; + node.specified = true; + return node; + }, + createEntityReference : function(name){ + var node = new EntityReference(); + node.ownerDocument = this; + node.nodeName = name; + return node; + }, + // Introduced in DOM Level 2: + createElementNS : function(namespaceURI,qualifiedName){ + var node = new Element(); + var pl = qualifiedName.split(':'); + var attrs = node.attributes = new NamedNodeMap(); + node.childNodes = new NodeList(); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.tagName = qualifiedName; + node.namespaceURI = namespaceURI; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + attrs._ownerElement = node; + return node; + }, + // Introduced in DOM Level 2: + createAttributeNS : function(namespaceURI,qualifiedName){ + var node = new Attr(); + var pl = qualifiedName.split(':'); + node.ownerDocument = this; + node.nodeName = qualifiedName; + node.name = qualifiedName; + node.namespaceURI = namespaceURI; + node.specified = true; + if(pl.length == 2){ + node.prefix = pl[0]; + node.localName = pl[1]; + }else{ + //el.prefix = null; + node.localName = qualifiedName; + } + return node; + } +}; +_extends(Document,Node); + + +function Element() { + this._nsMap = {}; +}; +Element.prototype = { + nodeType : ELEMENT_NODE, + hasAttribute : function(name){ + return this.getAttributeNode(name)!=null; + }, + getAttribute : function(name){ + var attr = this.getAttributeNode(name); + return attr && attr.value || ''; + }, + getAttributeNode : function(name){ + return this.attributes.getNamedItem(name); + }, + setAttribute : function(name, value){ + var attr = this.ownerDocument.createAttribute(name); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + removeAttribute : function(name){ + var attr = this.getAttributeNode(name) + attr && this.removeAttributeNode(attr); + }, + + //four real opeartion method + appendChild:function(newChild){ + if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){ + return this.insertBefore(newChild,null); + }else{ + return _appendSingleChild(this,newChild); + } + }, + setAttributeNode : function(newAttr){ + return this.attributes.setNamedItem(newAttr); + }, + setAttributeNodeNS : function(newAttr){ + return this.attributes.setNamedItemNS(newAttr); + }, + removeAttributeNode : function(oldAttr){ + //console.log(this == oldAttr.ownerElement) + return this.attributes.removeNamedItem(oldAttr.nodeName); + }, + //get real attribute name,and remove it by removeAttributeNode + removeAttributeNS : function(namespaceURI, localName){ + var old = this.getAttributeNodeNS(namespaceURI, localName); + old && this.removeAttributeNode(old); + }, + + hasAttributeNS : function(namespaceURI, localName){ + return this.getAttributeNodeNS(namespaceURI, localName)!=null; + }, + getAttributeNS : function(namespaceURI, localName){ + var attr = this.getAttributeNodeNS(namespaceURI, localName); + return attr && attr.value || ''; + }, + setAttributeNS : function(namespaceURI, qualifiedName, value){ + var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); + attr.value = attr.nodeValue = "" + value; + this.setAttributeNode(attr) + }, + getAttributeNodeNS : function(namespaceURI, localName){ + return this.attributes.getNamedItemNS(namespaceURI, localName); + }, + + getElementsByTagName : function(tagName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){ + ls.push(node); + } + }); + return ls; + }); + }, + getElementsByTagNameNS : function(namespaceURI, localName){ + return new LiveNodeList(this,function(base){ + var ls = []; + _visitNode(base,function(node){ + if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){ + ls.push(node); + } + }); + return ls; + + }); + } +}; +Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName; +Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS; + + +_extends(Element,Node); +function Attr() { +}; +Attr.prototype.nodeType = ATTRIBUTE_NODE; +_extends(Attr,Node); + + +function CharacterData() { +}; +CharacterData.prototype = { + data : '', + substringData : function(offset, count) { + return this.data.substring(offset, offset+count); + }, + appendData: function(text) { + text = this.data+text; + this.nodeValue = this.data = text; + this.length = text.length; + }, + insertData: function(offset,text) { + this.replaceData(offset,0,text); + + }, + appendChild:function(newChild){ + throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR]) + }, + deleteData: function(offset, count) { + this.replaceData(offset,count,""); + }, + replaceData: function(offset, count, text) { + var start = this.data.substring(0,offset); + var end = this.data.substring(offset+count); + text = start + text + end; + this.nodeValue = this.data = text; + this.length = text.length; + } +} +_extends(CharacterData,Node); +function Text() { +}; +Text.prototype = { + nodeName : "#text", + nodeType : TEXT_NODE, + splitText : function(offset) { + var text = this.data; + var newText = text.substring(offset); + text = text.substring(0, offset); + this.data = this.nodeValue = text; + this.length = text.length; + var newNode = this.ownerDocument.createTextNode(newText); + if(this.parentNode){ + this.parentNode.insertBefore(newNode, this.nextSibling); + } + return newNode; + } +} +_extends(Text,CharacterData); +function Comment() { +}; +Comment.prototype = { + nodeName : "#comment", + nodeType : COMMENT_NODE +} +_extends(Comment,CharacterData); + +function CDATASection() { +}; +CDATASection.prototype = { + nodeName : "#cdata-section", + nodeType : CDATA_SECTION_NODE +} +_extends(CDATASection,CharacterData); + + +function DocumentType() { +}; +DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE; +_extends(DocumentType,Node); + +function Notation() { +}; +Notation.prototype.nodeType = NOTATION_NODE; +_extends(Notation,Node); + +function Entity() { +}; +Entity.prototype.nodeType = ENTITY_NODE; +_extends(Entity,Node); + +function EntityReference() { +}; +EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE; +_extends(EntityReference,Node); + +function DocumentFragment() { +}; +DocumentFragment.prototype.nodeName = "#document-fragment"; +DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE; +_extends(DocumentFragment,Node); + + +function ProcessingInstruction() { +} +ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE; +_extends(ProcessingInstruction,Node); +function XMLSerializer(){} +XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){ + return nodeSerializeToString.call(node,isHtml,nodeFilter); +} +Node.prototype.toString = nodeSerializeToString; +function nodeSerializeToString(isHtml,nodeFilter){ + var buf = []; + var refNode = this.nodeType == 9?this.documentElement:this; + var prefix = refNode.prefix; + var uri = refNode.namespaceURI; + + if(uri && prefix == null){ + //console.log(prefix) + var prefix = refNode.lookupPrefix(uri); + if(prefix == null){ + //isHTML = true; + var visibleNamespaces=[ + {namespace:uri,prefix:null} + //{namespace:uri,prefix:''} + ] + } + } + serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces); + //console.log('###',this.nodeType,uri,prefix,buf.join('')) + return buf.join(''); +} +function needNamespaceDefine(node,isHTML, visibleNamespaces) { + var prefix = node.prefix||''; + var uri = node.namespaceURI; + if (!prefix && !uri){ + return false; + } + if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" + || uri == 'http://www.w3.org/2000/xmlns/'){ + return false; + } + + var i = visibleNamespaces.length + //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces) + while (i--) { + var ns = visibleNamespaces[i]; + // get namespace prefix + //console.log(node.nodeType,node.tagName,ns.prefix,prefix) + if (ns.prefix == prefix){ + return ns.namespace != uri; + } + } + //console.log(isHTML,uri,prefix=='') + //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){ + // return false; + //} + //node.flag = '11111' + //console.error(3,true,node.flag,node.prefix,node.namespaceURI) + return true; +} +function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){ + if(nodeFilter){ + node = nodeFilter(node); + if(node){ + if(typeof node == 'string'){ + buf.push(node); + return; + } + }else{ + return; + } + //buf.sort.apply(attrs, attributeSorter); + } + switch(node.nodeType){ + case ELEMENT_NODE: + if (!visibleNamespaces) visibleNamespaces = []; + var startVisibleNamespaces = visibleNamespaces.length; + var attrs = node.attributes; + var len = attrs.length; + var child = node.firstChild; + var nodeName = node.tagName; + + isHTML = (htmlns === node.namespaceURI) ||isHTML + buf.push('<',nodeName); + + + + for(var i=0;i'); + //if is cdata child node + if(isHTML && /^script$/i.test(nodeName)){ + while(child){ + if(child.data){ + buf.push(child.data); + }else{ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + } + child = child.nextSibling; + } + }else + { + while(child){ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + child = child.nextSibling; + } + } + buf.push(''); + }else{ + buf.push('/>'); + } + // remove added visible namespaces + //visibleNamespaces.length = startVisibleNamespaces; + return; + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + var child = node.firstChild; + while(child){ + serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces); + child = child.nextSibling; + } + return; + case ATTRIBUTE_NODE: + return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"'); + case TEXT_NODE: + return buf.push(node.data.replace(/[<&]/g,_xmlEncoder)); + case CDATA_SECTION_NODE: + return buf.push( ''); + case COMMENT_NODE: + return buf.push( ""); + case DOCUMENT_TYPE_NODE: + var pubid = node.publicId; + var sysid = node.systemId; + buf.push(''); + }else if(sysid && sysid!='.'){ + buf.push(' SYSTEM "',sysid,'">'); + }else{ + var sub = node.internalSubset; + if(sub){ + buf.push(" [",sub,"]"); + } + buf.push(">"); + } + return; + case PROCESSING_INSTRUCTION_NODE: + return buf.push( ""); + case ENTITY_REFERENCE_NODE: + return buf.push( '&',node.nodeName,';'); + //case ENTITY_NODE: + //case NOTATION_NODE: + default: + buf.push('??',node.nodeName); + } +} +function importNode(doc,node,deep){ + var node2; + switch (node.nodeType) { + case ELEMENT_NODE: + node2 = node.cloneNode(false); + node2.ownerDocument = doc; + //var attrs = node2.attributes; + //var len = attrs.length; + //for(var i=0;i=0.1" + }, + "homepage": "https://github.com/xmldom/xmldom", + "keywords": [ + "w3c", + "dom", + "xml", + "parser", + "javascript", + "DOMParser", + "XMLSerializer" + ], + "license": "(LGPL-2.0 or MIT)", + "main": "./dom-parser.js", + "maintainers": [ + { + "name": "jindw", + "email": "jindw@xidea.org", + "url": "http://www.xidea.org" + } + ], + "name": "xmldom", + "repository": { + "type": "git", + "url": "git://github.com/xmldom/xmldom.git" + }, + "scripts": { + "test": "proof platform win32 && proof test */*/*.t.js || t/test" + }, + "version": "0.1.31" +} diff --git a/packages/字体精简工具/node_modules/xmldom/readme.md b/packages/字体精简工具/node_modules/xmldom/readme.md new file mode 100644 index 0000000..f832c44 --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/readme.md @@ -0,0 +1,219 @@ +# XMLDOM [![Build Status](https://secure.travis-ci.org/bigeasy/xmldom.png?branch=master)](http://travis-ci.org/bigeasy/xmldom) [![Coverage Status](https://coveralls.io/repos/bigeasy/xmldom/badge.png?branch=master)](https://coveralls.io/r/bigeasy/xmldom) [![NPM version](https://badge.fury.io/js/xmldom.png)](http://badge.fury.io/js/xmldom) + +A JavaScript implementation of W3C DOM for Node.js, Rhino and the browser. Fully +compatible with `W3C DOM level2`; and some compatible with `level3`. Supports +`DOMParser` and `XMLSerializer` interface such as in browser. + +Install: +------- +>npm install xmldom + +Example: +==== +```javascript +var DOMParser = require('xmldom').DOMParser; +var doc = new DOMParser().parseFromString( + '\n'+ + '\ttest\n'+ + '\t\n'+ + '\t\n'+ + '' + ,'text/xml'); +doc.documentElement.setAttribute('x','y'); +doc.documentElement.setAttributeNS('./lite','c:x','y2'); +var nsAttr = doc.documentElement.getAttributeNS('./lite','x') +console.info(nsAttr) +console.info(doc) +``` +API Reference +===== + + * [DOMParser](https://developer.mozilla.org/en/DOMParser): + + ```javascript + parseFromString(xmlsource,mimeType) + ``` + * **options extension** _by xmldom_(not BOM standard!!) + + ```javascript + //added the options argument + new DOMParser(options) + + //errorHandler is supported + new DOMParser({ + /** + * locator is always need for error position info + */ + locator:{}, + /** + * you can override the errorHandler for xml parser + * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html + */ + errorHandler:{warning:function(w){console.warn(w)},error:callback,fatalError:callback} + //only callback model + //errorHandler:function(level,msg){console.log(level,msg)} + }) + + ``` + + * [XMLSerializer](https://developer.mozilla.org/en/XMLSerializer) + + ```javascript + serializeToString(node) + ``` +DOM level2 method and attribute: +------ + + * [Node](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247) + + attribute: + nodeValue|prefix + readonly attribute: + nodeName|nodeType|parentNode|childNodes|firstChild|lastChild|previousSibling|nextSibling|attributes|ownerDocument|namespaceURI|localName + method: + insertBefore(newChild, refChild) + replaceChild(newChild, oldChild) + removeChild(oldChild) + appendChild(newChild) + hasChildNodes() + cloneNode(deep) + normalize() + isSupported(feature, version) + hasAttributes() + + * [DOMImplementation](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-102161490) + + method: + hasFeature(feature, version) + createDocumentType(qualifiedName, publicId, systemId) + createDocument(namespaceURI, qualifiedName, doctype) + + * [Document](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#i-Document) : Node + + readonly attribute: + doctype|implementation|documentElement + method: + createElement(tagName) + createDocumentFragment() + createTextNode(data) + createComment(data) + createCDATASection(data) + createProcessingInstruction(target, data) + createAttribute(name) + createEntityReference(name) + getElementsByTagName(tagname) + importNode(importedNode, deep) + createElementNS(namespaceURI, qualifiedName) + createAttributeNS(namespaceURI, qualifiedName) + getElementsByTagNameNS(namespaceURI, localName) + getElementById(elementId) + + * [DocumentFragment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-B63ED1A3) : Node + * [Element](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-745549614) : Node + + readonly attribute: + tagName + method: + getAttribute(name) + setAttribute(name, value) + removeAttribute(name) + getAttributeNode(name) + setAttributeNode(newAttr) + removeAttributeNode(oldAttr) + getElementsByTagName(name) + getAttributeNS(namespaceURI, localName) + setAttributeNS(namespaceURI, qualifiedName, value) + removeAttributeNS(namespaceURI, localName) + getAttributeNodeNS(namespaceURI, localName) + setAttributeNodeNS(newAttr) + getElementsByTagNameNS(namespaceURI, localName) + hasAttribute(name) + hasAttributeNS(namespaceURI, localName) + + * [Attr](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-637646024) : Node + + attribute: + value + readonly attribute: + name|specified|ownerElement + + * [NodeList](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177) + + readonly attribute: + length + method: + item(index) + + * [NamedNodeMap](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1780488922) + + readonly attribute: + length + method: + getNamedItem(name) + setNamedItem(arg) + removeNamedItem(name) + item(index) + getNamedItemNS(namespaceURI, localName) + setNamedItemNS(arg) + removeNamedItemNS(namespaceURI, localName) + + * [CharacterData](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-FF21A306) : Node + + method: + substringData(offset, count) + appendData(arg) + insertData(offset, arg) + deleteData(offset, count) + replaceData(offset, count, arg) + + * [Text](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1312295772) : CharacterData + + method: + splitText(offset) + + * [CDATASection](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-667469212) + * [Comment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1728279322) : CharacterData + + * [DocumentType](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-412266927) + + readonly attribute: + name|entities|notations|publicId|systemId|internalSubset + + * Notation : Node + + readonly attribute: + publicId|systemId + + * Entity : Node + + readonly attribute: + publicId|systemId|notationName + + * EntityReference : Node + * ProcessingInstruction : Node + + attribute: + data + readonly attribute: + target + +DOM level 3 support: +----- + + * [Node](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent) + + attribute: + textContent + method: + isDefaultNamespace(namespaceURI){ + lookupNamespaceURI(prefix) + +DOM extension by xmldom +--- + * [Node] Source position extension; + + attribute: + //Numbered starting from '1' + lineNumber + //Numbered starting from '1' + columnNumber diff --git a/packages/字体精简工具/node_modules/xmldom/sax.js b/packages/字体精简工具/node_modules/xmldom/sax.js new file mode 100644 index 0000000..b33635f --- /dev/null +++ b/packages/字体精简工具/node_modules/xmldom/sax.js @@ -0,0 +1,633 @@ +//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] +//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] +//[5] Name ::= NameStartChar (NameChar)* +var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF +var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"); +var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$'); +//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ +//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',') + +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE +var S_TAG = 0;//tag name offerring +var S_ATTR = 1;//attr name offerring +var S_ATTR_SPACE=2;//attr name end and space offer +var S_EQ = 3;//=space? +var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only) +var S_ATTR_END = 5;//attr value end and no space(quot end) +var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer) +var S_TAG_CLOSE = 7;//closed el + +function XMLReader(){ + +} + +XMLReader.prototype = { + parse:function(source,defaultNSMap,entityMap){ + var domBuilder = this.domBuilder; + domBuilder.startDocument(); + _copy(defaultNSMap ,defaultNSMap = {}) + parse(source,defaultNSMap,entityMap, + domBuilder,this.errorHandler); + domBuilder.endDocument(); + } +} +function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ + function fixedFromCharCode(code) { + // String.prototype.fromCharCode does not supports + // > 2 bytes unicode chars directly + if (code > 0xffff) { + code -= 0x10000; + var surrogate1 = 0xd800 + (code >> 10) + , surrogate2 = 0xdc00 + (code & 0x3ff); + + return String.fromCharCode(surrogate1, surrogate2); + } else { + return String.fromCharCode(code); + } + } + function entityReplacer(a){ + var k = a.slice(1,-1); + if(k in entityMap){ + return entityMap[k]; + }else if(k.charAt(0) === '#'){ + return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x'))) + }else{ + errorHandler.error('entity not found:'+a); + return a; + } + } + function appendText(end){//has some bugs + if(end>start){ + var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); + locator&&position(start); + domBuilder.characters(xt,0,end-start); + start = end + } + } + function position(p,m){ + while(p>=lineEnd && (m = linePattern.exec(source))){ + lineStart = m.index; + lineEnd = lineStart + m[0].length; + locator.lineNumber++; + //console.log('line++:',locator,startPos,endPos) + } + locator.columnNumber = p-lineStart+1; + } + var lineStart = 0; + var lineEnd = 0; + var linePattern = /.*(?:\r\n?|\n)|.*$/g + var locator = domBuilder.locator; + + var parseStack = [{currentNSMap:defaultNSMapCopy}] + var closeMap = {}; + var start = 0; + while(true){ + try{ + var tagStart = source.indexOf('<',start); + if(tagStart<0){ + if(!source.substr(start).match(/^\s*$/)){ + var doc = domBuilder.doc; + var text = doc.createTextNode(source.substr(start)); + doc.appendChild(text); + domBuilder.currentElement = text; + } + return; + } + if(tagStart>start){ + appendText(tagStart); + } + switch(source.charAt(tagStart+1)){ + case '/': + var end = source.indexOf('>',tagStart+3); + var tagName = source.substring(tagStart+2,end); + var config = parseStack.pop(); + if(end<0){ + + tagName = source.substring(tagStart+2).replace(/[\s<].*/,''); + //console.error('#@@@@@@'+tagName) + errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName); + end = tagStart+1+tagName.length; + }else if(tagName.match(/\s + locator&&position(tagStart); + end = parseInstruction(source,tagStart,domBuilder); + break; + case '!':// start){ + start = end; + }else{ + //TODO: 这里有可能sax回退,有位置错误风险 + appendText(Math.max(tagStart,start)+1); + } + } +} +function copyLocator(f,t){ + t.lineNumber = f.lineNumber; + t.columnNumber = f.columnNumber; + return t; +} + +/** + * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack); + * @return end of the elementStartPart(end of elementEndPart for selfClosed el) + */ +function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){ + var attrName; + var value; + var p = ++start; + var s = S_TAG;//status + while(true){ + var c = source.charAt(p); + switch(c){ + case '=': + if(s === S_ATTR){//attrName + attrName = source.slice(start,p); + s = S_EQ; + }else if(s === S_ATTR_SPACE){ + s = S_EQ; + }else{ + //fatalError: equal must after attrName or space after attrName + throw new Error('attribute equal must after attrName'); + } + break; + case '\'': + case '"': + if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE + ){//equal + if(s === S_ATTR){ + errorHandler.warning('attribute value must after "="') + attrName = source.slice(start,p) + } + start = p+1; + p = source.indexOf(c,start) + if(p>0){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + el.add(attrName,value,start-1); + s = S_ATTR_END; + }else{ + //fatalError: no end quot match + throw new Error('attribute value no end \''+c+'\' match'); + } + }else if(s == S_ATTR_NOQUOT_VALUE){ + value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + //console.log(attrName,value,start,p) + el.add(attrName,value,start); + //console.dir(el) + errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!'); + start = p+1; + s = S_ATTR_END + }else{ + //fatalError: no equal before + throw new Error('attribute value must after "="'); + } + break; + case '/': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + s =S_TAG_CLOSE; + el.closed = true; + case S_ATTR_NOQUOT_VALUE: + case S_ATTR: + case S_ATTR_SPACE: + break; + //case S_EQ: + default: + throw new Error("attribute invalid close char('/')") + } + break; + case ''://end document + //throw new Error('unexpected end of input') + errorHandler.error('unexpected end of input'); + if(s == S_TAG){ + el.setTagName(source.slice(start,p)); + } + return p; + case '>': + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p)); + case S_ATTR_END: + case S_TAG_SPACE: + case S_TAG_CLOSE: + break;//normal + case S_ATTR_NOQUOT_VALUE://Compatible state + case S_ATTR: + value = source.slice(start,p); + if(value.slice(-1) === '/'){ + el.closed = true; + value = value.slice(0,-1) + } + case S_ATTR_SPACE: + if(s === S_ATTR_SPACE){ + value = attrName; + } + if(s == S_ATTR_NOQUOT_VALUE){ + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start) + }else{ + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!') + } + el.add(value,value,start) + } + break; + case S_EQ: + throw new Error('attribute value missed!!'); + } +// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName)) + return p; + /*xml space '\x20' | #x9 | #xD | #xA; */ + case '\u0080': + c = ' '; + default: + if(c<= ' '){//space + switch(s){ + case S_TAG: + el.setTagName(source.slice(start,p));//tagName + s = S_TAG_SPACE; + break; + case S_ATTR: + attrName = source.slice(start,p) + s = S_ATTR_SPACE; + break; + case S_ATTR_NOQUOT_VALUE: + var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer); + errorHandler.warning('attribute "'+value+'" missed quot(")!!'); + el.add(attrName,value,start) + case S_ATTR_END: + s = S_TAG_SPACE; + break; + //case S_TAG_SPACE: + //case S_EQ: + //case S_ATTR_SPACE: + // void();break; + //case S_TAG_CLOSE: + //ignore warning + } + }else{//not space +//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE +//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE + switch(s){ + //case S_TAG:void();break; + //case S_ATTR:void();break; + //case S_ATTR_NOQUOT_VALUE:void();break; + case S_ATTR_SPACE: + var tagName = el.tagName; + if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){ + errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!') + } + el.add(attrName,attrName,start); + start = p; + s = S_ATTR; + break; + case S_ATTR_END: + errorHandler.warning('attribute space is required"'+attrName+'"!!') + case S_TAG_SPACE: + s = S_ATTR; + start = p; + break; + case S_EQ: + s = S_ATTR_NOQUOT_VALUE; + start = p; + break; + case S_TAG_CLOSE: + throw new Error("elements closed character '/' and '>' must be connected to"); + } + } + }//end outer switch + //console.log('p++',p) + p++; + } +} +/** + * @return true if has new namespace define + */ +function appendElement(el,domBuilder,currentNSMap){ + var tagName = el.tagName; + var localNSMap = null; + //var currentNSMap = parseStack[parseStack.length-1].currentNSMap; + var i = el.length; + while(i--){ + var a = el[i]; + var qName = a.qName; + var value = a.value; + var nsp = qName.indexOf(':'); + if(nsp>0){ + var prefix = a.prefix = qName.slice(0,nsp); + var localName = qName.slice(nsp+1); + var nsPrefix = prefix === 'xmlns' && localName + }else{ + localName = qName; + prefix = null + nsPrefix = qName === 'xmlns' && '' + } + //can not set prefix,because prefix !== '' + a.localName = localName ; + //prefix == null for no ns prefix attribute + if(nsPrefix !== false){//hack!! + if(localNSMap == null){ + localNSMap = {} + //console.log(currentNSMap,0) + _copy(currentNSMap,currentNSMap={}) + //console.log(currentNSMap,1) + } + currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; + a.uri = 'http://www.w3.org/2000/xmlns/' + domBuilder.startPrefixMapping(nsPrefix, value) + } + } + var i = el.length; + while(i--){ + a = el[i]; + var prefix = a.prefix; + if(prefix){//no prefix attribute has no namespace + if(prefix === 'xml'){ + a.uri = 'http://www.w3.org/XML/1998/namespace'; + }if(prefix !== 'xmlns'){ + a.uri = currentNSMap[prefix || ''] + + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} + } + } + } + var nsp = tagName.indexOf(':'); + if(nsp>0){ + prefix = el.prefix = tagName.slice(0,nsp); + localName = el.localName = tagName.slice(nsp+1); + }else{ + prefix = null;//important!! + localName = el.localName = tagName; + } + //no prefix element has default namespace + var ns = el.uri = currentNSMap[prefix || '']; + domBuilder.startElement(ns,localName,tagName,el); + //endPrefixMapping and startPrefixMapping have not any help for dom builder + //localNSMap = null + if(el.closed){ + domBuilder.endElement(ns,localName,tagName); + if(localNSMap){ + for(prefix in localNSMap){ + domBuilder.endPrefixMapping(prefix) + } + } + }else{ + el.currentNSMap = currentNSMap; + el.localNSMap = localNSMap; + //parseStack.push(el); + return true; + } +} +function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){ + if(/^(?:script|textarea)$/i.test(tagName)){ + var elEndStart = source.indexOf('',elStartEnd); + var text = source.substring(elStartEnd+1,elEndStart); + if(/[&<]/.test(text)){ + if(/^script$/i.test(tagName)){ + //if(!/\]\]>/.test(text)){ + //lexHandler.startCDATA(); + domBuilder.characters(text,0,text.length); + //lexHandler.endCDATA(); + return elEndStart; + //} + }//}else{//text area + text = text.replace(/&#?\w+;/g,entityReplacer); + domBuilder.characters(text,0,text.length); + return elEndStart; + //} + + } + } + return elStartEnd+1; +} +function fixSelfClosed(source,elStartEnd,tagName,closeMap){ + //if(tagName in closeMap){ + var pos = closeMap[tagName]; + if(pos == null){ + //console.log(tagName) + pos = source.lastIndexOf('') + if(pos',start+4); + //append comment source.substring(4,end)//